Skip to content

v0.6.0

Latest

Choose a tag to compare

@aurokin aurokin released this 04 Oct 07:39
· 7 commits to main since this release
dd77084

[0.6.0] - 2026-10-04

This release standardizes every binary's JSON, errors and global output flags, expands provider
reads and guide discovery, and corrects build and sampled-analysis results.

Breaking migration: read payloads from data, use --brief after wrapper search/resolve
and global output flags before the subcommand, and update renamed fields and removed commands
listed below. Regenerate existing SimC build harnesses and rerun their comparisons: earlier
harnesses could replace the supplied build with the spec's default talents.

Added

  • Every binary emits one envelope with ok, provider, command, kind, schema_version: "1", query, provenance and data, plus error on failure. warcraft schema exposes the shared schema. Commands, arguments and options have help text and generated references, including option bounds and metavars.
  • Global --compact, --compact-max-chars, --fields, --fields-strict and --profile agent|human work on every binary and wrapper passthrough. Compact output preserves URLs, talent strings, export codes, SimC profiles and command/input values, and lists every cut in provenance.compacted_paths. Missing projected paths appear in fields_missing; strict projection fails missing_fields. Failure envelopes stay whole.
  • Provider tiers appear in warcraft doctor: core Wowhead, Warcraft Logs and SimC; supported Method, Icy Veins, Raider.IO, Warcraft Wiki and Lorrgs; experimental Raidbots, Blizzard and CurseForge. Lorrgs moves from experimental to supported.
  • Release-tag CI runs make check, builds the root wheel and attaches it to the GitHub release for pipx and uvx installation.
  • blizzard pvp-season, pvp-leaderboard and pvp-character read season metadata, title cutoffs, ranked players and character ratings/records. Leaderboards support --season and --limit up to 5000; PvP supports retail, progression Classic and Anniversary; Classic character reads probe 2v2, 3v3, 5v5 and rbg when the summary omits them. Classic Era has no PvP seasons.
  • blizzard collections returns mounts, pets, toys, heirlooms and transmogs with counts, name filters and limits. auctions <realm> and retail commodities summarize listings and units per item id with minimum and unit-weighted median prices in copper. --item-id selects exact ids with not_listed; otherwise --limit selects the most-listed items. Bid-only listings count toward units/listings but have no price. Market snapshots, leaderboards and PvP cutoffs report Blizzard's Last-Modified and its age at read time. Collections and commodity prices are retail-only in practice; Classic auctions omit trade goods.
  • Blizzard realm, item and character reads support --game-version classic-era and classic-anniversary, alongside retail and progression classic; doctor reports verification for all four. character also takes REGION REALM NAME, and --section reads PvP summaries/brackets, professions or mount/pet/toy collections as raw character_section data.
  • raiderio leaderboard raids --raid returns guild rankings with region/realm filters, paging and returned/requested counts. raiderio raids lists raid/encounter slugs; affixes returns this week's affixes; dungeons lists season dungeon pools; cutoffs returns regional top 0.1%, 1%, 10%, 25% and 40% player-rating cutoffs with UTC updated_at.
  • Raider.IO profiles add last_crawled_at; character profiles include every recent run and each dungeon's best run, with counts and played spec, spec_slug and role. Raid rankings disclose hidden pulls/percentages in privacy. Guild roster previews carry rank, active role and realm identity, sort guild master first, and support --roster-limit with roster_truncated; member counts mean members Raider.IO tracks.
  • icy-veins index-refresh crawls pages missing from its stale sitemap into a durable local index. It preserves past seasons, resumes a frontier, prioritizes unseen pages, obeys --max-requests (default 250) and at least one-second pacing and stops on blocking responses or repeated failures. A bundled index snapshot makes current boss, dungeon and delve pages discoverable before a crawl; doctor reports the index in use. make icy-veins-snapshot replaces the bundled snapshot only after a complete crawl.
  • Icy Veins discovery combines sitemap, current site menu and site index. Rows report source, sitemap modification time, menu title, indexed headline/publication date and parent; provenance names each source and warns about stale, missing or unreadable data. Searchable content includes raid encounters, dungeons, delves, professions, tier lists, hubs, transmog and PvP subpages.
  • Icy Veins converts calculator builds on PvE and PvP guides into wow_talent_export references for SimC. Converted rows carry class/spec build_identity, source.converted_from and tree-data URL. Published equivalent imports add no duplicate on that page; labels merge shared builds. Calculator URLs remain when PvP selections matter or conversion fails, with conversion status and failure reason.
  • wowhead talent-calc decodes Classic Era/SoD, Classic PTR, TBC, Wrath, Cataclysm and WoW Forever builds into tree points and ranked talents, and MoP Classic builds into tier choices. Unsupported/unreadable builds report decoded: false with a reason. Trimmed calculator data is cached for 30 days; glyph, rune and click-order segments remain raw. SimC continues to decode retail builds only.
  • Wowhead item sets are searchable/resolvable entities. entity/entity-page add infobox/map facts, quest start/end and ordered chains, and NPC/object locations; entity reports spawn counts while entity-page keeps coordinates. Listview links retain tab ids and upstream drop/vendor listview_data. Linked previews expose fetch_more_truncated; Wiki navigation adds more_available and fetch_more_command.
  • Wowhead news and blue-tracker rows include UTC posted_at and timestamp-parse counts. Raider.IO run rows include logged_run_id, its own logged-run id rather than a Warcraft Logs code. Warcraft Logs guild/character rows add class_name; sampled fights add key level/time and difficulty/key-level counts with mixed-cohort notes. Event pages describe next-page retrieval.
  • SimC doctor reports ripgrep/binary dependencies, disabled commands and checkout/binary commit mismatch. Priority/opener/describe results report totals and truncation; run returns player/target result headers. sim reports other actors, ranked profilesets and stat weights; SimC and Raidbots profilesets include mean_error, mean_stddev and iterations. Simulation disclosures flag default gear and default talents.
  • Guide comparisons add subject identities/agreement, bundles without builds and source content_updated_at, separate from export time. Icy Veins/Method reads expose requested/served redirects; orchestration persists them on exported and reused rows.
  • Successful cached reads include provenance.cache with backend, lookups, hits, hit/all-hit flags, hit age/TTL and backend errors. Wrapper totals preserve each provider's own block; ages are unknown whenever any hit came from Redis. Lorrgs, Blizzard and CurseForge gain configurable caches; Blizzard adds the one-hour BLIZZARD_SNAPSHOT_CACHE_TTL_SECONDS for collections and market/PvP snapshots, reducing large bodies before caching. Doctors report cache configuration, availability and failures. Blizzard/CurseForge doctor status becomes ready with credentials and degraded without them, with typed capabilities marked as requiring client credentials/API keys; Warcraft Logs status reflects public access, and Lorrgs/Raidbots report ready.

