Signal-based store wrapping GameApiService.startCombat/getCombat/ performCombatAction with loading/error/actionPending state, following the HuntingStore/WorldStore pattern. startCombat failures clear any previously-loaded combat; loadCombat/attack failures preserve the last-known-good combat. attack() guards against re-entrancy and no-loaded-combat calls. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>