## v1.9.0

### Database â€” NewDatabase API
- **`RGX:NewDatabase(name, defaults, opts)`** â€” metamethod-based profile access
  - `db.key` reads from active profile, falls back to defaults at read time
  - `db.key = v` writes to active profile
  - `db.global` returns cross-character storage table
  - Profile CRUD: `CreateProfile`, `LoadProfile`, `DeleteProfile`, `RenameProfile`, `CopyProfile`
  - `OnProfileChanged(fn)`, `ResetProfile`, `GetProfiles`, `GetActiveProfile`
- Single `DB` metatable replaces dual `DBHandle`/`NewDBMeta` split
- `RGX:OpenDB` is now a 4-line wrapper around `RGX:NewDatabase` â€” backward compatible
- Step-by-step factory: init global â†’ build proxy â†’ merge defaults â†’ ensure Default â†’ pick active â†’ fire callback

### Events â€” Combat Lockdown Safety
- Removed `pcall(frame.RegisterEvent, frame, event)` â€” raw C function reference through `pcall` triggers taint during combat
- Replaced with `pcall(function() ... end)` anonymous Lua closure â€” traceable call chain, no taint
- `RGXCombat` returned to dormant status: `RegisterEvent` is fundamentally blocked on addon frames during loading screen into combat zones (battleground, arena, world PvP)

### Roadmap
- Added RGX-Mod phased dependency table with framework API readiness tracking

### Misc
- Helper renames: `deepMerge` â†’ `MergeDefaults`, `getByPath` â†’ `GetPath`, `setByPath` â†’ `SetPath`
- `NotifySwitch` guard prevents re-entrant callback chains
- `InCombatLockdown` guard in `RGXCombat` init with `PLAYER_REGEN_ENABLED` retry fallback
