342a39a540
FrameId (replicated frame/class signal) now WRITTEN server-side at spawn for all players; the two class-HUD readers (ClassPrepPortal, MetaShop) read FrameId (with an AbilityRef fallback for pre-FrameId players) instead of ClassForAbility. The gym seeds a PER-FRAME default Spark loadout via ClassTraits.FrameLoadout — Harpooner (Ranger slot): reel/mobility/skillshots; Bathynaut (Warrior slot): pull-in/dash/zone-control. FrameId uses ecb.AddComponent (baked on the real player; absent on the minimal MetaSeeding test prefab). 497 EditMode green. Deferred to a focused pass (risky wholesale refactor, "still works" via the transition): full removal of legacy AbilityRef/AbilityCooldown/EffectiveAbility Stats (woven through equip/class/meta/StatRecompute + tests) and the CharacterId Bathynaut/Harpooner rename. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>