Character writeback in endEncounter wrote to a bare campaigns/{id} path,
which the firebase adapter passes straight to the SDK — the update hit a
nonexistent top-level doc, threw, and aborted the whole end-combat action
(round never reset, combat stayed running).
- endEncounter now uses ctx.campaignPath (full artifacts/... path from
App.js), falling back to the bare path for server/test adapters
- writeback failures no longer block ending combat
- regression tests: campaignPath routing, writeback-failure resilience,
and participants never cleared on end
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>