- player card shows the mock character (name, class, level, XP)
- add a spell via a vacant slot, undo with Ctrl+Z, redo with Ctrl+Y
- remove a spell empties its slot back to vacant
- a prepared spell survives a reload (autosave round trip)
- attune an item, reload keeps it, clear empties the slot
- undo/redo via buttons and via Ctrl+Z outside text fields
- focus guard: Ctrl+Z inside the campaign name field leaves the app
history untouched (the browser owns the field's undo)
- an undone state survives a reload (undo writes through autosave)
- Clear is undoable: one undo step restores the wiped dashboard
- campaign name survives a reload (autosave debounce respected)
- export/import round trip: Save downloads dashboard.json with the
current state, Clear blanks it via the confirm modal, Load restores it
- specs take BASE_URL env override (default stays localhost:3000)
- both new tests and the three smoke tests pass on chromium
README is now project-specific (features, stack, dev commands, docs).
The Playwright spec checks home/inventories/wiki render and asserts no
console errors.