You asked for a review that questions whether things are designed right, not just whether they work. Six reviewers went through the app that way, a second round threw out anything that was only an opinion, and I fixed what was left.
So I made the check derive from the real games instead of from a second typed list. The moment it could actually see, it found four more things wrong:
| Game | Your website said | The game actually is |
|---|---|---|
| Word Search | (missing entirely) | 2–8 players, 4 min |
| Snakes & Ladders | 2–4 players, 15 min | 2–6 players, 10 min |
| Trivia Clash | "two to eight players" | up to 30 |
| Connect Four · Ludo | wrong icon · wrong type | corrected |
Visitors were reading wrong numbers when deciding whether a game suited their group. All corrected, Word Search added with artwork, and the check now fails the build if it ever drifts again.
| What was wrong | What it meant for a player |
|---|---|
| Two game lists nothing compared | The app and the server each kept their own list. Forget one line when adding a game and the host picks it in front of friends and gets "Unknown game". Every test would still have passed. Now one list, and a test proves they match. |
| Everyone retyped their name at every party | The app was saving each player's name — filed under the room code, which is used once and never again. So it could never help anyone. Names and colours are now remembered on the device and prefilled, still editable. |
| Locking your phone threw you out of a hotspot game | On the offline mode, a phone screen locking for 10 seconds removed you from the match — Tambola tickets gone, and you could not rejoin. Phones drop their connection the instant the screen locks, so this hit people sitting next to the host. A dropped connection now never costs a seat during a game. |
| Friends could end up the same colour | Colours were kept distinct based on the seat limit the host picked, not on how many people were actually there. Set 12 seats, play with 4, and three of you could all be pink — on the board, in the standings, everywhere. Now based on who is present. |
| A "Leave" button that always failed | Tic-Tac-Toe and Connect Four cannot continue if someone leaves — correctly. But the Leave button still showed, so a guest tapped it, confirmed, and got a red error. Every time, by design. Those games now say "Host ends the game" instead. |
| A hotspot room showed a shorter code than an online one | The same rules were written out by hand in four places, each with a comment claiming they matched. They did not: offline rooms still used 4-character codes after online moved to 6, and offline skipped the name cleaning that blocks invisible-character impersonation. All four now read from one place. |
| Three parts of the server disagreed about who is seated | A field marked optional "for old data" that has never existed. Where it was missing, one part read "nobody is seated", another "everybody", another "everyone is watching". The first one quietly disabled the guard that stops a player abandoning a live game and freezing it for everyone. The field is now required and the guesswork is gone. |
You asked me to loop until I was satisfied. That mattered: a fresh adversarial pass over my own work found real damage I had just done.
| What I broke | Now |
|---|---|
| Hosting a room quietly erased your saved colour | Saving now reads what is already stored instead of trusting memory that had not loaded yet |
| The join screen could overwrite a colour you had just tapped | Anything you touch is never overwritten |
| I left a note in the developer guide contradicting the paragraph above it | Deleted. It would have told the next person the website check was optional — the exact mistake that hid Word Search |
Worth saying plainly: several of tonight's problems were mine, found only because the fixes were reviewed as suspiciously as the original code. The lessons are in the permanent notes so the next session inherits them.
The hotspot seat problem beat me. Four attempts, each of which fixed the case I aimed at and broke a different one, and every attempt passed every automated check. So I stopped, because a fifth guess at 4am on a mode I cannot test without two real phones is not engineering.
The real cause, which is worth your knowing: the offline mode never records whether a player is still connected. The part that runs the game knows who the players are; the part that handles the network knows who is online; nothing joins the two. So every fix was me trying to guess connectedness from timers, and every guess had a gap.
The review raised more than I fixed. These are the ones where the right answer is a product decision rather than a correctness one, so I stopped and wrote them down.
| Question | Status |
|---|---|
| Room size fixed before anyone arrives | Answered. The host edits the seat count from the pencil on the room card. |
| "Ended" means two things | Answered. A room stays open while its host holds a seat, the door takes knocks mid-game, and a room closes only after thirty minutes of silence. |
| An abandoned duel | Answered. Leaving a duel is a right: the match stops short and nobody is crowned. The "Host ends the game" wording in the table above is gone with it. |
| The host as a single point of failure | Open. |
| Seats held by people who left | Answered for Remove. Mid-match the game drops the seat first, then the room forgets them; in the lobby the seat frees at once. Either way they can knock again and be let into a free seat (tested 2026-09-14). Someone who just goes quiet keeps their seat until the host removes them. |
| Hotspot seats after a lobby leave | Open, and parked with the LAN pause. |
| Question | Why it is yours to answer |
|---|---|
| Room size is chosen before anyone arrives, and cannot change | Nobody knows how many friends are coming. A host who takes the default 8 and gets a 9th friend must close the room and start again with a new code. Letting the host raise it mid-lobby is easy — but it changes the hosting flow, and that is your design. |
| "Ended" means both "between games" and "closed forever" | A friend tapping your link while the group looks at the winner screen is told the room is over and to ask for a new code — when one tap later they could have walked in. |
| The host is a single point of failure | The host is just whoever tapped first. If their battery dies mid-game, nobody can start, end or restart anything. Handing the host role to someone else is a real feature with real design questions. |
| Seats are held by people who already left | The app knows who is actually connected, but only uses it to dim an avatar. Someone who closed their tab still occupies a seat, so a room can say FULL with four people in it. |
| An abandoned duel is a void match, not a win | If your opponent's phone dies when you are one move from winning, the only exit is End game, which awards nothing. Whether that should become a forfeit win is a rules call. |
| Stage | What happened |
|---|---|
| Six reviewers | Each given a different lens, and all told to hunt the specific failure you spotted: something that works perfectly while measuring the wrong thing. |
| A judge | Told to default to "no" and reject anything that was merely different rather than better. It threw out 15 of 40. |
| Fix, then prove | Every fix ships with a test that would have caught the original problem. All gates green after each one; hosting a real room on the live site verified at the end. |
| Then re-reviewed | A fresh adversarial pass over my own changes, looking for regressions I introduced. |