---
status: partial
phase: 04-server-rebuild-mvp
source: [04-09-SUMMARY.md, 04-VERIFICATION.md]
started: "2026-05-07T00:00:00Z"
updated: "2026-05-07T00:00:00Z"
---

## Current Test

[awaiting Phase 5 Fly.io staging deploy for Tests 1+3; Test 2 partial-pass]

## Tests

### 1. kill -9 mid-tick SQLite recoverability — verify on first Phase 5 Fly.io staging deploy
expected: `PRAGMA integrity_check` returns `ok` after a Linux SIGKILL of the server mid-tick; `characters` table remains queryable; no SQLite corruption marker files; server restarts cleanly against the same DATABASE_URL.
why_human: OS-signal-semantics-dependent. User has no Linux dev environment locally; Windows cannot reliably exercise SIGKILL against an in-flight SQLite WAL write (Win32 TerminateProcess differs from POSIX SIGKILL semantics enough that a Windows-host run would not validate the Fly.io target case). Fly.io is the first real Linux host this server will land on, so the natural place to run this check is the first Phase 5 staging deploy.
procedure: see `.planning/phases/04-server-rebuild-mvp/04-09-SUMMARY.md` §"Manual Verification (Phase 5 Debt)" for the verbatim 6-step procedure (build + start + SIGKILL + restart + integrity_check + WAL inspect).
result: [pending — Phase 5 staging]

### 2. Two ws clients move + chat in same room over deployed-style boot
expected: Boot `pnpm --filter @rebno/server start`; open two scripted ws clients; send move intents from both; verify state-diff envelopes contain both players; verify chat round-trips end-to-end; visual jitter/feel acceptable.
why_human: End-to-end multi-client UX feel — integration tests cover protocol surface but not jitter/visual smoothness. Listed as a Manual-Only Verification in 04-VALIDATION.md. Closing this gives early confidence ahead of CLI-08 (Phase 6 hard milestone).
procedure: terminal 1: `pnpm --filter @rebno/server start`; terminal 2: run two-client smoke script (or two `wscat` sessions completing the Colyseus reservation handshake). Drive 30 s of move + chat from both. Inspect state-diff payloads (msgpackr-decoded) and chat broadcasts.
result: [partial — 2026-05-07] Protocol-surface multi-client move+chat passes via integration suite (`pnpm --filter @rebno/server test:integration` 24 passed / 1 todo on 2026-05-07; covers `authority.integ.test.ts` + `reconnect.integ.test.ts` + `auth.integ.test.ts`). Visual jitter/feel deferred to Phase 6 — first time a real Phaser/Pixi client hits the server. No explicit gap here; integ surface is structurally clean.

### 3. argon2id memory parameter feel under load
expected: Hash time on representative hardware lands in [200ms, 500ms] target band per CONTEXT D-07.
why_human: Memory-cost tuning is workload-dependent; CI machines differ from prod. Listed as a Manual-Only Verification in 04-VALIDATION.md.
procedure: `cd apps/server && N=10 node scripts/argon2-bench.mjs`. The script hashes a fixed payload N times against ARGON2_OPTS and reports mean/median/stdev/min/max plus IN-BAND verdict.
result: [partial — 2026-05-07] Local Win11 dev-box bench: mean 25.0ms, stdev 0.8ms (10 iter, node v25.8.2 win32 x64). Far below the 200-500ms band — but the band targets prod hardware (Fly.io shared-cpu-2x), which is significantly slower than this dev-box. Weakening params on a fast dev box would weaken prod security; OWASP-2026 minimums are correct. Re-bench on first Phase 5 Fly.io staging deploy. If Fly bench < 200ms, bump `memoryCost` (e.g., 65536→131072) or `timeCost` (3→4) coordinated with a sign-in flush so freshly-rehashed legacy passwords don't downgrade. Bench script committed for Phase 5 carry-forward.

## Summary

total: 3
passed: 0
issues: 0
pending: 1
partial: 2
skipped: 0
blocked: 0

## Gaps
