3.3 KiB
3.3 KiB
HANDOFF.md — Session Handoff (OVERWRITE at the end of every phase or when context is getting long)
Read order for a new session:
NOTES.md→STATUS.md→ this file → then work. If this file disagrees with the code, trust the code and fix this file.
1. Where we are
- Last completed step: 4.4 (hunt endpoint) + a full review/fix pass
- Next step: 4.5 — hunt UI (needs
GET /api/zonesfirst, see STATUS issue 2) - Updated: 2026-10-20
- Was the last session cut off mid-task? No
2. Verified state (run these first)
| Command | Expected |
|---|---|
npm install |
succeeds (better-sqlite3 is a native module; needs Node 20+ and a C++ toolchain if no prebuilt binary) |
npm run migrate |
applies 001–004 and 006 / "nothing to do" |
npm test |
93 passing, 0 failing (69 unit + 24 integration) |
3. What exists now (files that matter)
src/game/stats.js—calcDerived()is the ONLY derived-stat formula. Also re-exports xpToNext/checkLevelUp (implemented inleveling.js).src/game/combat.js—resolveCombat(hero, monster, rng); both sides attack each round, faster first.src/services/huntService.js—hunt(characterId, zoneId, {rng, now}); ONE transaction; test-injectable.src/services/characterService.js—createCharacter,getCharacterProfile,getCharacterIdForUser.src/utils/time.js—now()/setNow()/resetNow(); never callDate.now()in services.src/middleware/session.js— real SQLite session store (timer unref'd).src/db/migrations/003_content.sql— also SEEDS zones/monsters/items/loot (INSERT OR IGNORE). Changing balance = NEW migration, never edit 003.tests/helpers.js—setup()/teardown()/cleanup(): fresh app + temp DB per call.tests/integration/hunt-service.test.jsshows how to force outcomes with test-only zones.
4. Half-finished / fragile things
- No
GET /api/zonesyet;public/js/game.jshas no hunt UI yet (4.5). - HP never regenerates naturally; only level-up restores it (Rest/potions in Phases 5–6).
- No restart-persistence test for sessions.
5. Decisions & deviations from the docs
- D-004..D-007 in
docs/DECISIONS.md(combat rounds, equipment counted once, session store, clock).
6. Gotchas learned
npm testmust benode --testwith NO path/glob; files must be named*.test.js. A shell glob once skipped 17 tests.- better-sqlite3-session-store ignores
clear:false; that's why the timer is unref'd. - Statement caches are per-DB-handle (WeakMap) in huntService; copy that pattern for new services.
- Verify test COUNT, not just "all passing".
7. Next-step briefing (4.5)
- Goal: zone list + Hunt button + combat log replay + result summary + level-up message on the dashboard.
- Docs: API.md §Hunting, UI_GUIDE.md §game.html, GAME_DESIGN.md §Combat.
- Files: add
src/routes/zones.js(+ service fn) and mount in app.js; extendpublic/game.html+public/js/game.js; add an integration test forGET /api/zones. - Watch out for: use
textContent(no innerHTML); show energy cost on the button; disable button while request is in flight; re-sync energy from the hunt response (data.energy,data.hpRemaining,data.hpMax).
8. Open Known Issues
STATUS.md issues 1–6 (balance, zones endpoint, dangling seed script, restart test, equipment-in-combat, HP regen).