v3.17.0
What's new
Changelog
[Unreleased]
[3.17.0] - 2026-10-14
Fixed
- Coloured text is readable on the Light skin. Grades, scores, comparisons, the boss star, key levels and the history footer's figures were all tuned for the Dark skin and nearly vanished on the Light one; the footer's figures were white. Each now has a darker tone for the Light skin. The grey used for "--" and the HUD's separators is lighter on Dark, where it was hard to read. Tooltips, chat and the score splash, which are dark whatever the skin, keep the bright colours. The key-level purple is a little lighter, for the same reason.
- "Not scored" pulls are no longer deleted at every login. A pull too
thin to judge is kept with no score rather than a made-up 0, but the
start-up clean-up treated any pull without a number as unreadable, so each
one vanished at the next login or
/reload, insights and all. They now stay in your history. Only entries that really can't be read are dropped. /tc resetasks before deleting your history. It wiped every recorded pull and run summary at once, while the two Clear History buttons that do the same thing both ask first. It now shows the same question. The command is/tc clearhistory, and/tc resetasks too.- The minimap tooltip no longer errors after a "not scored" pull. Hovering the icon raised a Lua error; it now says the last pull was not scored.
/tc scoresays "not scored" for a pull too thin to judge, instead of printing it as a score of 0.- The report card remembers where you put it. It could be dragged, but it went back to the top of the screen for the next pull. Where you drop it is now saved, and Pull Report has a "Reset card position" button.
- The alert anchor shows its sample alert every time you move it, not only the first time in a session.
- Vengeance: Soul Fragments say when the game hides them. Where the game keeps auras secret, as it can in keys and raids, the Soul Fragments bar sat empty with no text, which read as none. It now says "hidden". Where the aura can be read, it counts them as before.
Added
- Score colours for colour vision. Grades, comparisons with your median and the stagger bar can now run blue to orange instead of green to red, for the one player in twelve who cannot tell red from green. Options, General, Score colours: Auto (the default) picks blue and orange when the game's own colourblind mode is on, and Classic keeps the greens. The stagger bar's moderate and heavy zones now carry an M and an H, so they read without colour at all.
- Your runs in the history panel. A Runs tab lists every finished
dungeon, key, raid and delve you have a summary for, with its score,
pulls, bosses (wipes in red), deaths and length. Only the last summary
could be reached before, with
/tc run. Click a run for its summary. - A run's shape. A run summary, on its card and in the history, now has a strip with one block per pull in the order you fought them, each in its grade's colour, grey for a pull too easy to judge, with bosses marked in gold (red for a wipe). Hover a block for the pull; click it for its card.
- Pull details inside the history panel. Clicking a pull in the history used to open its report card as a separate window at the top of the screen. It now shows the same breakdown in a pane beside the list -- score, stats, component bars and insights -- with "Open card" for the full card and an X to close it.
- A trend in the history panel. The last 30 scored pulls in the list, a bar each, oldest on the left, each as tall as its score and in its grade's colour, so you can see at a glance whether you are improving. It follows the filter.
- The report card shows what each insight is about. Every insight on the
full card is now tagged with the score it explains (Mitigation, Cooldowns,
and so on), and that row's name lights up in the same gold, so "Shield Wall
was not used" points at the Cooldowns bar. Pulls you play from now on are
tagged. Older ones are tagged when your history is next re-scored, with
/tc rescore applyor after an update that changes scoring. - A Details button on the compact card. Clicking the card to open it out, and right-clicking to dismiss it, were only explained in a tooltip.
- One way to move everything. "Move frames" on the HUD, Alerts and Pull
Report tabs,
/tc unlockand the game's Edit Mode now all unlock the HUD, the alert anchor, the score splash and the report card together, with a Done bar at the top of the screen (Escape works too). They replace the HUD's Lock tickbox, the alerts' Unlock and Lock buttons and the splash's Move it and Lock it. Edit Mode used to reach only the HUD. Pressed in the options, the options window steps aside while you move things and comes back when you click Done. - HUD layouts: Focus, Standard and Everything. One choice under Options, HUD, Layout sets how much the HUD shows. Focus is your mitigation, health, spec bar and major defensives; Standard adds your resource, every defensive, taunt, kick and stops, and procs; Everything adds offensives, spells for the group and movement. Every part keeps its own toggle, now including minor defensives, spells for the group, movement and procs. Your HUD does not change: an existing profile stays on Everything, which is the layout it already has. New installs start on Standard.
Changed
- A sound for each kind of alert. One switch covered every sound, and only tank hits and heavy stagger could make one. Each kind now picks none, the raid warning or the alarm beside its tickbox, and choosing one plays it. The defaults are the sounds each always made.
- "Major defensive ready" starts off for a new profile. Its icon on the HUD already shows it, and in a key it is one more voice mid-pull. Existing profiles keep their setting.
- The minimap tooltip says what its numbers are of. "Average (this spec)" is now "Average, last 50 Protection Warrior pulls", with the real count, and the session's avoidable damage is also a share of the damage you took.
- A card that was not scored shows an em dash, with "not scored" small under it, where "not scored" at the score's size could run into the column beside it.
- One brand colour. The chat prefix, the minimap tooltip and messages through DBM said "TankCompanion" in three greens beside the windows' blue; all of them use that blue now.
- History: filter with a click. Chips under the toolbar narrow the list to keys, dungeons, raids or delves, to a spec, or to bosses; lit chips in one group are either-or, and the groups combine. The search box stays for names.
- History: one marker, one meaning. A "*" meant a boss in the Where column and an untested pull in the score. A boss now has the game's skull; an untested pull is simply grey; and the hint under the list says which is which.
- History: Clear History is under More, with a way to the history's options. It sat in the footer beside Last report, and it still asks first.
- History: a short hover. A row's tooltip carried every stat, the meter, the deaths and every insight. It is now the score and the five components; click for the pane, which lists the rest under More figures.
- WoW Forever: the HUD says why it is idle. Ten seconds out of Defensive Stance or Bear Form between pulls, or a Paladin without Righteous Fury, and the whole HUD disappeared with no reason given. In a dungeon or raid, out of combat, it is now one dimmed line: "Not in Defensive Stance: TankCompanion is idle", or "Righteous Fury is off". Not shown when the group has you as damage or a healer.
- Icon rows share out evenly. A row that wraps splits into even lines: eleven where seven fit are 6 + 5, not 7 + 4, and never one left alone.
- A row for the group. Blessing of Protection, Sacrifice and Spellwarding sat among Ardent Defender and Guardian of Ancient Kings; what you press for others now has its own row, with Anti-Magic Zone, Darkness, and the Externals layout's Freedom, Soothe and Rebirth. Standard keeps the blessings and Focus leaves them out, as before.
- Word of Glory and Hammer of Light no longer look ready all fight. A spell with no cooldown is muted, and lit only when the game lights it (Shining Light).
- Procs pack left. A lone second proc showed after an empty slot; the ones up now sit from the left in the kit's order.
- Glows are round. The game's activation glow on a cooldown icon was a square action-button border over a rounded icon; it is now a gold halo in the icon's own shape.
- The docked stack has one outline while you move it, with a line saying that the top panel moves them all and any other pulls out.
- Ironfur reads as depth. Guardian's Ironfur bar is six segments, one a stack, with a line at two: the depth the score and the big-hit alert treat as a full answer. It showed only the time left.
- Celestial Brew is drawn once. It was a bar and a defensive icon; now it is the icon, with the absorb's time left along its foot. Fortifying Brew, Fiery Brand and Metamorphosis show theirs the same way.
- Blood's "Death Strike" bar is gone. It showed the Blood Shield, empty most of a fight, under the button's name; the shield is already the health bar's absorb overlay. Runic Power now has a line at Death Strike's cost, read from the game.
- A covering defensive fills Demon Spikes' bar. With Metamorphosis or Fiery Brand up, the bar stayed empty and only its text changed, which read as a lapse. It now fills with that defensive's time left, under its icon, as "Metamorphosis (covering)".
- Estimates are striped, not "(est)". A bar timed from your casts because the game is hiding the buff has a striped fill, and hovering says why. Forever's Shield Block and Holy Shield say they run "up to" their time.
- Stagger says "13.5k per tick". "tick 13.5k" was never explained; the tooltip now says what a tick is.
- Consecration is a pill. Protection Paladin's Consecration took a whole bar to say in or out, with "NOT in Consecration" in capitals; it is now a half-width pill with its icon and timer, which greys when you step out.
- Add a defensive by name. Spells took extra defensives as a comma-separated list of spell IDs, looked up outside the game. Type a spell's or a trinket's name, an ID, or shift-click a spell or an item into the box: its icon and name show before you press Add, and the ones you added are listed with a Remove button.
- Weights show their share. Each component weight says what part of the total it is -- Mitigation (35%) -- and the shares move as you change any of them.
- Grade thresholds stay in order. Set A above the S line and A could never be reached. A threshold now stops a point short of its neighbour.
- Clearing the history asks in the addon's own window, sized by the window scale, instead of the game's stock popup. The options window keeps its own.
- One window scale. General's Panel Scale reached only the pull history; as Window scale it now sizes the report card and the copy window too. The card stays where you put it at any scale. The HUD keeps its own scale, and the alerts and the splash their text sizes.
- General is grouped: Look, What gets scored, then Troubleshooting. Debug Mode was the second control on the tab, beside the minimap icon; it is now at the bottom with diagnostics, status and the error log.
- "DBM timer bridge" is "Incoming tank hits". The group held the game's encounter timeline too, which on its own can't pick out a tank buster in a boss fight. The timeline is now "Also watch the game's encounter timeline" and says it supplements DBM; with DBM missing, the group says most tank hits will go unannounced. The alerts' font size and time on screen are in a Look group of their own.
- "Which pulls report" has its own heading. The minimum pull length and "Always show after boss encounters" sat under the card, but they decide the splash and the chat line too. Each now says what it does, and the minimum length says how it differs from General's.
- Help in a proper window, in your language.
/tc helpwas a narrow popup of hard-coded English, and it left out/tc spells. It now opens in a window with every command, one translatable line each, so translators can reach it. The README lists/tc verifytoo. - A mistyped command says what you probably meant. "Unknown command"
was a dead end;
/tc repnow suggests/tc report, and/tc reprotthe same. - The copy window says Cmd+C on a Mac.
- HUD labels in your language. The resource bar (Rage, Runic Power, Fury...) now uses the game's own word for it, and bars named after a buff -- Bone Shield, Ironfur, Soul Fragments, Consecration, and Shuffle, which has no spell of its own -- use the client's spell name. They came from the English spec files.
- Seven options tabs. The Score Panel tab is now a History section under Scores, together with the two history settings that were in General (how many pulls to keep, and this character only), and Pull Report is Report. Eight tabs were likely to wrap onto a second row once translated.
/tc verifylines up in any font. Each ability is one line with its figures labelled (cd, dur, charges), where its columns were padded with spaces that the window's font never lined up.- One way to write numbers and times. Sizes are three figures with no trailing zeros everywhere -- 640k, 512k, 12.3k, 1.25M -- where they were 640.0k beside 1.25M. Durations are minutes and seconds at every length, 0:48 beside 1:12, where under a minute they read 48.3s.
- History dates read as dates. The Time column says "Today 21:42", "Yesterday 21:42" or "Oct 12 21:42" instead of "10-14 21:42".
- History totals are no longer cut off. The count, averages, best and medians sat on one line in the footer beside the buttons, and ran out of room at the default width. They now have a strip of their own above the list.
- Health reads the same in combat. The HUD's health text showed "512.3k / 640.0k 64%" out of combat and a raw 412538 in combat. In combat it now uses the game's own number shortening to keep the same format, and says nothing rather than show a raw number where the client will not shorten it.
- Your absorb sits on top of your health. It filled from the left edge of the bar, a pale band inside the green. It now starts where your health ends and runs right, so it reads as the shield it is; and a thin line along the top of the bar shows its size, so it is still there at full health.
- The report card's facts are labelled. Length, hits unmitigated, pressure and damage taken now sit in four named spots instead of one long grey line. Pressure reads Low, Moderate or High; hover it for the figures.
- Clearer component rows on the card. Each score sits beside its bar instead of on the coloured fill, where it was hard to read on a full bar. The comparison with your usual result has one "vs median" header instead of "vs you" on every row.
- Pull Report: two simple choices per kind of content. Each of keys, dungeons, raids, delves and anywhere else had one list of six options that mixed "after each fight" with "at the end". Each now has a choice of what comes after each fight (the card, the score splash or nothing) and a tickbox for the summary at the end of the run. Your settings carry over exactly.
- The history panel's totals are of what it lists. "Pulls" counted the filtered list, but the average, best and component averages beside it were your current spec's last 50 pulls whatever the filter showed. They are now all worked out from the pulls listed, and the footer says "Listed" and how many of them were scored. Each component now shows its median, the figure the report card compares a pull against.
- History columns explain themselves. The five component scores sit under a "Components" header; the count of defensives pressed is now "Def. used" and the share of avoidable damage "Avoidable", so neither passes for the "CDs" or "Avoid" score; and every header has a tooltip saying what it measures.
- All four insights show on the card. It showed three; the fourth was only in the history tooltip.
- The report card opens beside the HUD. It hung from the top of the screen, over the spot where alerts appear. It now sits to the right of the HUD and grows upwards when you open it out, clear of the action bars.
- A better default spot for the HUD, for new installs. The HUD now hangs from its top edge a little below the middle of the screen, so even the tallest kits clear the action bars at UI scale 1, where Blood, Protection Paladin and Guardian used to run past the bottom of the screen. A HUD you have never moved stays exactly where it has been; one you moved stays where you put it. "Reset Position" uses the new spot.
- Tank-buster warnings count down. "Crushing Slam in 4s" now says 3s, 2s, 1s as the hit gets closer, with a bar draining under it, and "now" when it lands. It used to stand still for five seconds, and said 4s even for a hit announced with two seconds to go.
- Alerts show what to press. A tank-hit warning shows the icon of the best defensive that will be ready (or Ironfur, when the advice is to stack it), a lapse alert the mitigation that dropped, heavy stagger Purifying Brew, and a "ready" alert the cooldown that came back. Alert types used to differ by colour alone.
- Charges on the bar. Shield Block's two charges, and Demon Spikes' with its talent, now show as pips at the end of the mitigation bar: full is a charge ready, part-filled is the one recharging. Before, they appeared nowhere on the HUD. Purifying Brew's charges sit at the end of the stagger bar they answer.
- A tidier status line. The pull clock reads 0:48 rather than ticking tenths and switching to 1:12 at the minute, and the spec name is gone during a pull (the panel's accent colour already says it), so the coverage and hit count at the end no longer get cut off.
- Ready is the quiet state. A cooldown icon that is ready is simply in full colour; waiting is dimmed with the sweep. The green ring on every ready icon is gone, and with it the ring that covered a major cooldown's gold edge.
- WoW Forever: Demoralizing Shout and Roar get a timer. As debuffs on the enemy they had no buff to read, so they were always-ready icons. They are now bars timed from your casts, and the bear's Demoralizing Roar, the mitigation its score is built on, is its main bar with the lapse warning.
- Blood's runes no longer all dim when the game hides whether they are ready; the cooldown sweep still shows each one.
- Alerts no longer overwrite a more important one. Every alert used to replace the one on screen, so a "Shield Block is down" or "Shield Wall is ready" alert could wipe a tank-buster warning in the middle of its countdown. Alerts now have an order: tank hit, death review, heavy stagger, mitigation down, defensive ready. A less important alert waits on a smaller second line under the main one, an alert pushed off the main lines finishes its time there, and when the main alert ends the second one moves up. Only the alert on the main lines plays a sound.
- A lapse reads as down. When your active mitigation drops in combat, its HUD bar now turns red along its whole length, DOWN sits in a white chip, and the bar pulses once as it drops. Before, the bar emptied and only a small white DOWN at the far end said so. A reactive mitigation, like Guardian's Ironfur, still never shows as down.
- Pull Report starts with "Show it on screen". The switch for whether any card or splash opens now sits at the top of the tab, above the choices for each kind of content, instead of below them.
- "Reset scoring to defaults" asks first, as "Re-score now" already did. It puts back the weights, the grade thresholds and the avoidable and death settings all at once.
- The splash's colour picker greys out while "Colour it by grade" is on, since the grade's colour is used instead.
- One colour per grade, everywhere. A score now always takes the colour of the grade it earns: the number, the grade chip and the component bars on the card, the history panel and the HUD's coverage figure. The chip, bars and history used a fixed scale of their own, so an 84 showed an A's green number in a B's yellow-green chip. They also follow your own grade thresholds now, as the number already did.
- The history panel shows "84 A" in one Score column. Score and Grade were two columns in two different colours; the grade now sits beside its score.
- One bar per buff on the HUD. Blood showed Bone Shield twice, Guardian Ironfur and Protection Paladin Consecration: a spec bar and a mitigation bar for the same buff, one under the other. Each now gets one bar: the mitigation bar for Bone Shield and Ironfur (time left, stacks and the lapse warning) and the Consecration bar with its timer. Switch that bar off and the other comes back. The HUD is a row or a panel shorter for all three.
- Protection Warrior loses the "Ignore Pain" bar that wasn't. It showed every absorb on you, a priest's shield included. Ignore Pain keeps its own timer bar, and every absorb still shows on the health bar.
- Guardian: Frenzied Regeneration shows its charges. It was a 3-second buff bar, empty most of the fight, and its two charges appeared nowhere. It is now an icon in the defensive row with its charge count.
- HUD panels can be dragged out of the stack. "Dock Panels Together" says to drag a panel away to undock it, but while docked only the top panel had a handle. Unlocked, every panel now shows its handle: the top one moves the whole stack, any other drags that panel out on its own, and the rest stay chained together.
- Alerts stay readable on the Light skin. Their backing turned pale with the skin while their yellow, orange and white text stayed the same. The backing is now dark on both skins, since alerts sit over the game world rather than over a window.
[3.16.1] - 2026-10-13
Changed
- Up to date for patch 12.1.5. The addon is marked for 12.1.5 (interface 120105), so the game no longer lists it as out of date after today's patch. 12.1.0 stays listed for regions that patch a day later, and WoW Forever is unchanged at 1.60.1. Nothing in 12.1.5's addon changes affects TankCompanion, so this release changes nothing else.
[3.16.0] - 2026-10-13
Added
- Score splash. A quick alternative to the report card: after a fight, the
grade appears big in the upper middle of the screen with the score under it,
for two seconds, then fades. Text only, white with a black outline, nothing to
click and no sound. Pick it for any kind of content under Pull Report, in the
same list as the card: "Splash after each fight, and at the end" or "Only a
splash after each fight". It follows the card's rules: never in the middle of
a fight, gone the moment you pull again, a boss's waits until the fight is
over, and a pull too easy to judge gets none. Its colour (or colour by
grade), outline, size and time on screen can be changed, with a Preview
button, and it can be moved with "Move it" or
/tc unlock. Nothing changes until you pick it.
Changed
- Pull Report's choices now say "card" where they mean the card, now that there is a splash to choose instead, and "Pop up a card" is "Show it on screen": turning it off turns off the splash as well as the card.
[3.15.0] - 2026-10-13
Added
- TankCompanion can be translated on CurseForge. Each release now sends its English text to CurseForge's translation system and includes every translation made there so far, in German, Spanish (Spain and Latin America), French, Italian, Korean, Brazilian Portuguese, Russian and Chinese (Simplified and Traditional). Anything not yet translated stays in English. A translated line whose number or name placeholders don't match the English is shown in English instead, so a typo in a translation can't cause an error.
[3.14.0] - 2026-10-13
Fixed
- Tank-buster warnings on every language's client. A tank buster was recognised only by English words ("smash", "crush"...) in DBM's timer text, which DBM translates, so on a German, French or any other non-English client the warning practically never came. The addon now takes DBM's own word for it: a cooldown or cast timer DBM marks as role-specific and that is switched on for you, which DBM does by default only for the role it is for. English clients gain the tank timers whose names hold none of the keywords. Your keyword and spell-ID lists still add to it.
- Russian, Korean and Chinese clients can read the HUD and alerts. All text was drawn in a Latin-only font, so spell names (which the game already translates) and every other line came out blank. The HUD and alerts now use the game's own font for your client's language, unless you have set one.
- The encounter-timeline option no longer claims to give tank-buster warnings without a boss mod. Blizzard keeps which ability an encounter's timeline entry is secret during the fight, so it cannot; DBM is still needed for them.
[3.13.0] - 2026-10-12
Changed
- Your stored pulls are re-scored automatically after a scoring update.
When an update changes how pulls are scored, older pulls used to drop out
of your averages until you ran
/tc rescore applyyourself. Now the next login does it: after combat, every stored pull that kept its measurements is re-run under the new model, and one line in chat says how many moved. The score each pull showed at the time is still kept. Options > Scoring > Re-score your history turns this off, and switching it back on catches up straight away.
[3.12.0] - 2026-10-12
Your scores will change with this release. Scoring model version 8 stops
counting a defensive's second charge as a use you owed, so pulls scored before
it are not averaged with new ones. /tc rescore shows what the new model makes
of them before anything is written.
Changed
- A second charge kept in reserve is no longer a missed use. The Cooldowns score expected one use per cooldown plus one more for every extra charge, so only spending every charge got full marks. The guides play a two-charge defensive the other way: press it whenever it is about to cap, and keep the second for the next big hit ("Use Fiery Brand if you are about to reach 2 charges"). Played like that, it was asked for one press too many at every pull length. Now one use per cooldown is full marks, and spending the reserve as well scores the same. Affects Fiery Brand with Down in Flames and Protection Paladin's Holy Bulwark.
Fixed
- Vengeance: Fiery Brand with Down in Flames is two charges on a 48-second cooldown. Every recommended build takes the talent, but the addon knew only the base single charge on 60 seconds: after one Fiery Brand it called the second unavailable, and the Cooldowns score expected fewer of them than you had. Demon Spikes with Demonic Resilience likewise has its second charge. Talents are read when your spec loads or your talents change. Each pull now records the talents it was fought with, so a rescore judges it the same way; pulls from before this change keep the base values they were scored on.
[3.11.0] - 2026-10-12
Your scores will change with this release. Scoring model version 7 judges
each tank's active mitigation the way that spec actually plays it, so pulls
scored before it are not averaged with new ones. /tc rescore shows what the
new model makes of them before anything is written. The reasoning and sources
are in docs/mitigation-audit.md.
Changed
- Guardian's Ironfur is no longer judged as something to keep up all the
time. Every Ironfur is rage taken from Maul and Raze, and the guides keep
one stack up while heavy melee is landing, stack two or three before a big
hit, and spend the rest. It was graded like Shuffle or Bone Shield, 85% of
physical hits, and nagged that way: an "Ironfur is down" alert, a red DOWN
on the HUD and a red count of hits taken without it. Now:
- no "is down" alert, no red DOWN and no hit count for Ironfur;
- 70% of physical hits is full marks, and the report talks about keeping one up under heavy melee instead of saying "Keep it up";
- a telegraphed hit (from DBM or the game's encounter timeline) that only Ironfur was up for is judged on depth: two stacks, or any cooldown, is an answer, and one stack is half of one;
- the big-hit warning says "Stack Ironfur (1 up)" when fewer than two stacks will still be running as the hit lands.
- Vengeance's coverage counts Metamorphosis and Fiery Brand as well as Demon Spikes: the rotation the spec plays so that something is always up. Hits taken under either no longer count as unmitigated, "Demon Spikes is down" is not said in the middle of Metamorphosis, and the HUD names whichever one is covering. With the wider net the target is 90%, the bar the other upkeep specs are held to.
- Metamorphosis and Dancing Rune Weapon are expected on cooldown. Judged by their cooldown length they were saves, asked for only against telegraphed hits; the guides press both as often as possible. On a pull that threatened you, holding them for later now costs.
- The "is down" alert and the longest gap leave out a pull's opening, as the score always has. No more "Shield Block is down" four seconds in, before there was rage to press it with.
- Heals and absorbs you press when you need them (Frenzied Regeneration, Celestial Brew, Death Strike's shield) no longer read DOWN on the HUD all fight. Only a mitigation you are meant to keep up does.
- The status line colours coverage against your spec's own target, with the opening left out, instead of on one scale for every spec.
- Older pulls rescore as far as what they recorded allows: Ironfur's depth at a big hit was never saved, so older Guardian pulls are rescored on the new coverage target only, and Vengeance's wider coverage only applies to pulls recorded from now on.
Added
TankCompanionAPI.GetState()reportsamStyle,"maintain"or"reactive": whether the primary mitigation being down is a lapse.
Fixed
- Brewmaster: a Purifying Brew pressed in combat is judged again. Each
purify was graded on the stagger pool at the moment of the cast, and in
combat the pool is hidden, so in real pulls none of them were graded and
each counted as a zero: pressing Purify scored worse than never pressing
it. A purify is now judged on the stagger level seen just before it (the
Light, Moderate or Heavy Stagger debuff when the pool is hidden), not on
the pool the purify has already halved. If no level could be read for any
of a pull's purifies, purify quality is left out instead of scored as 0.
Older Brewmaster pulls with purifies will rise on
/tc rescore. - Fiery Brand is modelled as lasting 12 seconds, its duration since 12.0.0, not 10, so the last two seconds of each one now count as covering you.
[3.10.0] - 2026-10-04
Added
- WoW Forever support. The same download now loads on WoW Forever
(interface 16001) as well as Midnight, and CurseForge gets it for both.
Forever runs Midnight's client and addon rules, so the HUD, alerts, damage
meter, DBM bridge and scoring all work there. What differs is handled:
- There are no specializations. A Warrior in Defensive Stance, a Druid in Bear or Dire Bear Form, a Paladin under Righteous Fury, or anyone the group has given the tank role, gets that class's tank kit. Options > General can load it for every Warrior, Paladin and Druid instead.
- Leaving the stance or form mid-fight never drops the pull or the HUD. The kit unloads only after ten seconds out of it once the fight is over, and taking the stance up mid-fight starts the pull there.
- Spells come in ranks, each its own spell ID. The highest rank you know is tracked, and a cast of any rank counts as it.
- Three kits from the spells Forever keeps from vanilla. Warrior: Shield Block, Demoralizing Shout, Shield Wall, Last Stand. Paladin: Holy Shield, Consecration, Divine Protection, Divine Shield, Lay on Hands, Judgement as the Seal of Fury taunt. Bear: Demoralizing Roar, Frenzied Regeneration, Barkskin. Abilities new to Forever are left out until their spell IDs are confirmed in game; Options > Tracked Spells adds them.
/tc diagsays what it sees on Forever: class, form, role, and why the kit is or is not loaded.
Fixed
- A defensive tracked under one of its alternative IDs counted every use
twice in the Cooldowns component: Berserk standing in for Incarnation, or
Guardian of Ancient Kings under its other ID. Pulls scored before this
change keep their score until
/tc rescore apply. - Switching off a spell that is tracked under an alternative ID now holds. The toggle was saved under one ID and checked under the other.
- A spec with no primary active mitigation no longer scores Mitigation as perfect. It never measured coverage, so the component is left out.
Changed
- CI and the release workflow use
actions/checkout@v7, which runs on Node.js 24. v4 ran on Node.js 20, which GitHub is retiring from its runners; the 3.9.0 release run already warned about it.
[3.9.0] - 2026-10-02
Added
- A summary of the whole run when a dungeon, Mythic+ key, raid or delve is
over. Every pull fought in it is added up into one score: the pulls'
average weighted by how long each was fought, so a three-minute boss counts
for more than a twenty-second pack, leaving out pulls the scorer would not
stand behind, as your averages do. The card gives the five components across
the run, pulls, bosses killed, wipes and deaths, your best and worst pull,
your weakest area, and the note from the worst pull. For a key it also gives
the game's own result: timed or not, the upgrade, the time against the limit,
the group's deaths and your rating before and after.
The end is the game's own word wherever there is one. A dungeon's boss list
in the objective tracker is a scenario, and the summary follows the
SCENARIO_COMPLETEDthat turns it to "Dungeon Complete"; delves are scenarios too; a key ends withCHALLENGE_MODE_COMPLETED. A raid ends when its lockout shows every boss dead, or when you leave it: out of the instance and out of the raid group, or out of the instance for ten minutes -- longer than a corpse run or a repair, which come back to the same night. The summary waits out Blizzard's own completion banner, the end of the fight and the last pull's score, then opens in place of that pull's card, full size, until you close it or pull again. A reload or a disconnect mid-run picks the run back up; walking out of an unfinished dungeon or delve abandons it./tc run, or Pull Report — Last run summary, brings the last one back. Clearing the history clears these with it. - Each kind of content chooses what it reports. Pull Report has a choice each for Mythic+ keys, dungeons, raids, delves and anywhere else: after each fight and at the end, only at the end, only after each fight, or nothing. A key reports only at the end by default -- it is one long fight against a timer, and a card after every pack is the interruption the summary exists to replace. Dungeons, raids and delves report both; anywhere else, after each fight. Below the choices: whether to pop up a card at all, and whether to print a line in chat, which now follows the same choices.
- Delves have a setting of their own, as the open world does: General —
Score delves, Always, solo too (the default), Only with other players, or
Never. A delve companion is not company: the game marks it as AI, and only
other players count.
/tc statussays why a delve pull is not being scored.
Changed
- Delves are measured against delves. A delve is small packs, a companion
healing you or nobody, and you doing the damage too. Compared with your
dungeons, a run of delves moved the "vs you" numbers and the averages with
nothing about your dungeon play having changed. A delve pull's "vs you" is
now the median of your delves, your dungeon and raid average leaves delves
out, and the history panel shows a delve average beside it.
TankCompanionAPI.GetSummarytakes a third argument for this:"group"(the default),"delve"or"all". Pulls from before this change are placed by their instance type; a scenario then was almost always a delve.
Changed
- The report card no longer opens in the middle of the next pull. A pull
is scored once the damage meter can be read, up to seven seconds after combat
drops, and the card opened the moment the score landed. On a chained pull
that was a few seconds into the next fight, and trash that rolled into a boss
put the trash card across the top of the screen a second into the boss, where
it stayed for twelve seconds: nothing closed it but its own timer. The card
now only ever opens between pulls, and pulling again closes it. A card that
comes due mid-fight is skipped, since the history has it, except a boss's,
which waits for the fight to end so that adds outliving the boss cannot
swallow it. Trash never pushes a boss card off the screen. A card you open
yourself (
/tc report, a history row) is untouched by any of this and stays until you close it. - The card that opens by itself is now compact: where, the score and grade, and the one insight most worth acting on. That is about a third of the full card's height, and the full card is over a third of the screen at a UI scale of 1. Click the card for the full breakdown in place; once opened out it no longer times out, but still goes when you pull. Right-click dismisses it, and hovering it says how to change it. Options — Pull Report — Compact card brings back the full card every time.
Fixed
- The chat summary only printed when the card was shown, so turning the card off silenced it as well, and a line in chat instead of a card could not be had. It now follows its own tickbox. The Pull Report options that only affect the card grey out while the card is off.
- The chat summary announced a pull that was too thinly measured to score as "Pull scored 0", which reads as the worst possible result.
[3.8.0] - 2026-09-21
Added
- A scoring fixture,
scripts/scoring_bench.lua. Synthetic pulls run through the real scoring model with every component value locked, so a change to the model cannot move a score silently. The locked values record what the model does today, defects included, each tagged with the review finding it pins — so a fix fails the bench at exactly the scenario it was meant to change. Runs in CI and before a release. /tc verify— prints every spell in the loaded spec's active-mitigation and defensive lists with what the spec file claims about it next to what the client actually reports: whether the spell exists, whether this character has learned it, and its real cooldown, aura duration and charge count. Disagreements are highlighted. Those hand-maintained numbers decide whether a hit counts as covered and whether an ability is modelled as available, and getting one wrong is silent — the score simply moves. Run it out of combat, after using the abilities once: charge counts answer immediately, but a cooldown only reports its length while it is running and an aura only reports its base duration while it is up, so anything unobserved reads--rather than being guessed at.
Fixed
- The secret-value guard performed the very comparison it existed to avoid.
API.IsSecrettestedv ~= nilbefore askingissecretvalue, and an equality comparison against a secret raises a Lua error. Every guard in the addon is built on this one function, so it could fail in exactly the contexts it was written for. The nil test is gone;issecretvalueaccepts nil itself. - Aura stack counts, charge counts and the health/power readouts no longer
compare possibly-secret fields against
nil. For a number a truthiness test is identical in Lua, so nothing about the displayed values changes. - The secret-aura fallback drew the cooldown sweep a full duration ahead: it
passed an expiration time where
SetCooldownexpects a start time, so a 7s buff read 7-14s for its whole life and then counted down again after it had gone. It now usesSetCooldownFromExpirationTime, which takes exactly those two values and accepts secret ones. C_UnitAuras.GetPlayerAuraBySpellIDcan return a secret container, not just secret fields, and the result was handed to callers that index it. It is now refused, as the encounter-timeline structs already were.- The minimap icon came back hidden after every login. A migration read a
legacy saved variable that nothing clears, so it re-applied "hide" on every
session forever; re-enabling the icon in the options could not survive a
/reload. The legacy value is now cleared once it has been read. - Missing locale keys no longer put a Lua error on screen, and the addon's
ns.L[key] or fallbackdefaults work again. AceLocale was registered non-silently, which made every such fallback dead code, because a missing key came back as the key itself rather than nil. - The error handler is installed before saved variables are migrated, so an error thrown while repairing a corrupt profile is actually caught.
- One throwing message listener no longer silently drops every listener registered after it.
- "Active mitigation" is translatable instead of being an English literal substituted into a localised sentence.
Changed
- A pull is no longer scored when too little of it could be measured. Each of the five components now declares how much evidence it actually had, rather than counting for its full weight or not at all, and the pull reports how much of the model it could speak for. Below half, it is not scored: the notes still appear, the number does not, and it never enters your averages. The old behaviour was to drop whatever could not be seen and rescale the rest, which quietly asserts you were as good at the invisible parts as at the visible ones — and flattered hardest exactly where it was least justified. A raid pull where every hit was magic, the damage meter said nothing and you pressed nothing used to come back 100, grade S.
- Where a pull is scored, the number is now weighted by that evidence: a per-minute figure read off ten seconds, or mitigation measured across seconds nobody was hitting you, counts for less than the same figure off a full pull. A death always counts in full — it is proof the pull was a real test.
- A pull that spans a respec is scored against the build you actually had. An encounter holds a pull open for up to ninety seconds after combat drops, so a spec change can land while one is still running. When that happened the scorer lost track of which defensives the character had and fell back to the raw spec list — charging you for not pressing abilities you had never learned or had switched off in Options, and writing that list into the saved pull, so every later rescore repeated it. Each pull now records its own build when it starts.
- Long defensive cooldowns are no longer demanded on short pulls. Whether a
defensive is judged on how often you pressed it, or on whether it covered a
telegraphed tank hit, is now derived from its cooldown rather than read from a
hand-written tag on each spell. The tags were incomplete and could not track
the data, so any long cooldown nobody had tagged was expected at least once on
every pull however short it was: a Blood death knight who correctly banked
Icebound Fortitude and Dancing Rune Weapon for the boss was marked down on the
trash pack for it, and a Brewmaster was asked for a 300-second Zen Meditation
on a 60-second pack. A spec file can still set the behaviour explicitly, which
is what Guardian's Incarnation now does — it is a damage cooldown as much as a
defensive one. Scores from before this change are kept and stop being averaged
against new ones;
/tc rescorebrings them forward. - The HUD's cooldown sweep no longer runs twice in the same frame twice a second. It is the addon's most expensive pass, and both branches that triggered it could fire on the same tick with nothing in between that could change the result.
/tc diagno longer leaks two permanent frames per run, and it now also reports whetherSetCooldownFromExpirationTimeexists.- CI checks the things that actually break a release: that a
## [Unreleased]section exists, that the TOC version matches the newest changelog entry, and that## Interface:is well formed. scripts/bump-version.shputs a fresh## [Unreleased]section back after stamping a release, so it can be run more than once.- Releases can only be dispatched from
main, and concurrent release runs queue instead of racing for the same tag. - luacheck is pinned to 1.2.0 in both workflows, so a new luacheck release cannot turn a green build red — or break a release — with no repo change.
[3.7.0] - 2026-09-14
Changed
- A new look. Every window and HUD panel is redrawn as a rounded, flat card
with a hairline edge: the history panel, the report card, the copyable
diagnostics window and the four HUD panels, plus the bars (rounded ends),
the cooldown icons (rounded corners, and a cooldown sweep shaped to match)
and the buttons, tickbox and filter box inside the windows. The Blizzard
tooltip border, gold-trimmed buttons and ornate close button are gone. WoW
cannot round a frame, so the corners are small alpha-shaped textures shipped
under
media/and generated byscripts/make_textures.lua. - The history panel has a proper title bar with the filter and the this-character tickbox on their own line beneath it. They used to share the title's line and ran into it once the panel was narrowed. Column headers show the sort direction as a chevron, and the footer picks its numbers out from their labels.
- The report card leads with where the pull happened, the score in large type with the grade in a chip beside it, and the pull's context in small print; the title tick takes the colour of the spec that ran the pull.
- Alerts sit on a soft rounded backing sized to the text, so they stay legible over a busy fight rather than relying on the outline alone.
Fixed
- The Light skin is now a light skin. It used to recolour the window and the title and nothing else, leaving every other line white on light grey. Both skins are complete sets of colours now — fills, edges, three text weights, control states, and the HUD's own palette — and switching reaches every window, the history rows, the copy window and the HUD. Options — General — Frame Skin.
- Version broadcasts are held while the encounter messaging lockdown is up and
sent once combat drops. A roster change mid-boss (a death, a battle rez)
used to fire straight into the closed channel. Closes the audit item in
docs/midnight-api.md. - Under Options — Alerts — DBM timer bridge, "Watch the game's own encounter timeline" and "Seconds of warning" shared a position, so their order was left to the library. Each control now has its own.
- The health bar's absorb overlay still used the old ridged bar texture and stood out against the flat bars around it.
[3.6.0] - 2026-09-14
Added
- Errors this addon throws are now kept and shown to you. Several features are deliberately written to do nothing rather than break when the client does not give them what they expect — which means a half-working install looks exactly like a working one, and all you can report is "it doesn't seem to do anything". Anything that does throw is now recorded and listed at the bottom of the diagnostics, ready to copy. You are told once per session if there is anything there, and there is a button under Options — General to clear it. Only this addon's own errors are kept, and it chains to BugSack, BugGrabber or Blizzard's error display rather than replacing them.
[3.5.1] - 2026-09-12
Added
- Diagnostics open in a window you can copy out of. WoW's chat frame cannot
be selected, so the output of
/tc diag— which exists to be pasted to someone who can do something with it — could be read and not much else. It now opens in a window with the text already selected: Ctrl+C and you have it. Colour codes and icons are stripped so what you paste is plain text. The button is under Options — General, and/tc diag chatstill prints to chat.
[3.5.0] - 2026-09-12
Added
- The history panel can show just the character you are playing. Your scores are shared across every tank on your account, which stays the default — the new tickbox beside the search box (also under Options — General) narrows the list to the character you are on. Nothing is deleted or hidden permanently.
- Each scored pull records which character ran it.
- Show the HUD is now a choice rather than a tickbox, and it has moved out of the middle of the slider grid: the HUD tab is split into When to show it and Size and appearance, so the visibility control is no longer wedged between Width and Icon size. The choices are Always, in dungeons and raids (and in combat anywhere), or only in combat. The middle one is the useful new option — between packs you are out of combat and still want to see what is off cooldown, but you want none of it standing in a city. Options — HUD. Whatever you pick, the HUD still appears while unlocked or in Edit Mode, so you can always place it. An existing "Hide out of combat" tick carries over.
- Things that were only reachable by typing a slash command are now buttons in the menu: Re-score your history (preview and apply, under Scoring, with a line saying how many pulls are being left out of your averages), Print diagnostics and Print status (under General).
Changed
- The options window remembers where you dragged it and how big you made it. It
was always movable — open it with
/tc options, the minimap icon or the addon compartment rather than through Blizzard's Settings panel, which cannot move because it is Blizzard's frame — but it went back to the middle of the screen every time.
Fixed
- Lowering the history limit now trims your history straight away. It was only applied after the next pull was scored, so the setting looked like it did nothing until you ran another dungeon.
Note
- Pulls recorded before this release have no character on them, so they cannot be claimed by any one character. With the filter on they are hidden along with your other tanks', and the panel's footer says how many, rather than letting your history appear to shrink for no reason.
[3.4.0] - 2026-09-11
Added
- Your scored pulls now keep the measurements they were scored from, so the scoring model can be re-run over them later. Before this, a pull was scored once and what it was scored from was thrown away, which is why 3.3.0 had to warn that your history would stop counting toward your averages: there was no way to ask the old pulls the new question. From here on there is.
/tc rescoreshows what the current model would make of your stored pulls — how many scores move, by how much, and the five that move most — without changing anything./tc rescore applywrites it, and keeps the score you originally saw on each pull so nothing is lost.- After a scoring change the addon now says, once, that some pulls are being left out of your averages and what to do about it, instead of quietly resetting your pull count to zero.
TankCompanionAPI.GetRescoreStatus()for addons and WeakAuras, plus anOnHistoryRescoredcallback. Reading only — rescoring stays something you choose to do.
Fixed
- A defensive recorded under a talent-swapped spell ID (Incarnation vs. Guardian of Ursoc, say) is now counted for the ability rather than being missed because the profile had resolved to the other ID.
- Instance and encounter names are checked before being saved. The client is allowed to hide them, and a hidden value written to your saved variables throws at logout rather than where it came from.
- Scoring a pull for a spec you are not currently in no longer scores it with an empty list of defensives.
[3.3.0] - 2026-09-11
Your scores will change with this release. The scoring model has been reworked and five measured defects fixed, so a pull scored under the new model is not directly comparable to one scored under the old. Your history is kept and still shown; the addon simply never averages the two together, and your personal baseline rebuilds from new pulls. Details under Changed.
Added
- Incoming tank hits no longer need DBM. The addon reads Blizzard's own encounter timeline as well, so the "big hit incoming, here is what is ready" warning works with no boss mod installed. With both, a hit reported by each is announced once.
- Edit Mode support. Opening Edit Mode unlocks the HUD panels so you can drag them alongside everything else you position there; closing it locks and saves. If you already had them unlocked, they stay unlocked.
- The HUD can attach itself to Blizzard's Cooldown Manager instead of floating somewhere of its own, so it sits where your eyes already are and follows the Cooldown Manager when you move that in Edit Mode. Options - HUD - Elements. Dragging the HUD turns the attachment back off, so it stays where you put it. (The Cooldown Manager's frame names could not be verified outside the game; if they are wrong on your client the option simply does nothing rather than erroring, and a report would be welcome.)
- The history has a filter box: type a dungeon, boss or spec to narrow it.
- The score history panel only builds the rows you can see. It used to create a frame per entry -- up to a thousand, each with a cell per column -- and lay all of them out every time it refreshed, for a list that shows about fifteen.
/tc diagnow reports the Cooldown Manager's real frame name and the encounter timeline's real event fields. Both are guessed in code because they could not be verified outside the game; run/tc diagduring a boss fight and it prints what the client actually returns.
Changed
- Scoring model version 4. Five defects were measured against the old model by driving the real scorer through the test harness, and four are now fixed. Your existing history keeps its scores; new pulls are scored by the new model and the two are never averaged together.
- The opening of a pull is no longer scored as failure. Every tank starts resource-starved -- Ironfur needs rage, Shield of the Righteous needs Holy Power, Shuffle needs Keg Smash -- so the first seconds are uncoverable however well you play. The scorer now measures that ramp from your first active-mitigation cast and leaves it out. Identical Guardian play used to score 82 on a 15-second pull and 100 on a 60-second one; it now scores 96 and 100.
- Coverage is counted over the hits that landed rather than the seconds that elapsed, so a quiet stretch mid-pull no longer inflates it. The addon was already recording this and only the insight text used it.
- Avoidable damage is measured as health bars eaten per minute instead of as a share of damage taken. As a share it moved with how well you mitigated: the same 300k of avoidable damage scored 0 if you had taken 1M overall and 88 if you had taken 10M, so mitigating better made this component worse. It is now the same score either way.
- Components fade in rather than switching on. Crossing 20 seconds used to flip the cooldown component in at zero and cost 15 points of final score for one extra second of pull; that discontinuity is gone.
- A pull that never threatened you is tagged as untested. It is still recorded and shown, with its grade greyed and marked, but it is kept out of your averages and your personal baseline so easy packs cannot lift the number you are trying to improve against. A pull you died on is never tagged this way, and neither is one where the damage meter did not report how hard you were actually hit -- whether it was missing entirely or reported nothing at all.
- Both the personal baseline and the history averages now only compare pulls scored by the same model version, and both skip untested pulls.
- Big defensives are judged on the hit, not the clock. Shield Wall, Survival Instincts, Ardent Defender, Guardian of Ancient Kings, Vampiric Blood and Fortifying Brew are saved for a specific incoming hit, so scoring them by how many times their cooldown came up just nagged you for not pressing them on a trash pack. They now leave the opportunity count entirely and are scored on whether anything was up when a telegraphed hit actually landed -- and on a pull where nothing was telegraphed they are not scored at all, because the pull offered no evidence either way.
Fixed
- Clearing the score history now asks first, and its button no longer sits under the panel's resize grabber. It deletes every recorded pull and cannot be undone.
- A pull is scored with its own damage meter. The read is deferred a few seconds after combat ends, and it used to fetch whichever fight was current by then -- so a pull followed quickly by another (a patrol, a straggler, trash pulling the boss) was scored with the wrong fight's damage, or lost its meter entirely.
- Running DBM alongside the encounter timeline no longer halves your cooldown score. Both bridges announced the same boss ability, and while the warning was shown once, the scoring record counted it twice -- so one answered hit was logged as one covered and one ignored.
- A boss timer that gets refreshed and then stopped no longer leaves a phantom hit behind, and an ability announced with only a second's warning is recorded when it lands rather than several seconds later.
avoidableZeroAtchanged units with the new avoidable formula; an existing setting in the old range is reset once so the component does not silently become about twice as harsh. The reset is stamped, so a strict value you set deliberately is no longer reverted every time you log in.- The avoidable-damage option's description described the old units.
- A damage-meter session reporting no damage taken at all now drops the avoidable component rather than scoring it a perfect 100: a meter that could not see you is not a flawless pull.
[3.2.0] - 2026-09-11
Added
- The HUD is now four panels instead of one block -- status/health/resource,
mitigation, cooldowns and procs. They stay docked as a single stack by
default; unlock with
/tc unlockand drag any one of them somewhere else to place it on its own. Options > HUD > Dock Panels Together puts them back, and Reset Position re-docks everything. An empty panel does not show, and the procs panel appears only while something is actually procced.
Fixed
- Brewmaster stagger tracking did nothing in combat. Sampling bailed out whenever the pool was unreadable -- which is every pull, since the client keeps it secret -- so time at each tier stayed zero, the heavy-stagger purify alert never fired, and the purify component of the score handed out a free 80 for a fight it had not measured. The game's own Light, Moderate and Heavy Stagger debuffs are readable (an aura's presence is plain even when its numbers are secret), so the tier now comes from those when the pool is hidden. A pull where even that was unavailable scores no purify component rather than a flattering one.
Changed
- Rebuilt the stagger meter. It used to pick its fill colour by comparing the pool against the heavy threshold -- but in combat the pool is a secret value that cannot be compared, so every fight it fell back to a flat blue bar with no colour and no numbers, which is precisely when it was needed. The track now carries muted light/moderate/heavy/overflow zones, and the fill is coloured by tier over them -- green, amber, red -- with the tier taken from the stagger debuff when the pool is secret. The zones show how close the next threshold is, which a fill colour cannot: it is identical at 31% and 59%. The fill says where you are, the zones say what is coming, and they agree by construction. The scale runs to 125% of your health, so a pool past your whole health bar keeps moving instead of pinning full (which also retires the purple state nobody saw in time). The bar shows its size and the bite of the next tick; purify was a fixed half of what the bar already showed and is in the alert and the report.
- The moderate and heavy lines are now yours to set (Options > HUD > Stagger). They drive the zones, the purify alert and the score together. A line relative to your current health would be better still, and is not possible: the client keeps current health secret in combat.
- The primary active mitigation sits in the core panel with the spec secondary it is read against -- stagger with Shuffle, the absorb with Shield Block -- so splitting the HUD into panels cannot pull the pair apart.
- Modernised the HUD's look: flat translucent panels with 1px hairline edges and a spec-coloured accent stripe, in place of the Blizzard tooltip border; flat bars with a subtle sheen and a spark that tracks the fill, in place of the ridged 2006 bar texture; muted labels against bright values so a row reads at a glance; and cooldown icons that dim rather than wash out, with a spec-green ring when ready.
[3.1.3] - 2026-09-11
Fixed
- The addon could go silently idle: nothing tracked, nothing scored, while the HUD stayed on screen looking like it was working. The spec API is briefly empty after a loading screen and during talent and trait updates, and the profile load treated that silence as "not a tank spec", threw the profile away and never tried again -- so no pull started on entering combat until the next loading screen happened to reload it. Silence is now a retry, the profile is kept while the client is not answering, and only a real answer that is not a tank spec clears it (which now also hides the HUD instead of leaving a dead one up).
/tc statussays whether a pull is live and whether pulls are scored where you are standing, naming the reason when they are not.- The pull history panel was too narrow for its own columns. Headers were positioned against the frame while the cells sat inside the scrolling area, so with every optional column enabled the "Length" header was drawn outside the panel and the rightmost columns of each row were hidden behind the scrollbar. Headers and rows now share one set of measurements, the panel opens wide enough for every visible column and cannot be resized narrower than they need, and the headers live in a clipped strip so nothing can be drawn outside the window. The two footer lines also sat on the bottom border; they have room now.
[3.1.2] - 2026-09-11
Fixed
- Opening the pull history panel could throw "bad argument #1 to 'ipairs'" from ScorePanel.lua and leave the panel half-drawn. Setting the backdrop re-measures the frame, which ran the resize handler part-way through building the panel, before its headers existed.
[3.1.1] - 2026-09-10
Fixed
- A loading screen in the middle of a pull — releasing your corpse during a boss
fight, or a
/reload— reset the cooldown and mitigation models. Every defensive read as available again for the rest of the fight, so death reports listed cooldowns you had already spent and coverage restarted from zero. The models now survive a reload of the same spec while a pull is live; an actual spec change still starts clean. - Avoidable damage the client would not report was scored as zero, which is the
same score as taking none. Pulls where the meter stays quiet now leave the
avoidable component out of the score entirely instead of awarding a free 100,
and the score panel shows
-rather than0%. - Time spent dead counted as pull time. A long corpse run diluted coverage, hits per minute and cooldown opportunities, so wiping and walking back could score better than fighting. Rates and cooldown expectations are now measured per second you were alive; the entry still records wall-clock duration.
- The HUD created ~68 new frames every time it was rebuilt and never released the old ones — and the width, icon size, bar height and font size sliders rebuilt on every step of the drag. Widgets are now recycled across rebuilds and slider changes are coalesced into one rebuild.
- Prot Warrior: Shield Block is 6 seconds in Midnight, not 8, so coverage was measured against a buff a third longer than the real one. Last Stand is passive now (Shield Wall triggers it) and was being scored as a cooldown you failed to press.
[3.1.0] - 2026-09-09
Added
- Version check: TankCompanion users swap version numbers with each other over
the addon channel in your group and guild, and you get one line in chat when
someone is running a newer release.
/tc versionshows yours and the newest one seen. Turn it off under Options - General - Version Check. TankCompanionAPI.GetNewestVersion()and anOnVersionOutOfDatecallback.
Fixed
- The addon reported its version from a hardcoded string that the release bump
never touched, so 3.0.1 still said 3.0.0 in
/tc diagand to plugins. It now reads the TOC, which is what the release stamps.
[3.0.1] - 2026-09-09
Fixed
- Release packaging: the CurseForge and GitHub uploads could not read the changelog, so 3.0.0 was built but never published. No addon code changed.
[3.0.0] - 2026-09-09 — Midnight rebuild: HUD, alerts, coaching score
Rebuilt for the Midnight (12.x) addon rules. The 2.x combat-log scorer could not work on 12.0 (COMBAT_LOG_EVENT_UNFILTERED is gone for addons and combat state is secret); every measurement now comes from the player's own casts, hit timing, stagger and Blizzard's server-side damage meter.
Added
- Per-spec HUD: status line, health + absorb, primary resource, spec resource (stagger meter with thresholds/tick/purify prediction, Bone Shield stacks and runes, Soul Fragments, Ironfur stacks, Consecration indicator, Ignore Pain absorb), active-mitigation bars, defensive/offensive/utility cooldown rows, proc indicators, optional Cooldown Manager mirror row.
- Cast-driven cooldown and active-mitigation model that stays accurate under secret values and re-calibrates from the client out of combat (including learned buff durations).
- Alerts: defensive ready, heavy stagger with purify available, mitigation lapse while being hit, death review, DBM tank-buster bridge naming the best available defensive.
- Diagnostic scoring: mitigation coverage while being hit, avoidable damage (game-flagged, with named sources), cooldown usage vs. opportunities, survival, utility; per-pull insights; comparison with your own median; pull intensity context; report card popup; component columns and breakdown tooltips in the history panel.
- Full spec data for Midnight 12.1 (hero-talent meta notes, removed spells filtered at runtime), per-spec spell toggles and user-added defensives.
- DBM callbacks (pull/wipe/kill/timers) and WeakAuras custom events
(
TC_PULL_START,TC_SCORE,TC_ALERT,TC_STAGGER). - Public
TankCompanionAPIfor other addons and custom triggers. /tc report,/tc hud,/tc unlock|lock,/tc status,/tc spells,/tc test,/tc diag.- Boss encounters are scored as one pull from ENCOUNTER_START to ENCOUNTER_END, surviving deaths mid-fight.
- Utility uses the damage meter's count of successful interrupts when available.
- GitHub Actions workflow running luacheck and the headless harness.
- One-button release workflow: Actions -> Release bumps the version and
changelog, commits, tags, and publishes to CurseForge and a GitHub release
via BigWigsMods/packager. Pushing a
v*tag works too (see RELEASING.md). - Coverage for armor/block mitigation only counts physical hits when damage schools are readable; cooldown expectations scale with pull pressure.
- Headless test harness (
scripts/headless_test.lua) with a mocked WoW API.
Changed
## Interface120100 (patch 12.1.0).- Uses
C_SpecializationInfo/C_SpellBook(the old spec and spell-known globals were removed in 12.0). - Scores are on a 0-100 scale; 2.x entries are kept as legacy rows.
Removed
- Combat-log handler and 2.x weight options (base score, per-spec weights, avoidable spell list); avoidable damage now comes from the game.
[2.0.1] - 2026-07-09 — Midnight (12.0) compatibility
- Bumped
## Interfaceto 120007; updated bundled Ace3 to r1390; trimmed unused Ace3 modules; addedscripts/package.sh.
[2.0.0] - 2026-07-08 — Complete rebuild
- First working release: proper library loading, AceDB profiles, combat-log based pull scoring with letter grades, tabbed options, minimap/broker icon, Mythic+ tagging, 1.x migration.
[1.5.9] and earlier
- See git history.
This mod has no additional files

