lightweight tag 8376142545ab2a8136ab0591f3940a4b6af17962 v2026.07.01.1934
Author:	BAThomp24 <bathomp24@gmail.com>
Date:	Wed Jul 1 15:34:16 2026 -0400

commit 8376142545ab2a8136ab0591f3940a4b6af17962
Author: BAThomp24 <bathomp24@gmail.com>
Date:   Wed Jul 1 15:34:16 2026 -0400

    fix: dungeon popup reliability (name matching + swap-check isolation)
    
    Two ways the per-dungeon suggest popup could silently fail to appear:
    
    1. Dungeon-name mismatch. WoW's in-game names don't always match the
       website's build data on articles or apostrophe placement, e.g.
       "Seat of the Triumvirate" (in-game) vs "Seat of Triumvirate" (data),
       "Magister's Terrace" vs "Magisters' Terrace". normName handled these
       inconsistently, so findBestBuildForDungeon returned nil → no popup.
       Added a compact match form (drops "the", strips all spacing) so these
       variants resolve to the same key. Distinct dungeons stay distinct.
    
    2. SwapsAlreadyApplied runs a live talent dry-run (stage refunds/
       purchases, RollbackConfig) on every dungeon entry. It was unguarded,
       so if it errored (e.g. a talent API shift), the ZONE handler's pcall
       swallowed the whole flow and the popup never showed. Now isolated in
       its own pcall; on failure we treat swaps as not-applied and still
       show the popup.
    
    Note: the common "builds look stale" report is usually the ZugZug-Dev
    install running a hand-copied Data.lua the daily cron never updates —
    run the CurseForge ZugZug for auto-updating data, or re-copy Data.lua
    into the Dev folder.

