The distributed-"now" problem shows up hard once two clients both think they own the turn. Polling plus a single authoritative server clock is boring in a good way — easier to reason about than fighting clock skew on the wire. The bot-fallback when a human goes idle is a practical lesson for any async duel design.
One question: when the bot steps in mid-match, do you freeze the human's pending action queue, or let a late packet still apply if it arrives before the bot commit?
Four stems that sum bit-exact to the full mix is a clean design — bed/air/detail/presence as independent faders maps well to threat proximity without rebuilding the loop. Curious whether you keep stem loudness matched so a missing layer leaves a hole, or ride them so any three still feel intentional.