# TODO Backlog of bugs + long-term items. Milestones live in REWORK_PLAN.md. ## Open ### dm list - keep active particpant in view (scroll) not sure good way to do this ### npm install warnings cleanup pass lots of updates ### TEST GAP: current branch changes need focused coverage - Storage `where()` contract: firebase + server adapters should honor `[where('encounterPath','==',x), orderBy('ts','desc'), limit(n)]`. - Server SQL query test: `where + orderBy + limit` should return latest logs for one encounter only. - Undo/redo stack order: undo A3 then A2, redo must replay A2 first, then A3. - Combat controls should not subscribe to logs while mounted; undo/redo should query logs only on click. - Unified CLI smoke: `node scripts/combat.js verify ` returns CLEAN on known-good log. - Unified CLI replay smoke: `node scripts/combat.js replay ... --out tmp/x.json` writes JSON array and auto-verifies. - Ctrl-C replay behavior: SIGINT during replay should end encounter, clear active display, write partial log, run verify. - SQLite schema/index test: `idx_docs_parent_ts` and `idx_docs_parent_encounter_ts` exist for server DB. ### confirm warnings treated as error = fail in all tests, build pipeline, linters, everything. again. ### BUG: addParticipants (batch add) does not slot by initiative - shared/turn.js addParticipants appends `[...existing, ...new]`, no slotIndexForInit. - Violates INIT doc: "Add = insert into slot by initiative." - Single addParticipant slots correct. Batch (add-all-chars) appends. - Pre-start batch add = wrong order. Post-start worse. ### BUG: nextTurn throws on solo combatant - nextActiveAfter loop `for step=1; step updatedParticipants.find(p => p.id === id && p.isActive)` - Returns participant obj (truthy) not boolean. Works by accident, fragile. ### BUG: select campaign during active combat = screen flicker, no action - In active encounter, click different campaign → flicker, no nav, no end. - Either block (toast: end encounter first) or auto-end current + switch. - Decide UX before fix. ### FEAT: generic/non-5e rules mode - Campaign/encounter ruleset toggle: `5e` vs `generic`. - Generic mode turns off death saves/state machine. - Generic mode allows negative HP. - 5e mode rejects negative damage/heal and clamps HP at 0. ### FEAT: clarify "Is NPC" in add-participant - Ambiguous label. May expand work based on what NPC means here (ally? monster? display-only? skip in turn order?). Clarify intent before UX changes. ### quality of life fix: 2. UI says "Campaign Characters", field is players --- naming mismatch (separate concern, flag for later) ## FEAT - parallel campaigns ## FEAT - multi user ## FEAT - clarify what end encounter does and what initiatives reset means ## Done (history)