## [1.4.1] - 2026-05-23
- Fix: World-map pet pins no longer taint Blizzard's secure code paths. The taint cascade (most recently surfacing as "attempt to perform arithmetic on local 'textHeight' (a secret number value, while execution tainted by VamoosesPetPatrol)" inside Blizzard_UIWidgetTemplateTextWithState when hovering AreaPOI tooltips) is rooted in coupling to Blizzard's MapCanvas pin pool: any insertion into the shared pool from addon code marks the pool as touched, and once any pin enters in a tainted-tagged state, every future acquisition by ANY addon (or by Blizzard itself) inherits the taint. Prior fixes (Tier-4 RunNextFrame deferral + Tier-2 SetSize/SetAlpha re-stamping) narrowed the window but couldn't close it. The pin layer is now fully decoupled from Blizzard's pool: VPP runs its own framepool on its own private Frame parented under WorldMapFrame.ScrollContainer.Child, never calls map:AcquirePin / WorldMapFrame:AddDataProvider, and listens for map changes via EventRegistry "MapCanvas.MapSet" + hooksecurefunc on OnFrameSizeChanged (taint-preserving Blizzard callbacks) instead of HookScript on WorldMapFrame OnHide. Mirrors RareScanner's architecture, which has been pool-contamination-free since Midnight launch. Reported 2026-05-23.
- Pin pool reset (Tier 2 from MIDNIGHT_SECRET_VALUES.md) now actually does something. The previous `if pin.SetToDefaults then pin:SetToDefaults() end` guard was a no-op: MapCanvasPinMixin defines no SetToDefaults method, and Pool_HideAndSetToDefaults lives on the pool framework, not on pin instances. Each AcquirePin now explicitly re-stamps SetSize(14,14)/SetAlpha(1) and nil's our custom pin fields before re-populating, replacing any property-contagion (secret-tagged width/height/alpha from prior tainted use) on recycled pins. Addresses follow-up MoneyFrame_Update crashes reported 2026-05-15 after v1.4.0's deferral fix. (Superseded by the pool-decoupling refactor above, but kept in the log for context.)

## [1.4.0] - 2026-05-14
- Fix: Hovering an action button no longer crashes inside MoneyFrame_Update with "attempt to perform arithmetic on a secret number value (execution tainted by VamoosesPetPatrol)". Extends the 2026-05-13 Tier-4 deferral: the synchronous self:RemoveAllData() call (and Blizzard's direct calls into _provider:RemoveAllData on map teardown) was still running RemoveAllPinsByTemplate -- which releases pins back to the pool AND hides the shared GameTooltip if it was anchored to a removed pin -- inside Blizzard's tainted secure pin-pool refresh stack. Pool releases + GameTooltip mutations from tainted context propagated VPP-taint forward, so when the player later hovered an action button inside a protected context where GetMoney() returns a secret value (housing interior, M+, raid encounter, delve, PvP, in-combat dungeon), MoneyFrame_Update's arithmetic on that secret crashed and blamed VPP. RemoveAllData now defers its engine work to a clean next-frame context too, leaving zero synchronous engine-state mutations in RefreshAllData. Reported 2026-05-14.
- Fix: Hovering a Blizzard quest-offer / area-POI pin no longer crashes inside GameTooltip_InsertFrame with a "secret number" frameWidth comparison blamed on VPP. Two-layer defense (per Reference/MIDNIGHT_SECRET_VALUES.md): (1) Tier-4 deferral -- _renderZonePins and _renderBadges now run via RunNextFrame so addon work no longer fires synchronously inside Blizzard's secure pin-pool refresh stack; (2) Tier-2 pool reset -- each VPPWorldMapPinTemplate acquisition now calls pin:SetToDefaults() to clear any Secret state inherited from prior tainted use (Blizzard's Pools.lua: "if one secret object enters a pool, all future acquisitions end up being secret too"). Belt + braces; matches Blizzard's own Pool_HideAndSetToDefaults reset pattern. Reported 2026-05-13.
- Fix: Hovering Blizzard world quest pins no longer crashes inside MoneyFrame_Update with a "secret number" taint blamed on VPP. The world-map pet pin data provider was running addon work (zone tab fanout, navigateTo SetMapID) synchronously inside Blizzard's secure pin-pool refresh, tainting WorldQuest/TaskPOI tooltips. Defers all WorldMapFrame mutations off the refresh stack via RunNextFrame and skips auto-follow while the cursor is on the canvas.
- New: Pet pins on Blizzard's world map (M). Toggle in Config tab. Click a pin to pulse the species in VPP's main window.

