generated from nhcarrigan/template
chore: fix lint, ensure full CI pipeline passes, add verify checklist
- 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
This commit is contained in:
@@ -0,0 +1,200 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user