Changed

  • Envelope and errors: top-level payload copies are removed. Failures have kind: "error", data: {}, parsed query, and details under error.details; full nested command paths are preserved. Uncaught exceptions become JSON errors on stderr. Exit codes are 2 usage, 3 auth, 4 not found, 5 network/timeout/rate limit/upstream, and 1 other failures. HTTP errors use auth_failed, not_found, rate_limited or upstream_error; connection errors use network_error. Lorrgs treats inaccessible private reports as not_found.
  • Search/resolve fields: every provider uses kind: "search_results"/"resolve_match", results/candidates, returned-row count, complete total_matches and truncated. Coming-soon/not-supported totals are null. Rows have provider, kind, id, name, url and follow_up: {command, surface}. Migrate recommended_command/recommended_surface and alternatives to command/surface and alternative_commands; article rows drop entity_type/type_name and repeated metadata slug/title. Raider.IO discovery replaces profile_url with url; profile/run payloads retain profile_url. Lorrgs/WCL resolve replace resolution with resolve_match; Lorrgs replaces results with candidates and drops repeated data.provider.
  • Search stubs use empty lists, count: 0, total_matches: null and truncated: false; resolve stubs include confidence: "none", resolved, match and next_command as applicable. Warcraft Logs report rows carry their site's URL. Lorrgs ranking rows carry Lorrgs URLs; a report URL row preserves that URL, while metadata rows have no URL. Unresolved provider results retain their top match and a fallback search when one can help; zero-match results and Warcraft Logs' explicit-only discovery have no fallback.
  • Wrapper discovery: --brief replaces the old subcommand --compact; global --compact must precede the subcommand. The wrapper keeps provider rows and order, merges by query intent/title fit with a per-provider half-page cap, and exposes wrapper_ranking and merge_policy, including provider totals and returned merged count. Weak partial/snippet-only matches are not rescaled into full matches. Provider-score ties use provider name, and stale guides remain marked under --brief. Bare names do not imply profiles; exact entity titles can still resolve despite intent words. Apostrophes do not break name matches, and namespaced C_* API names route to the wiki.
  • Wrapper resolve accepts only a provider's high-confidence answer that fits intent. Low-confidence matches cannot block an answer; medium matches can. Unresolved hints and fallback searches retain wrapper ranking order, including low matches; provider_resolved_candidates lists high answers blocked by a better-ranked unresolved candidate. --limit only sizes ranking diagnostics. Search and resolve run providers concurrently, preserve failures/warnings under --brief, and report answered/failed counts. No eligible searching provider is no_searching_provider; all failures preserve a shared provider error or report upstream_error/providers_failed.
  • Provider resolve ambiguity is judged over the full candidate set, not the displayed limit. A one-word query resolves high only when it names the match or a declared provider identity; other matches are medium with confidence_cap.rule: "single_word_query". Wrapper hints use single_word_query_not_named_exactly. Lorrgs boss composition queries with extra words remain medium with words_beyond_boss_name; heroic/normal/LFR boss compositions stay low. Bare boss names, spec rankings and explicit URLs can still resolve. Bare Warcraft Logs report codes are medium; report URLs can resolve high.
  • Wrapper calls providers in-process. Doctor reads local state without API probes, keeps provider readiness/tier and exposes cache_error with degraded/error status. Removed constant language/invocation metadata is listed below. Passthrough failures use the provider's envelope; expansion mismatches exit 2. Handed-over commands are shell-quoted and never compacted.
  • warcraft guild is a Raider.IO snapshot under data.sources.raiderio.summary/provenance, with every raid's difficulty-specific world/region/realm ranks; 0 means unranked. active_raid/conflicts are gone. Cross-provider commands preserve source failure codes. Actor-profile accepts report URLs and URL fight scope, uses realm slugs, marks Raider.IO active-spec provenance, and without a fight searches at most ten report fights, kills first.
  • Cooldown packets use the fight's difficulty unless overridden. They infer actor/class/spec/boss from the selected fight's Warcraft Logs roster/encounter when Lorrgs is missing, unavailable or lacks players; --spec-slug is needed only if the roster lacks a spec, and missing actor selection lists the roster. Deaths are unknown without Lorrgs. Explicit spell ids allow operation during a Lorrgs outage. Source errors, comparison-decline reasons, requested phase and other-source cast counts stay visible.
  • Without Lorrgs markers, cooldown phase windows come from Warcraft Logs transitions and carry phase id/name/source. Top parses use their own transitions and count only matching encounter phases; unavailable/missing-phase samples never compare a whole fight to one player phase. phase_sample_count, availability reasons and no_phase_data disclose this. Use --actor-id or --actor-name to select the actor and --spell-id during a metadata outage. Received externals are excluded only when the actor did not cast them, remain in received_auras, and explicit spell ids stay compared. The analyzed fight is excluded from its own top-parse sample.
  • Guide orchestration writes under the data root, selects guide candidates only, uses portable relative bundle paths, records provider decline/failure causes and redirects, and rejects scopes with fewer than two providers. Comparisons reject duplicate/fewer-than-two bundles and count a build as shared only across build-capable bundles, with at least two needed.
  • Guide-to-SimC handoffs retain exact transport packets/provenance, rotate --limit across providers, separate excluded/truncated counts and disclose failed guide pages. Root freshness uses the oldest bundle export; manifest rewrite time is separate. Statuses are ok, partial, failed, no_build_references, all_references_excluded and all_handoffs_failed. Empty/partial requested legs and per-build failures are explicit. Identifying no class/spec fails build_not_identified; when every requested leg produces nothing the command fails simc_handoff_failed, including --no-decode runs.
  • Talent packets travel to SimC in memory, without deleted temporary paths or duplicate stdout JSON. written_packet_path replaces packet_written_path; a real source/kept packet path is cited, otherwise null. Provider results contain {provider, exit_code, payload}, and SimC failure queries echo only supplied inputs. Explicit report refs require --actor-id; bare report codes use the same identifier rules as Warcraft Logs. Forever refs route to Wowhead. Raw-only log packets require validation before direct SimC input.
  • Guide query migration: Icy Veins, Method and Wowhead use kind: "guide_query" and data: {bundle, guide, page, query, count, match_counts, matches, top, failed_pages}. Wowhead replaces output_dir/counts with bundle/match_counts, drops filters and returns full scored rows rather than preview projections; navigation/gatherer/comment queries remain. Cross-bundle query counts include every kind and build references, and top rows include bundle identity. Method exports return files instead of manifest. Title/name/label matches rank above mere mentions; blank queries and invalid/missing bundles fail consistently.
  • Wowhead search returns five rows by default, resolve limits reach 50, and search supports --entity-type. Suggestion ranking preserves upstream order, filters whole words/types/numbers, ranks superseded guides down and never resolves one high. entity normalization version moves to normalized.schema_version, with old cache records refetched. Inline entity tokens get names, build blocks survive, and guide/share URLs determine expansion. Cached entities report the current call's expansion selection.
  • Icy Veins/Method recognize shared class/spec shorthand and punctuation; Icy Veins treats mythic+, m+ and m plus alike, Method uses mythic dungeon. Method spec-section queries hand off to the section. Icy Veins limits spec guides/intro boosts to actual spec/class/role introductions, classifies article/expansion/old-raid families separately and ranks transmog only for transmog queries. Method class guides require a spec/class slug. Sitemap dates move from Icy Veins metadata.last_updated to metadata.sitemap_lastmod, Method guide dates are ISO plus original text, and source-specific publication dates break discovery ties.
  • Warcraft Logs: report-player-talents produces raw-only packets without running SimC. Typed damage/aura results omit raw tables unless --include-raw; graphql returns the API's own data. Typed commands expose all GraphQL partial warnings and never cache partial replies. Finished-report caching starts after two hours without events; live kills still participate in sampled cohorts.
  • Warcraft Logs scopes events/player details to fights or explicit windows, accepts report URLs/localized hosts/bare CODE#fight=N, honors URL fight scope unless overridden and rejects foreign hosts/site mismatches. Missing fights/scopes and impossible/inverted windows fail clearly. Encounter windows clamp to the fight and echo effective window/clamp fields. Complete guild scope is required; bad enum/finite-value/input-file options are validated before requests. --difficulty accepts names; report-list dates accept UTC ISO dates; --limit aliases ranking/sample --top, and casts expose --event-limit.
  • Warcraft Logs raid healer rankings default to hps, other raid specs to dps and Mythic+ to score. Report rankings use default metrics and a separate healer pass; query.metric, query.player_metric and query.healer_metric echo the choices. Shared class/spec names/shorthand normalize to provider ids, infer an unambiguous class and reject mismatches; classic/fresh retain their extra specs. boss-spec-usage keys include class/spec/role. Aura actors are aura_holder/applied_by with row_actor, and aura comparisons expose left/right/delta total uptime/uses instead of never-filled totals.
  • Raider.IO specs/composition keys are class-qualified, regions/realms and class/spec/role filters normalize consistently, and invalid filters fail instead of producing empty samples. Character/guild realm is a slug with realm_name separate; recent-run dungeon_slug is removed in favor of dungeon/short_name and complete timing/id/url fields; direct search probes match that shape. Sampled commands page as far as limits require, with zero-based --page and provider-specific expansion ids documented, with optional --pages cap, deduplicate repeated runs and disclose duplicates. Thresholds outside the sampled range have no estimate and explain paging or run-score/player-rating differences.
  • Wiki API/event lookup tries canonical titles first and accepts fallback only when every word matches the title; API/event resolution uses returned count plus total/truncation. Events extract arguments, and API lookup includes enums, CVars, widgets, templates, TOC/taint and programming pages. Impossible/special titles and overlong queries fail invalid_query; other MediaWiki errors use api_error with the upstream code in details.
  • SimC identifies talent exports by probing all specs including healers; explicit class/spec and APL/url guesses are checked against the decoded hash, and contradictory guesses are ignored. Class/spec shorthand and case-insensitive names remain supported and are shared with providers. Blizzard hash URLs and retail PTR/Beta refs decode; Classic/Forever refs fail explicitly as non-retail. High decode confidence requires a decoded pair; unresolved probing says how many specs were tested. Relative/bare APL paths resolve predictably, and multi-actor build input selects the first actor with notes.
  • SimC exact-build/APL analysis follows rotation dispatch past utility/helper lists and evaluates the decoded hero tree, talent ranks and full operator precedence. Unknown conditions stay unknown. build.enabled_talents outputs are token lists with enabled_talent_count, and inactive branches identify talent/hero gating. Tokens follow SimC spelling; earlier underscore variants fail unknown_talent, so use display names or current decode tokens. Describing a build against another spec's APL fails invalid_query.
  • SimC modify-build --add/--remove accepts spec/hero names, routes edits to the right tree, validates choices/swaps and verifies re-encoding with disclosures; mismatches fail encode_mismatch. Transport validation rejects invalid/duplicate ranks and multiple hero trees. sim keeps profile run settings unless --iterations/--max-time explicitly override them, records settings retained/replaced, handles all whitespace-separated options, and reports requested iterations accurately. compare-apls uses mean executes across all iterations rather than one sampled sequence; action_sequence_iterations is removed. SimC error extras move to error.details, executed argv to data.command, and previews use the last 20 lines.
  • Blizzard reads verified regions with provenance.verified: true, supports Classic profiles and resolves display/native-script realms. Credential pairs come wholly from the first complete source, never mixed. CurseForge verifies live reads, returns latest files newest-first while keeping raw upstream order, and includes file display/release type in changelogs. Raidbots rejects malformed refs, supports stdin --file - and aligns SimC metrics and multi-actor output.
  • HTTP clients use the versioned User-Agent, per-host request pacing and bounded Retry-After. Auth state files/directories use 0600/0700, dotenv discovery stops at the repository root and credential discovery does not mutate the environment. Refresh tokens are neither stored nor used.