## [1.3.0] - 2026-04-26
- New: Follow Player toggle on the map title bar — keeps your blip centered while the map pans underneath, minimap-style. Auto-zooms to 2x when enabled at fit; manual pan exits, zoom-out keeps the toggle remembered.
- Change: Player marker is now a minimap-style arrow that rotates with your facing direction, and stays a constant on-screen size regardless of map zoom.
- Change: Map placement controls (attach left, attach right, detach) moved from the map title bar to the main window title bar — flanking the eye icon. Active side is highlighted; detach button uses the default mouse-cursor texture color.
- Change: Detached map uses whole-frame fade for entrance, exit, and zone changes — replaces the column-by-column tile fade (which only made sense as part of the slide-out drawer choreography). Attached mode keeps the slide + tile fade.
- New: Name search field on the All tab — filters by partial pet name as you type (case-insensitive, debounced).
- New: Click a pin again to clear its waypoint. Same pin = toggle. Shift+click still always sets waypoint and inserts a chat link.
- Change: Tooltip hints — pet rows now mention "Click: highlight spawn pins on map" so the pulse feature is discoverable; map pins now mention shift+click for chat-link.
- Perf: Player-blip ticker dropped from 10Hz to 5Hz (still smooth for facing rotation and follow-pan, halves the per-tick work when not actively following).
- New: "Alert only for uncollected pets" checkbox under Play Alert Sound in Config — backend was already wired, just needed the toggle.
- New: Zone tab filter (All/Uncollected/Collected) persists across zone hops and reloads instead of resetting to All every time.
- Improve: Map zoom level no longer resets to 1.0 on every zone change — your committed zoom is preserved (view recenters on the new zone).
- Improve: Debug mode now prints a one-shot warning when the player blip can't locate you on the displayed parent map (deep sub-area without coverage).
- Fix: Nestor's bounce reset timer now guards against running while the title bar is hidden by combat.
- Cleanup: Stripped dead `fontFamily` / `fontScale` config keys (always defaulted, no UI to change them) and their supporting tables.
- Perf: Player-blip ticker now caches last position/facing/visibility and skips SetPoint/SetRotation when nothing changed. Standing still no longer generates GC pressure from anchor-record allocations.
- Perf: Hoisted the per-call closure in ZoneTracker:CheckUnit (fired on every UPDATE_MOUSEOVER_UNIT). Was allocating a fresh function each mouse-hover.
- Fix: Detached map no longer closes when you switch to All or Config tabs — only attached maps follow the tab. Lets you adjust scale on Config and see the result live.
- Fix: When zoomed in, you can now drag the map all the way to the zone edges. Previous pan offset under-shifted by a factor of zoom level.

## [1.2.0] - 2026-04-25
- New: Map drawer can now detach from the main window. Position, scale, and pinned state are saved independently and restored across /reload.
- New: Interior map zoom. Use +/-/Home buttons or mouse wheel (zooms toward your cursor) to drill into dense pin clusters; click-drag to pan when zoomed. Pins stay clickable at every zoom level.
- New: Independent map scale. A separate stepper in Config sizes the map without affecting the main window.
- New: Three placement modes (left of main, right of main, detached) with always-visible Side and Detach toggle buttons in the map title bar.
- New: Per-copy level row on each pet entry. See every owned copy's level, each colored by its individual quality (e.g. blue 25 / green 18 / grey 5).
- New: Pet name on each row is colored by your best owned quality.
- New: Pet type icons next to the type label (Humanoid, Beast, Dragonkin, Critter, Elemental, Magic, Mechanical, Aquatic, Flying, Undead) using Blizzard's atlas. Names localized via PET_TYPE_SUFFIX.
- New: Sort toggle on the All tab. Switch between A-Z and best-quality order.
- New: Count display shows unique species and total owned copies. Format: "X new / Y unique / Z owned" depending on the active filter.
- New: Tooltip for collected pets uses Blizzard's localized "X/3 collected" string (via GetOwnedBattlePetString).
- New: /vpp map show / /vpp map hide / /vpp map reset slash commands.
- Improve: Config tab is scrollable so longer configurations fit in the panel.
- Improve: Zone tab empty state shows the logo backdrop, matching the map drawer's empty state.
- Improve: Map zoom cluster (+/-/H) overlays the viewport so the chrome stays fixed when the canvas zooms.
- Fix: Detached map no longer closes when the main window closes (independent of the link-to-main toggle).
- Fix: Map stays closed when you switch to the All or Config tab. Previously zone changes would reopen it.
- Fix: Map scale stepper no longer also scales the main window.
- Fix: Hover text disappearing on Reset and Rebuild buttons in Config.
- Fix: Pinned map now auto-restores on /reload (event-driven, no timer hack).
- Fix: Login no longer prints scanner build messages unless debug mode is on.
- Fix: Replaced two redundant local pet-type tables with Blizzard globals, cutting code duplication.

