# 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 the `OutdatedSchemaModal` on 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 Roles` permission 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 - [ ] `bossesDefeated` daily 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 - [ ] `questsCompleted` daily 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_loss` event 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/:id` page - [ ] 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/:id` page - [ ] `showOnLeaderboards: false` hides 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/:id` URL and shows ✓ Copied! - [ ] Public `/character/:id` page 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_WEBHOOK` is set and webhook posts succeed - [ ] `DISCORD_BOT_TOKEN`, `DISCORD_GUILD_ID`, `DISCORD_APOTHEOSIS_ROLE_ID` are set and role grant succeeds - [ ] JWT secret is correctly injected - [ ] MongoDB connection string is correctly injected