Fixed

  • warcraft cooldown-packet never merges a different singleton Lorrgs fight into the requested Warcraft Logs fight. Provider provenance, partial GraphQL warnings and notes remain visible in sources; incomplete or paginated player casts carry complete: false and a partial comparison. Empty top-parse rankings report no_samples instead of ready.
  • A zero or negative Redis cache TTL expires that key without disabling a healthy backend for later reads and writes. An inaccessible file-cache directory falls back to the upstream provider instead of failing the command.
  • Error output remains JSON for misplaced global flags, command groups without subcommands, huge integers, nonfinite numbers and malformed/blank refs. Errors name the global flag to move or available subcommands. Subcommand names no longer become option values. Empty expansion strings fail rather than selecting retail. Malformed guide/tool refs are usage errors; absent files/bundles use not_found, unreadable bundles retain invalid_bundle, and ambiguous bundle names use invalid_argument.
  • Redis failure no longer looks like a cold cache or stalls every lookup: bounded connection timeouts and a per-process failure circuit skip a broken backend after its first failure. Missing extras/URLs and invalid settings fail with provider-specific configuration guidance. Doctors/cache inspection tolerate outages, redact passwords even with delimiter characters and expose failures. File-cache writers use independent temporary files and clean failed writes.
  • Wowhead routes entity and guide/news/blue/tool/listing URLs to their reader, rejects unsupported/foreign URLs and treats textual mentions of the host as text. Type-word fallback finds entities whose suggestion category differs from user wording, while exact names retain priority. Whole-word/plural matching avoids substring false positives, numbers must match, internal DNT entries are hidden unless requested, and guide listing searches include slugs.
  • Wowhead entity/ref validation rejects unknown types, malformed type/id pairs and simultaneous URL/type-id input before requests. Outside-tooltip types suggest entity-page. Guide readers reject listings/non-guides, unknown guide ids/categories return not_found, news/blue readers require actual article/topic refs, and changed layouts fail parse_failed; malformed JSON is invalid_response.
  • Wowhead talents parse classic class/build paths and MoP glyph/no-spec/click-order forms correctly. Retail refs require a real class/spec pair and consistent loadout header; packet refs require a spec and valid code. listed_builds is spec-specific and absent without a spec, with tool.spec_id. Invalid caches cannot produce both failure and success, and failed page fetches retain null canonical URL with fetch_error. Forever URLs no longer pretend to be retail; unsupported entity reads fail and news/guide content notes unknown or mismatched expansion.
  • Wowhead relation-tab links now participate in entity previews, comparisons and graph traversal, retain all tab ids and lead previews with relation rows. Names come from gatherer/tab data instead of arbitrary comment anchors. Graphs omit root self-loops and disclose unread pages/truncation; related entities and comparison shared/unique sets use complete link data. Money markup names actual gold/silver/copper/currency units. Zero preview limits keep real link counts.
  • Wowhead exports finish with hydration.failed instead of losing the manifest, preserve unrelated parent indexes, remove stale entity manifests after nonhydrated re-export and skip malformed/non-UTF-8 sibling manifests. Date-filter validation precedes fetching; unparseable news/blue timestamps fail instead of yielding plausible empty windows. Cache clear validates namespaces/reports backend failures, and Redis summaries retain namespace counts and largest-first order.
  • Icy Veins parses the rebuilt guide layout and class hubs; guide providers split real sections, preserve imports, report failed pages and reject unparseable sitemap/navigation instead of returning empty/incomplete success. Icy Veins spec queries prefer the actual spec guide, ambiguities remain unresolved, current raid names resolve to raid guides, and hub matches accept only their own indexed subpages as close rivals. Family words cannot boost unrelated pages; Mythic+ season spelling does not break season ties. Boss/dungeon/raid queries with difficulty/strategy words fall back conservatively without opening another difficulty.
  • Method searches whole slug words/plurals, retains literal aug rune, rejects malformed refs before fetching and treats slug casing consistently. Both guide providers handle punctuation and shorthand without changing ordinary words such as "Disc Belt". Mythic raid headings no longer normalize to Mythic+.
  • Icy Veins index refresh detects unusable output paths before crawling, reports later writes as invalid_data_dir, leaves unsuccessful/blocked freshness unchanged, preserves pending unseen failures, and caches fetched pages. Calculator builds outside tabs get filter/article headings; unreadable tree data incurs one retry cycle per command.
  • Guide export rejects a file output path before requests and replaces only old page HTML on re-export. Query scoring counts real title/name/label matches, and missing bundle roots/names fail consistently. Orchestration does not leave empty manifests or claim success when all provider/SimC work failed. Talent packets validate Beast Mastery and hero-tree builds without provider-specific identity mistakes.
  • Warcraft Logs sampled cohorts include live reports, filter the resolved encounter, deduplicate repeated listing pages and uploads of one pull by roster/timing, and disclose possible duplicates when rosters differ. Cohort fields use live_report_count, sampled_reports and live provenance; ranking labels no longer say finished, and empty samples explain the scope/how to widen it. Mistyped zone/boss/expansion/season ids fail with discovery guidance instead of empty results.
  • Warcraft Logs cast summaries exclude begin/empower events; actor/NPC/pet names are preserved and trash fights scope by fight id. Damage/buff/aura outputs name the correct actor/ability, fight-sourced single specs have high identity confidence, and clamped windows prevent uptime deltas using time beyond a fight. Missing reports/actors and rejected auth preserve appropriate codes; auth whoami and rate-limit never replay cached state.
  • Warcraft Logs report URL/site/region/guild-scope validation prevents wrong-site, unfiltered and foreign-host requests. Event windows with --start-time but no --end-time run to selected fight ends and echo the real end. GraphQL input files distinguish missing files from unreadable UTF-8. CLI enum flags show valid choices. API partial errors remain visible from every request; stored auth site-profile mismatches retain site_profile_mismatch with exit 3.
  • Blizzard, Warcraft Logs, Raider.IO and wrapper profiles normalize Oceanic regions to us and try correct realm slugs, accents/apostrophes and native-script index matches. Invalid regions fail locally. Blizzard blank/dot-only names and path-like inputs cannot read another endpoint; character names remain one encoded path segment.
  • Raider.IO recent runs no longer return null, missing profiles/realms use not_found, guild region is present, freshness reflects cached source age, and casing shares profile cache entries. Sample filters reject missing score/level runs and unknown class/spec/role/season values. Raid lookups name the valid discovery command. Thresholds never extrapolate beyond the sample and distinguish run score from player rating.
  • Lorrgs zones return data.zones, and user-report-fights without a selected fight fails missing_fight (exit 2). Lorrgs validates composition <name>.<op>.<n> filters, role codes and supported heroic/mythic ranking difficulties; --kill-time-min/max aliases preserve existing --killtime-* flags, repeatable --fight-id filters work, and empty rankings include notes. Normal/LFR search offers no invalid ranking command. Slugs/report codes cannot traverse paths; nonfinite zone ids and blank queries fail locally. Possessives/apostrophes normalize names without inflating partial scores; unknown spec routes can offer close slug suggestions. Resolve never fetches a composition ranking to test log availability.
  • SimC build/decode no longer succeeds after rejected hashes or incomplete/crashed binaries. Active talents exclude disabled hero roots, including every hero talent when no tree is selected; tiered entry ranks survive re-encoding, explicit talent overrides replace/clamp ranks as SimC does, and rejected old exports retain SimC's invalid_build reason. Talent edits match names with hyphens/commas, and cross-spec swap sources fail clearly.
  • SimC build harnesses retain supplied talents instead of load_default_talents=1; no-talent harnesses still load defaults. Build/compare disclosures identify default talents and low-level default gear. Rebuild previous harnesses and rerun comparisons. Action eligibility includes the action's own talent; inactive outputs include hero-tree gating, and branch comparison detects call-list/focus dispatch changes without reporting branches dead on both sides.
  • SimC APL parsing honors talent enabled/rank syntax and arithmetic precedence, fixes right-side profile comparison and reports invalid build inputs with decode codes. Unknown --list values expose available lists; --class filters reject unknown classes and compare full identities, so hunter never matches demon hunter. Validation returns warnings and treats warnings as invalid, comparison stops on them, and duplicate/case-colliding/path-like labels cannot overwrite profiles.
  • SimC handles missing binary/repo/files, invalid/empty profiles/presets, nontext input and TTY stdin without false completion, internal crashes or indefinite waits. analysis-packet requires simulation input for first-cast work. Temporary simulation/compare files are cleaned. first-cast uses the first actor, log-actions reports actors and adds --actor filtering, spell dumps search tokens/display names correctly, class filters use full identities and spec-file queries match all words/extensions without inconsistent fuzzy fallback.
  • SimC builds fresh checkouts with Release/no-GUI configuration, only the simc target by default and parallel compilation, leaving existing CMake settings intact. Output metrics use actual DPS confidence error rather than effective DPS, requested settings are not inferred from post-run iterations, and target-error runs say target_error_requested, not an unsupported assertion about early stopping. Raidbots shares corrected metrics, omits misleading requested-iteration counts, rejects HTML/error pages as missing reports and requires actual SimC options in explain-input.
  • Warcraft Wiki searches API/Event namespaces, preserves highlighted words, ranks named/system-matching titles correctly, extracts event arguments only from the top-level argument section and returns supported API reference families. Blank/invalid queries fail locally; maxlag/readonly/rate-limit errors use shared upstream codes. Provider transport messages are concise and retain the proper failure codes.
  • CurseForge addon errors distinguish rejected auth from missing addons, slug misses list popular name-search candidates, and request/changelog timeouts use timeout. Raw metadata ordering remains available beside sorted latest files. CurseForge coming-soon stubs echo the query string instead of a nested query object; auth errors point at the numeric addon-id form.