## [1.1.2] - 2026-04-23
- Fix: Removed soft-target event tracking (PLAYER_SOFT_INTERACT/ENEMY/FRIEND_CHANGED) — caused client crash (ERROR #132, EXC_BAD_ACCESS) on camera movement inside Daggerspine Point Ritual Site and likely other Midnight delve-style instances. Spotted-pet detection still works via mouseover and target.

## [1.1.1] - 2026-04-20
- Change: Compatible with WoW 12.0.5 (TOC bump)
- Change: Silenced "VPP loaded" login chat message (shown only when debug mode is on)

Vamoose's Pet Patrol - Changelog

## [1.1.0] - 2026-03-15
- Fix: Instance zones (dungeons, raids, delves) incorrectly showed parent zone's pet list
- Fix: "Script ran too long" error when checking pet quality with large collections
- Fix: Player blip not appearing on initial load or after zone changes
- Fix: "table index is secret" error in delves — tainted UnitName values from soft-target units
- Fix: Combat error from spotted-pet detection — skip UnitName checks during combat lockdown
- Fix: All Pets tab filter switch lag spike — suppressed double layout pass in ScrollBox
- Fix: Wrong pet counts on login — gate All Pets build on both index ready AND journal data
- Fix: Captured pet stayed "NEARBY!" and uncollected after catching
- Fix: Zone tab didn't refresh collection status after capturing a pet
- Fix: All Pets tab rescanned 65k species on every pet capture — now lightweight refresh only
- Fix: Map drawer player blip ticker kept running after closing drawer
- Fix: Fast zone change during map animation could show old zone's pins
- Fix: Pin pulse row blip dimming was broken
- Fix: Stale scroll frames visible when switching to zone with empty results
- Add: Pulsing "Scanning pet journal..." indicator on All Pets tab
- Improve: Config tab redesigned with checkboxes and theme swatches
- Improve: Full theme engine compliance across all UI files

## [1.0.0] - 2026-03-14
- Zone Pets tab: see all wild battle pets in your current zone
  - Uncollected pets highlighted with gold "NEW!" badge
  - Quality indicators: Poor, Common, Uncommon, Rare
  - Upgrade arrow on pets that can be caught at higher quality
  - Pet type icons and source text on every row
  - Collection radio filters: All, Uncollected, Collected
  - Count display showing "X new / Y total" for current zone
  - Expansion-tinted zone header with subzone display
  - Sort: spotted first, then uncollected, then by quality (upgrade targets first), then alphabetical
- All Pets tab: browse every battle pet in the game
  - Source type dropdown: Pet Battle, Drop, Quest, Vendor, Profession, Achievement, World Event, PvP, Promotion, Trading Card, In-Game Shop
  - Collection radio filters: All, Uncollected, Collected
  - Batched scanning (65,000 species IDs) with UI yield to prevent stutter
  - Supports Midnight click-to-catch pets (canBattle=false, isWild=true)
- Map Drawer: animated slide-out zone map with pet spawn coordinate pins
  - Tile rendering with column-by-column fade-in animation
  - Explored overlay removes fog of war from visited areas
  - 20 colorblind-safe per-pet pin colors (Wong/Okabe-Ito palette), matching row color blips
  - Pin pulse: click a pet row to highlight matching pins and dim others
  - Player position shown as a baby murloc with glow halo
  - Click pin to set waypoint, Shift+click to link in chat
  - Side-flip button to move drawer to left or right of main window
  - Dynamic height sizing to fit map content
  - Empty state with logo when no wild pets in zone
  - Toggle via title bar eye button or /vpp map
- Nearby pet detection: spots wild pets on mouseover, target, and soft-target
  - Green row tint and "NEARBY!" badge in Zone tab
  - Separate alert sound for nearby uncollected pets
- Zone change alerts with optional sound notification
  - Chat message: "[VPP] Zone: X new, Y upgrade (Z wild pets)"
  - Duplicate suppression prevents double-alerts on login
- Window pin button: keeps window open through Esc and /reload
- Title bar icon swaps to indicate zone collection status
- Nestor companion mascot with talking head quotes
  - Left-click: trigger quote with bounce animation
  - Right-click: toggle between Nestor and Robo-Nestor
  - Chat-only mode option (no talking head)
- PetScanner: builds zone index from C_PetJournal API with 24h cache
- Static ZoneDB from Wowhead scrape via WowCodex pipeline
  - VPP_ZoneDB.lua: uiMapID-based lookup (complete zone coverage)
  - VPP_ZoneCoords.lua: per-species spawn coordinates
  - ZoneTracker uses static DB with parent-walk + sourceText fallback
  - PetScanner skips runtime scan when static DB is present
- 12 color themes via shared SchemeConstants (left/right-click to cycle)
- Modern ScrollBox UI (WowScrollBoxList + DataProvider)
- Minimap button + addon compartment support
- Config tab with alerts, Nestor, theme, data options, Discord/BMAC links
- /vpp slash command: map, scan, debug, zone, zones, check, config
