v2.10.0
What's new
RGX-Framework v2.10.0
Package: RGX-Framework-v2.10.0.zip, 105 runtime files, plus release.json.
Behavior changes
CreateProfileon an existing name now returnsfalseinstead of wiping the profile, andRenameProfilerefuses same-name and occupied targets. Previously a duplicate create silently reset the user's settings; these paths now fail loudly and safely.DeleteProfileon the active profile falls back to the protectedDefaultprofile deterministically.- Declaring
optionswithoutdb(and without atablecarrying its owndb) now errors at registration instead of silently building no panel at ADDON_LOADED. The declarative contract documentsoptionsas db-bound; consumers now see the mistake immediately. - Strict control-table validation on page/card layouts: unknown or empty control tables (
{},{ toogle = "x" }), multi-kind controls, buttons without actions, and holes in control lists are rejected at declaration instead of silently rendering nothing. - The
C_AddOnsglobal polyfill is removed. The framework no longer writes_G.C_AddOnson clients that lack it; every framework call site carries its own legacy fallback, so behavior is unchanged on every supported flavor, but co-loaded addons that testC_AddOnsto detect the client no longer misdetect. RGX:QueueForCombatnow returnsfalse, "queued"when deferring so callers can distinguish a combat-deferred call from an immediate execution result; queued operations remain fire-and-forget at the flush.- RGXReputation seeds first sightings silently: a faction seen for the first time (login, discovery, a Classic header expanding) no longer fires a spurious
OnRankUpfrom zero or a phantomOnGain; gains fire only for real deltas, and duplicate faction names are tracked separately by faction ID.
Fixed
- A non-callback error inside event dispatch can no longer wedge the session:
RGX:FireEventrestores_dispatchDepthon every exit path and reports the fault through the failure-isolated error channel instead of latching registrations pending forever. String-method owners that break after registration are isolated per handler. - Profile serialization round-trips backslash paths:
Interface\AddOns\BLU\sounds\levelup.oggand every escape character survive export/import through a single-pass decoder (the old chained-gsub decode corrupted them). Table keys are escaped; the wire format is unchanged. - Migration progress is durable: a failing migration step no longer re-runs earlier steps on every login.
- Unit-event dispatch snapshots its handler bucket like the plain-event path, so handlers registered mid-dispatch no longer run in the same dispatch.
- OnPlayerHealed passes the real overheal (payload index 16) instead of the absorbed amount, and the combat-log payload is captured exactly once per event instead of up to nine API calls.
- Light media rescans no longer wipe generic-scan bridge results; first currency gains of a session fire via the event's own
quantityChange; quest progress suppressed by the 0.25s cooldown is delivered on the next update instead of being lost. - The default slash handler prints actionable guidance instead of a literal
v?placeholder. - Slider snapping is relative to
min, so sliders can reach their own minimum (min=1 step=2 now yields 1,3,5,7,9). - The internal error log is bounded at 50 entries and drops the oldest reports.
- Dead code removed: the never-called
reportEventRegistrationErrorand the never-trueallFrameEventsRegisteredflag; the superseded colorpicker SV-box/hue-bar builders (~168 lines) whose live counterparts already guarded dragging. - Dispatch-side test coverage grew the events harness 74→120 checks and the login harness 32→123, plus new combat (13 checks) and reputation/loot/quest gameplay gates. A dev-only
mutation-smoketool measures test strength: events 69%, runtime 68% killed on full enumerations.
Tooling
- The shared GitLab
mirror:githubjob now falls back to plain forward-only pushes for consumer repos (the sanitizer path stays framework-only), fixing consumer tag mirroring. - The framework-only
framework:gatesGitLab job runs the full validation set on every push and MR. - Release secrets are step-scoped; validation installs run
--ignore-scripts. - Font binary gate: every shipped
.ttf/.otfmust carry real sfnt/OTTO magic; font license terms now ship with the package.
Contract provenance
RGX.CONTRACT_FORMAT_VERSION(independent of release numbering),RGX:SupportsContract, andRGX:RequireContractimplement the compatibility handshake; generated TOCs carry## X-RGX-Contract-Formatand engine-computed## X-RGX-Framework-MinVersion.- The approved module API catalog now records safety categories and preview modes for all shipped modules, and the coverage boundaries are documented (automatic external discovery is sound-only).
Compatibility
- Retail
120105, WoW Forever16001, Classic Era11509, TBC20506, Wrath/Titan38002, Cataclysm40402, Mists50504— unchanged from v2.9.0.
This mod has no additional files