Removed

  • WowProgress binary/passthrough/docs/environment variables and warcraft guild-history; Raider.IO supplies current guild ranks and raid leaderboards. The root wheel drops curl_cffi.
  • warcraft guild-ranks, superseded by warcraft guild raid ranks; raiderio mythic-plus-runs, superseded by raiderio leaderboard mythic-plus with richer run fields and cross-page limits.
  • warcraft guide-compare-query --limit, the wrapper ranking override file, --profile debug, WARCRAFTLOGS_METADATA_CACHE_TTL_SECONDS, and wowhead cache-repair; use cache-clear --namespace legacy_unscoped [--expired-only].
  • Repeated top-level payloads; repeated row follow-up provider/kind; old search metadata/field names noted above; wrapper doctor language, shell_fallback, python_first and invocation_mode; repeated provider/command fields in Wowhead/Wiki doctor data.
  • Warcraft Logs buff-row reported_total, reported_active_time, reported_total_time, player-detail potion_use/healthstone_use, sampled stable_source_only, and sampled skipped_live_report_count. Aura compare totals use the renamed meaningful uptime/use fields. Refresh-token flags/state are removed from Warcraft Logs and Blizzard; Blizzard doctor drops auth.state, state_path and client_credentials_configured, retaining token-cache metadata.
  • Raidbots base/path-template overrides, doctor template note, handoff.ready_to_paste and misleading run_settings.iterations_requested; SimC sampled action_sequence_iterations; duplicate stdout fields in talent producer/upgrade/describe/provider results. Cache state lives only under provenance.cache, without flat fetched-at/hit/TTL copies.
  • Never-emitted shared error aliases unauthorized, forbidden and http_error.
  • Development commands make test-live, test-live-matrix, per-provider live suites, fmt-check, benchmark-cache, fixture-refresh-hints, run and lint-all; use e2e journeys and weekly keyless coverage. dev_deploy.sh --link-bin and worktree-env override variables are gone. Internal Python provider contracts move to warcraft_cli.provider_contract; warcraft_core drops submodule re-exports and load_env_file.