generated from nhcarrigan/template
d1d1f70c75
- Fix strict-boolean-expressions in 7 route files (runtime body validation) - Fix no-unnecessary-condition in profile.ts and offlineProgress.ts (defensive null checks) - Extend v8 ignore next-N counts in game.ts to reach 100% coverage - Add CI requirements to CLAUDE.md (lint + build + test must pass before commit) - Add manual verification checklist (verify.md) - Remove progress.md
7.7 KiB
7.7 KiB
Manual Verification Checklist
Things our unit tests cannot verify — these need manual testing in a real browser with a live server.
Auth & Login
- Discord OAuth login flow works end-to-end (redirect → callback → JWT → game loads)
- Logging out and back in restores the correct game state
- A brand-new player (no existing save) gets a fresh game state with no errors
- A player with an outdated save (no
schemaVersion) sees theOutdatedSchemaModalon login- "Reset Progress" button nukes the save and starts fresh
- "Proceed with Bugs" dismisses the modal for the session but reappears on next login
- Cloud save attempts while on an outdated save are rejected (save button should fail gracefully)
- A player whose save was nuked server-side (v1 release reset) gets a fresh state, not a 404
Cloud Save
- Auto-save triggers every 60 seconds while the game is open
- Manual save (if applicable) works correctly
- Saving and reloading in a new tab preserves all progress
- Save is rejected with a helpful error if the schema version is outdated (HTTP 409)
Offline Progress
- Closing the tab and reopening after 30+ minutes shows the offline earnings modal
- Offline gold is calculated correctly (passive income × elapsed time, capped appropriately)
- Offline essence is calculated correctly
- Resetting progress clears offline earnings — after a reset, no offline modal should appear
Daily Login Bonus
- First login of a new day shows the login bonus modal with correct reward
- Consecutive days increment the streak counter
- Missing a day resets the streak to 1
- Day 7 reward (crystals) is awarded correctly
- Week multiplier applies for streaks beyond 7 days
- Streak is displayed correctly on the Character Sheet
Discord Integration
- Webhook on prestige: posting to the Discord webhook channel with correct message and player mention
- Webhook on transcendence: same as above
- Webhook on apotheosis: webhook fires AND Discord role is granted to the player
- Discord role grant requires the bot to have
Manage Rolespermission and the bot role to be above the target role - If Discord env vars are missing (dev environment), these silently no-op without crashing
Prestige / Transcendence / Apotheosis
- Prestige resets gold and adventurers but preserves story/titles/companions/achievements
- Prestige increments the prestige count correctly
- Transcendence resets prestige progress but preserves correct fields
- Apotheosis resets transcendence progress but preserves correct fields
- Story chapters unlock at correct milestone points (1st prestige, 5th prestige, 1st transcendence, 1st apotheosis)
Boss Fights
- Boss fight UI opens correctly and shows HP bar
- Win/loss outcomes are applied correctly
- Boss rewards (gold, equipment) are granted on win
- Zone unlock happens after final zone boss is defeated and final zone quest is completed
bossesDefeateddaily challenge counter increments in the UI after a win- Auto-boss toggle fires when a boss is available and the player is actively on the page
Quests
- Quest starts and the timer counts down in real time
- Quest completes and rewards are granted
- Quest failure (chance-based) resets the quest to available with ⚠️ indicator
questsCompleteddaily challenge counter increments in the UI- Auto-quest toggle fires when a quest becomes available
- Active companion quest-time reduction (Wren, Zuri) visibly shortens the timer
Exploration
- Starting an exploration works and shows in-progress state
- Cannot start a second exploration while one is in progress (all Explore buttons disabled)
- Exploration completes and rewards/codex entries are granted
- "Found nothing" outcome is handled gracefully (no crash, no reward)
adventurer_lossevent properly removes adventurers
Companions
- Companions unlock when the correct threshold is met (bosses defeated, quests completed, prestige, etc.)
- Setting an active companion applies the bonus correctly:
- Passive gold bonus (Lyra, Mira, Pria) — check gold income rate
- Click gold bonus (Finn) — check click power
- Boss damage bonus (Aldric, Kael) — check boss fight outcomes
- Quest time reduction (Wren, Zuri) — check quest timer
- Essence income bonus (Sera, Vex) — check essence accumulation
- Changing active companion takes effect immediately
Story System
- First zone boss defeat unlocks Chapter 1 and shows a toast notification
- Story tab shows unread dot badge when new chapters are available
- Reading a chapter and making a choice saves the selection
- Choice outcome is displayed after selection
- Completed choices are visible on the Character Sheet
- Story progress is preserved through prestige, transcendence, and apotheosis
{characterName}is substituted correctly with the player's character name
Titles
- Titles unlock when the correct milestones are reached
- Active title is selectable in the Character Sheet edit mode
- Active title displays on the public
/character/:idpage - Titles are preserved through prestige, transcendence, and apotheosis
Leaderboards
- Leaderboard page loads and displays real player data
- All 7 categories (gold, bosses, quests, achievements, prestige, transcendence, apotheosis) work
- Top 3 rows have medal highlighting
- Clicking a player's row navigates to their
/character/:idpage showOnLeaderboards: falsehides the player from all categories- Default is opted-in (new players appear on leaderboards)
Character Sheet & Public Profile
- Character Sheet tab loads and displays correctly
- Edit mode saves all fields (name, pronouns, race, class, bio, guild name, guild description, active title)
- Share button copies the correct
/character/:idURL and shows ✓ Copied! - Public
/character/:idpage renders for another player's ID - Equipped items (weapon, armour, trinket) display correctly with rarity colours
- Profile settings (showOnLeaderboards, etc.) persist correctly
Batch Hire
- Batch selector (×1, ×5, ×10, ×25, ×100, ×Max) updates all hire buttons
- Cost display updates to reflect batch price
- ×Max hires as many as the player can afford, down to 1
- ×Max is disabled (or shows ×0) if the player cannot afford even 1
Responsive Layout
- Game is usable on a 375px wide mobile screen
- Sidebar collapses to a horizontal strip on mobile
- Tabs scroll horizontally when there are too many to fit
- Resource bar wraps cleanly on small screens
Notifications / Toasts
- Achievement toast appears when an achievement is unlocked
- Codex toast appears when a new codex entry is discovered
- Story toast appears when a new chapter unlocks
- Login bonus modal appears on first daily login
- Offline progress modal appears when returning after time away
- Outdated schema modal appears for players with old saves
- All toasts auto-dismiss after a few seconds
Crafting
- Crafting a recipe deducts the correct materials
- Crafted item appears in inventory / updates stats
- Cannot craft without required materials (error shown)
1Password Secrets (Production Only)
DISCORD_MILESTONE_WEBHOOKis set and webhook posts succeedDISCORD_BOT_TOKEN,DISCORD_GUILD_ID,DISCORD_APOTHEOSIS_ROLE_IDare set and role grant succeeds- JWT secret is correctly injected
- MongoDB connection string is correctly injected