3d7383b710
The bar's usable pairs were stored by a per-frame diff, and EditMacro's and a bag update's refresh fired at frame end, so ACTIONBAR_UPDATE_USABLE and a slot's IsUsableAction lagged their cause. **Reference** - Each slot write stores its pair (`0x4e58e0`, `0x4e590a`). - The refresh `0x4e5c00` runs at world entry, inside EditMacro (`0x4f132e`) and in the item watcher's run before BAG_UPDATE (`0x4f9374`). - Game entry zeroes the cache (`0x4e4f50`). - The reactive list keeps learn order (`0x5dea86`, `0x4b27b3`). **Changed** - Every writer stores its pair, and the refreshes run in place. - The cache zeroes at game entry. - The reactive list moves to its own resource, in wire order. - The per-frame diff and its event queue are gone. **Tests:** EditMacro's update inside the call, a bag run's between its packets, PlaceAction's listener reading its pair, the reactive order. Part of #2168. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>