You are browsing as a guest. Sign up (or log in) to start making projects!

5h 25m 30s logged

Learnova pre-ship devlog: live rooms, and the rating that stopped existing

Live 1v1 Debate shipped this session: two people, a four-character code, no accounts. The real decision was what a room actually is. Serverless functions don’t share memory between instances, so a Map tracking “does this room exist” lies half the time: the host creates it on one instance, the guest’s join lands on another, and the guest gets told the room doesn’t exist while the host sits inside it. The fix was to stop tracking existence at all. Presence on an Ably channel is the room.
Two bugs came out of testing that seriously. Only the host’s browser calls the judge, so the ballot was written entirely in the host’s frame, meaning both players read the host’s strengths and weaknesses in the second person. The judge now writes both ballots and mirrors them for the guest. Separately, a room was ending the moment the first person left instead of the last, kicking out the person who’d stayed.
This reverses the last devlog, twice. First, both elo modules got deleted: a single number going up and down implies a Round Mode run and a Debate round measure the same thing, and they don’t. That became a plain record instead. Then the record got deleted too. A debate ends on its verdict. A run ends on its own merit.
Results were also showing “+1,380 of 2,280,” a mental division at the exact moment someone wants one answer. It’s a score out of ten now. Anything above ten from an older build gets dropped, not converted, since converting needs a denominator that was never stored.
Cut this session: suggestion chips that turned “name a topic” into “pick one of these,” three motions that typewrote themselves onto the debate note for no functional reason, a /proof page that was a third way into a landing page whose whole point is two ways in, and thirteen dead exported symbols nothing was calling. The “get the ballot” button is gone entirely. The eighth speech lands and the round goes to the judge automatically.
The palette got rebuilt from the logo itself. The dark background is sampled directly off the asset, with every neutral swapped for the grey of equal relative luminance so the tuned contrast ratios held. Type warmed to the logo’s cream, the accent became the star’s gold.
Two prompt bugs got caught: the voice instructions were teaching third person inside their own example, and the ballot voice used bare letters “A” and “B” that occasionally read as “a flaw in A’s hanging out point.” Worst near miss: a case insensitive fix for the letter “A” also matched the article “a,” and shipped “with they cheaper alternative” through a live judge call before it was caught. A separate bug turned numbered lists into one run on line, fixed and property tested against 200 random chunkings.
Copy got more honest too. The unavailable state message used to claim nothing typed had been lost, which the app has no way to know. Bigger one: every AI call was failing with a raw “HTTP 402” shown to a student, telling them to retry something that couldn’t succeed, because the shared API key ran out of balance. That’s now a plain message saying it can’t be fixed by retrying.
The README’s status section had gone stale before, so it got corrected twice this session. First pass: a full eight speech live debate across two real browsers, timed, sub second speech sync, 1.6s to join, and a 15.2 second delay before a disconnect is detected, recorded honestly instead of rounded down. The judge call was stubbed that pass since the key had no balance. Second pass, after the key refilled: two real judge calls, two genuinely different ballots, no leaked letters. Still open: a judge call made from inside a live room and mirrored to the guest has only been checked against a stub, not the real thing.
Built with Claude Code. AI assisted commits carry Co-Authored-By trailers.

0
9

Comments 1

@ranveergill

Idk why the screenshot is like that sorry