Hero / ability / trait CRUD
Full PHP CRUD (HeroRepository, transactional replace-children) wired to index/hero_edit/hero_save/delete + AI look editor. Live round-trip verified.
Hero / ability / trait CRUD
Full PHP CRUD (HeroRepository, transactional replace-children) wired to index/hero_edit/hero_save/delete + AI look editor. Live round-trip verified.
Design Workbench (spec/)
spec/ workbench: view/edit/new markdown via bundled Parsedown, own session+CSRF, path-guarded. 12 specs live and round-tripping.
Editable vocabularies (incidents, vice-states, vices, meters)
vocab.php "Incidents & Meters" editor: content for the 8 fixed incidents + 5 meters, hand-edited in the DB. NB vices/vice-states are now deprecated (back-compat only).
Map grid editor (map/)
map/ canvas editor + link-stairs tool; ground/first.json hand-authored (322/276 walls). MapModel derives rooms/rigs from it at runtime for the live game.
MP3 media library tool (media.php)
CMS-style audio library: upload/rename/preview/playlist-order/lobby-song. Backs every in-game sound dropdown (audio_tracks id).
Build-plan Kanban board (plan.php) — this board
Drag-and-drop across Undone / In play / Ready-for-test / Tested, per-phase tabs, computed progress (PlanRepository + assets/plan.js).
AI hero-appearance editor + shared pixel-sprite renderer
hero_appearance.php (Claude opus-4-8 -> structured {reply, appearance}) drives assets/sprite.js pixel avatars used by the chooser, editor and in-game.
Art-direction / 16-bit style experiment pages (art/)
art/styles.php + art/pixel.php visual-direction experiments, wired into the shared game nav.
Complete the 10-hero roster (abilities + traits each)
10 heroes exist with abilities; but trait wiring (causes_incident/trigger) is mostly blank and some abilities still point at legacy "Social". Not content-locked yet.
Finalise meters and vices → vice-states
5 meters + vice-states exist, but 4/5 meters lack an action verb/message/sound and 2 vice-states are unmapped. Not finalised.
Seed the incident catalogue into the DB
OBSOLETE as worded: incidents are now a FIXED code set (config.php W00T_INCIDENTS), NOT DB-seeded. Editable content authored for 7/8 incidents (too_old still uses code defaults).
Load roster/content from compw00ter.db (better-sqlite3)
Roster + content load via PHP/PDO in join.php/state.php (not better-sqlite3). Works end-to-end; ready_test because the only data-layer test (smoke.php) is stale.
Boot the WS server on port 6767
Server role built as PHP polling endpoints (join/state/leave/issue.php) over the shared SQLite DB; clients connect and the clock ticks end-to-end. The Node WS server on :6767 is DEFERRED (engine/ is a stub).
Client connect / identify / room model
Built via PHP polling: join.php token identify, state.php presence + 12s prune, MapModel authoritative rooms/at-rig. Node engine deferred.
Round/tick loop — in-game hours as ~30s rounds
GameStateRepository: authoritative 60s cycle with a trailing 20s game window (design refinement of "~30s rounds"), driven by state.php heartbeats. Node engine deferred.
Lose condition + score = party uptime
w00t clamps at 0 with no consequence — no lose trigger, no win condition, no uptime score. Only a cosmetic "PARTY UPTIME" label exists. Not started.
Schedule / timetable of hourly activities
The simplified fixed 60s cycle (roam vs game window) exists, but the spec's full timetable of distinct hourly activities / day progression is not built.
Per-room quorum check during the game window
Per-room at-rig COUNTING is wired (roomCounts -> HUD), but there is no quorum THRESHOLD / per-room flop — w00t recovery uses a single global at-rig count.
w00t fills on attendance, drains on empty chairs
Core Phase-4 goal works: w00t fills from at-rig attendance and net-drains on empty chairs (GameStateRepository.tick, server-authoritative at_rig). Wired; no automated test.
Incident HP model + tiers (blocker/puller/standard/supply)
OBSOLETE: the blocker/puller/standard/SUPPLY tier taxonomy + generic incident-HP model was superseded by the fixed-incident design (instant clear + collaborative mop-seconds). No "supply" tier. Not building as written.
Abilities: fight / cleanse / provide; type-match ~3×; escalation
OBSOLETE: fight/cleanse/provide flavours + ~3x type-match + escalation were dropped for a binary "power instantly clears a matched incident" model (see #22). Legacy enum/columns are unused.
Universal accidents (bladder->pee, drunk+weird->mess) + collaborative mopping
Built-in (not trait-driven): Bladder fills -> pee at a toilet or wet the floor; Booze+Unusualness both >75 for 12s -> a MESS. Spillages are mopped collaboratively (more moppers = faster).
"Too old" incident + Jae "Bedtime Grandpa" escort power
Just shipped. Sleep hits 0 -> frozen/slumped with zzz's; the-doctor's power BFS-escorts the sleeper + himself to the furthest empty bed, reviving fully-slept in 10s (45s floor-nap fallback).
Smoke-break mechanic (smoker flag -> walk to communal + timed lock)
Smokers get force-walked to the communal area and locked there for the 25s smoke-break, then auto-released (timed incident).
Meter drain over time; refill at a source
assets/game.js: 4 need-meters drain (0.7/s) and refill at fridge/barrel/bed/stash; Bladder inverts (fills, empties at a toilet). Fully wired into the HUD.
Traits fire at a meter extreme (reset + pull + spawn incident)
launch.js evaluateTraits: meter-extreme (>75 / <25, with a re-arm guard) OR random-timer traits spawn incidents via issue.php. Wired end-to-end per hero.
Game screen: meters, abilities, position, nearby incidents
launch/ HUD shows meters, powers (keys 1/2/3), local+remote positions (interpolated), and a live issue tracker + spillage banner. Built; no automated test / not live-driven this pass.
Movement between rooms / to sources
game.js walk engine: wall/furniture collision, doorways, cross-floor linked stairs, hold-E/Space to consume at sources. Positions synced via state.php. Wired.
Using abilities on incidents; targeting
Powers clear incidents by type within aoe(2 tiles)/global on a cooldown (issue.php clear); Bedtime Grandpa is a scripted targeting case. Wired; no live-session test.
design start screenad and hero choices
launch/ #chooser: styled "CHOOSE YOUR w00ter" grid with live animated pixel-sprite avatars -> join.php -> play. Built + styled; not browser-verified this pass.
add music and sound effects
Full audio layer: lobby + game playlist, mute, reference-counted music ducking, looping action SFX + incident/power one-shots, sourced from the Media MP3 library. Wired.
Single-player walkaround dev mode + multi-floor stairs
game/index.php harness: walk the traced venue and take linked stairs between floors, no server. The launch/ multiplayer client reuses this same engine.
Event timeline of director incidents & bosses
No event/timeline exists; the issues table is destructive (rows deleted on clear/expire). Would need an append-only event log + a UI on commander.php.
Trigger-now; inject incident (type/location/severity)
Only boss-summon exists; no arbitrary incident injection by chosen type/location. NB "severity" is obsolete — there is no per-instance severity in the current model.
Admin WS client with live match state
commander.php shows live status (players/w00t/phase/issues) but is a STATIC page snapshot — needs a polling loop to auto-refresh. (The "WS" framing is superseded by PHP polling.)
Drop a boss; fire a player's trait manually
Half done: "drop a boss" IS built (commander summon of the_wife/the_martin, one-at-a-time). "Fire a player's trait manually" is NOT built.
Commander: full-game Reset / kick-everyone + quick fixes
reset_game bumps app_settings.game_gen to bounce all launch clients back to the chooser + wipe live state; plus refill-w00t and clear-all-issues.
The hero counter-web
Deferred (not obsolete): the shipped type-based power/trait/incident model is a simplification; the hero-to-hero / tag-based counter-web relationships are unbuilt.
Team mini-games
Deferred: ambient co-op exists (shared mopping, mess-cleaning, Bedtime-Grandpa rescue) but no standalone timed team mini-games.
Bosses: The Wife, The Martin
the_wife (halts w00ting, server-side) + the_martin (drags players) fully wired: config + commander summon + launch/game.js effects, cleared only by a power. No automated test.
Balance passes
Distinct from initial number-picking: no iterative balance pass against real play (players table empty). The mechanics a balance pass would tune all exist.
LAN dry-run
All infra to host a 10-player LAN run is built (launch client, sync endpoints, Commander reset, full roster); the dry-run event itself hasn't been performed.
Number tuning (meter/incident/w00t rates)
All tunable rates exist as deliberate, commented constants (drain/fill/cycle/thresholds), but no iterative playtest-driven tuning has happened (spec still lists them TBD).