Capture pre-skill-apply XP and perk snapshots; on TryRecord loss reverse each applied skill row via negative delta and restore the perk snapshot so level-up unlocks from the loser call are reverted without clobbering a concurrent winner's XP.
AAA depletion test layout, source_kind_not_allowed assertion, HTTP inventory_full deny test, trim duplicate XP test, doc comments.
Add V004 perk tables, in-memory/Postgres stores, PerkUnlockEngine (tier-1 branch pick, path-auto tier-2 unlocks), level-up hook in skill XP grants, and AAA tests. Bruno docs note internal perk reevaluation on level-up (HTTP in NEO-48).