← All docs Games for Group · Overnight · 2026-08-02

Architecture review — what was wrong, what I fixed

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.

🔧 Seven real problems fixed, one of them a live bug: a finished game was invisible on your website. Everything is committed, tested and deployed. Then I reviewed my own fixes four times, which found more — including damage I had just done. One area I stopped working on deliberately and explain why below.

The one that was actually costing you something

🚨 Word Search was playable but did not exist on your website It has been finished and playable for weeks. On gamesforgroup.com it had no page, no card, and nothing for Google to find. Anyone searching for it landed nowhere.

The reason it went unnoticed is the part worth knowing. Your website keeps its own hand-typed list of games, and the test that is supposed to catch a missing game compared that list against another hand-typed list — which had also forgotten Word Search. The test passed by agreeing with the mistake.

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:

GameYour website saidThe game actually is
Word Search(missing entirely)2–8 players, 4 min
Snakes & Ladders2–4 players, 15 min2–6 players, 10 min
Trivia Clash"two to eight players"up to 30
Connect Four · Ludowrong icon · wrong typecorrected

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.

Everything else I fixed

What was wrongWhat 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.

Then I reviewed my own fixes — and found three I had broken

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.

🔁 The seat fix leaked seats — twice Stopping a locked phone from costing someone their game sounded simple. My first version made it worse: a guest who closed their tab during a game was never removed at all, so the next game dealt in a player who had gone home and froze on their turn. My second version looked right and had the same hole in a different place. Two reviewers caught it independently.

It is fixed, and there is now a test for it — there had been no test whatsoever for that part of the code, which is why every check stayed green through both broken versions.
What I brokeNow
Hosting a room quietly erased your saved colourSaving 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 tappedAnything 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.

And one thing I stopped working on

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.

⚠️ What is still imperfect on hotspot mode If a friend leaves while everyone is waiting in the lobby, and you start a game within a minute or so, they can still be dealt into it — and a turn-based game will wait forever for them. Same if you tap Rematch after someone has gone. The escape is the one you already have: remove them from the Players list, or End game.

Fixing it properly means teaching the offline mode to track who is connected — which also earns you a dimmed avatar so you can see who dropped, something it cannot show today. That is a proper piece of work with two phones on a desk, not an overnight patch.

Left for you — not because they are hard, because they are yours

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.

🔄 Where these stand now
QuestionStatus
Room size fixed before anyone arrivesAnswered. The host edits the seat count from the pencil on the room card.
"Ended" means two thingsAnswered. 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 duelAnswered. 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 failureOpen.
Seats held by people who leftAnswered 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 leaveOpen, and parked with the LAN pause.
QuestionWhy 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.

How I worked

StageWhat happened
Six reviewersEach given a different lens, and all told to hunt the specific failure you spotted: something that works perfectly while measuring the wrong thing.
A judgeTold to default to "no" and reject anything that was merely different rather than better. It threw out 15 of 40.
Fix, then proveEvery 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-reviewedA fresh adversarial pass over my own changes, looking for regressions I introduced.
Games for Group · Overnight architecture review · 2026-08-02 · Temporary — delete once the open questions above are answered. The lasting reasoning is in decisions and learnings.