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

ranveergill

@ranveergill

Joined August 5th, 2026

  • 10Devlogs
  • 2Projects
  • 1Ships
  • 13Votes
Open comments for this post

30m 37s logged

trimmed it down and tried to remove anything that could be potentially flagged as ai. i kinda think it looks better now, anyways running out of devlog content haha

0
1
95
Open comments for this post

31m 16s logged

recent rejection said round mode doesnt work
i think it might have just been in an api rate limit thing as i wasnt able to find anything proving thats actually true

0
1
71
Open comments for this post
Reposted by @ranveergill

16m 52s logged

idk why i keep getting rejected for ai use
my last rejection literally said “emojis in readme convey ai use”, ive never had any emojis in the readme ever. anyways devlogging cuz i wanna claim my 16 mins of skimming docs

0
1
89
Open comments for this post

16m 52s logged

idk why i keep getting rejected for ai use
my last rejection literally said “emojis in readme convey ai use”, ive never had any emojis in the readme ever. anyways devlogging cuz i wanna claim my 16 mins of skimming docs

0
1
89
Open comments for this post
Reposted by @ranveergill

3h 3m 52s logged

everything is a window now
whole app reskinned. every screen sits in a title bar and a paper body on a dark desktop, hard borders, no rounded corner left anywhere, 71 of those came out

the token swap broke the landing immediately. –ink went #101010, –ground went #2b2b2b, and the headline sits straight on the ground, so LEARNOVA was black on near-black. wrapping screens in a window fixed it. i would have shipped that on the arithmetic

two bugs turned out to be the same shape. the notes sheet had tape, punch holes and a pencil at -right-7, all deliberately outside the container, which nobody notices until a screen has a border. and the timer was a conic-gradient ring with a bg-ground disc punched out to make its hole, so once bg-ground became the desktop it drew a dark circle on a white toolbar

/feed shipped. no CI on this repo, check-runs returns total_count: 0, so the build half is the deployments api. unauthenticated github is 60 an hour per ip and that ip is the whole deployment, so the answer sits on globalThis for 60 seconds

the palette went round the houses. the title bar started as the blue off the reference screenshot, the only colour in the app from outside its own set, then charcoal which read as the old learnova, then mint, then cream warmed toward the star’s gold. i said the blue was gone twice before it actually was, cuz the first pass only moved the title bar and –accent-wash is what paints ::selection

worst near miss: computeRoute(“/debate/live/QBTR”, {code:“QBTR”}) came back unmasked and i had most of a paragraph written abt room codes leaking to analytics. turnValueToRegExp wasnt in scope, so it hit the function’s own catch and handed the input straight back. with the helper in scope its /debate/live/[code]

still emulated chrome on one machine. analytics loads but has never reported, that only happens off a deploy

0
1
124
Open comments for this post

3h 3m 52s logged

everything is a window now
whole app reskinned. every screen sits in a title bar and a paper body on a dark desktop, hard borders, no rounded corner left anywhere, 71 of those came out

the token swap broke the landing immediately. –ink went #101010, –ground went #2b2b2b, and the headline sits straight on the ground, so LEARNOVA was black on near-black. wrapping screens in a window fixed it. i would have shipped that on the arithmetic

two bugs turned out to be the same shape. the notes sheet had tape, punch holes and a pencil at -right-7, all deliberately outside the container, which nobody notices until a screen has a border. and the timer was a conic-gradient ring with a bg-ground disc punched out to make its hole, so once bg-ground became the desktop it drew a dark circle on a white toolbar

/feed shipped. no CI on this repo, check-runs returns total_count: 0, so the build half is the deployments api. unauthenticated github is 60 an hour per ip and that ip is the whole deployment, so the answer sits on globalThis for 60 seconds

the palette went round the houses. the title bar started as the blue off the reference screenshot, the only colour in the app from outside its own set, then charcoal which read as the old learnova, then mint, then cream warmed toward the star’s gold. i said the blue was gone twice before it actually was, cuz the first pass only moved the title bar and –accent-wash is what paints ::selection

worst near miss: computeRoute(“/debate/live/QBTR”, {code:“QBTR”}) came back unmasked and i had most of a paragraph written abt room codes leaking to analytics. turnValueToRegExp wasnt in scope, so it hit the function’s own catch and handed the input straight back. with the helper in scope its /debate/live/[code]

still emulated chrome on one machine. analytics loads but has never reported, that only happens off a deploy

0
1
124
Open comments for this post
Reposted by @ranveergill

5h 25m 30s logged

live rooms, and the rating that stopped existing
live 1v1 debate shipped. two people, a four character code, no accounts

the real decision was what a room even is. serverless functions dont share memory between instances, so a Map tracking whether a room exists lies abt half the time. host creates it on one instance, the guest’s join lands on another, and the guest gets told the room doesnt exist while the host is sat inside it. so nothing tracks existence any more. presence on an ably channel is the room

two bugs that only turned up by testing it properly
only the host’s browser calls the judge, so the ballot came back written entirely from the host’s side. both players read the host’s strengths and the host’s weaknesses in the second person. the judge writes both ballots now and mirror swaps them for the guest

and a room was ending when the first person left instead of the last, which threw out whoever had stayed

this reverses the last log, twice
both elo modules got deleted. one number going up and down implies a round mode run and a debate round measure the same thing, and they dont. it became a plain record instead

then the record got deleted too. a debate ends on its verdict and nothing counts up across rounds

results were showing +1,380 of 2,280, a division you have to do in your head at the exact moment you want one answer. its a score out of ten now. anything above ten written by an older build gets dropped rather than converted, cuz converting needs a denominator that was never stored

cut
suggestion chips, which turned “name a topic” into “pick one of these”. three motions that typewrote themselves onto the debate note for no functional reason. /proof, which was a third way into a landing page arguing there are two. thirteen exported symbols nothing was calling

and the “get the ballot” button. the eighth speech lands and the round goes to the judge on its own

palette
rebuilt off the logo. the dark ground is sampled straight out of the asset, and every neutral swapped for the grey at the same relative luminance, so the contrast ratios that were already tuned still hold. type warmed to the logo’s cream and the accent became the star’s gold

two prompt bugs
the voice instructions were teaching third person inside their own example. and the ballot voice used bare letters A and B, which now and then came out as “a flaw in A’s hanging out point”

worst near miss of the session: the case insensitive fix for the letter A also matched the article “a”, and shipped “with they cheaper alternative” thru a live judge call before anybody caught it

separate one, numbered lists were coming out as a single run-on line. fixed, and property tested against 200 random chunkings

copy
the unavailable message used to claim nothing youd typed had been lost, which this app has no way of knowing

bigger one. every ai call was failing with a raw HTTP 402 on a student’s screen, telling them to retry something that was never going to work, cuz the shared key had run out of balance. it says plainly that retrying wont fix it now

readme
the 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, 1.6s to join, each speech reaching the other window in 423 to 1039ms, and a 15.2 second wait before a disconnect gets noticed, written down as measured rather than rounded down. the judge was stubbed that pass, the key had no balance

second pass, once the key refilled: two real judge calls, two genuinely different ballots, no stray letters

still open: a judge call made from inside a live room and mirrored to the guest has only ever been checked against a stub

1
1
23
Open comments for this post
Reposted by @ranveergill

4h 58m 32s logged

deleting the score
biggest change this session was taking things out. round mode had points, a running total and a combo multiplier. all three gone!!!

the argument lowk fell out as soon as i said it aloud. the number at the top of the results was the run time, and the quickest way thru a round is to answer everything wrong immediately. so the headline figure was paying you for the one behaviour the app exists to catch. points and combos were the same information twice over, worked out from how fast and how often you were right, then shown next to how fast and how often you were right

whats there instead weights every answer by how little help it had. warm up counts once, round 1 three times, round 2 five, round 3 six, and saying a concept in your own words in round 4 is worth 150. speed isnt in the formula anywhere and two tests hold that down: the same answers given at wildly different speeds come out identical, and fast-and-wrong lands below slow-and-right

it reads +615 of 2,120. a bare number says nothing when a short session and a long one have different ceilings

round 3
the chip tray used to have wrong words mixed in, so the round was a hunt for what to avoid. now it holds the sentence’s own pieces and nothing else

grading stopped being fussy abt list order. seven tests, four of them cases that still have to fail: “sugar traps light” for “light traps sugar”, a scrambled non-list, a missing chip, a changed verb

round 4
cant be skipped any more. there was a “stop here and see the results” button sitting right in front of the only moment in the session with nothing on screen to lean on, which is where bailing is most tempting

the interface stopped hiding
the header used to empty itself during a round, on the theory that chrome at the edges competes with retrieval. thats true for one person at a desk. round mode gets passed round a room with several people reading one screen, so it stays up now

locking the page to the viewport turned up two bugs. one of them clipped the verdict off the bottom on a short window, and the verdict is the line that tells you the answer

the run clock was a nice one. it measured wall clock from the start of the run, so it counted loading and the between-round screens, and it disagreed with the time the results reported. header said 3:20 against a reported 1:08. built off the same splits the results use now

the cold open prompt
trimmed it after noticing it asked the model to write explanation lines nobody reads. a/b against the real proxy over 10 topics took median completion tokens from 397 to 266, abt 33%, on the one call every student sits and waits for

setTimeout
i overrode it in the harness to freeze auto-advance long enough to screenshot a verdict, and it swallowed the harness’s own sleeps. script hung and i captured the wrong state. keep a reference to the real function before you replace it

status
the assembled round is verified, which closes the open item from the last log. full ladder played end to end, in dev and against a production build

0
1
39
Open comments for this post
Reposted by @ranveergill

5h 46m logged

debate mode, and the source that wasnt there
biggest thing this session is a second mode. round mode’s ladder tops out at saying something in your own words. debate wants something else out of you, holding a position for four speeches while an opponent tries to take it off you. own route, rather than bolting a sixth round on the end

the rating is arithmetic
the judge hands back a winner, a margin and ten dimension scores. the elo change gets worked out from those in integer maths the model never sees. ask a model to update an elo directly and you get a number that looks like arithmetic, and you cant catch it going wrong cuz every value it gives you is plausible

two tabs and they never mix. open debate is judged on whether the argument holds up. tournament prep gets judged against a tournament bar, where a dropped argument is conceded and 60 means mediocre rather than good for a beginner. format is required and never defaulted, a Public Forum ballot handed to somebody practising Lincoln-Douglas is worse than no ballot cuz theyll act on it

tritoflex
somebody ran a topic-only session on Tritoflex, a spray-on rubber roofing compound, and got told over and over that it was torch-applied. he caught it cuz he installs the stuff. anybody studying something new wouldnt have

ask the model cold abt an obscure term and it comes back with a protein, an alpha helix, signal transduction, implicated in cancer. none of it true, none of it reading as invented, and it never once says it doesnt know

the worst bit wasnt a missing disclaimer. on a topic-only round 4 the marking screen printed “Contradicts the source” under a heading reading “The notes”, in a session where the student pasted nothing and the server blanks every citation on the way out anyway. so somebody who wrote a true sentence got told they contradicted evidence that had never existed. it says “the model disagrees” now

the header badge went from “AI-generated” to “AI, unchecked”. they typed the topic in themselves so they already know who wrote it. what they have no way to know is that nothing checked it. “AI” stays in the label cuz it outlives the moment, screenshots get shared and come back a week later

runs leave something behind
they used to die with the tab. honest enough abt the plumbing. but retrieval practice does its work thru spacing, and meeting a concept once, failing to explain it and never seeing it again is the half that only feels like studying

the session already worked out the thing worth keeping, a map of which ideas you can recognise but cant say. computed it, showed it once, threw it away on the walk to the results. one standing per concept sticks around now and the front door leads with whats still unsaid

the tests that tested nothing
my first two boundary assertions both passed against the exact bugs they were written for. one compared trimmed pieces, and trimming erases the evidence, so it cant tell a mid-word cut from a clean one. the other ran on a sample that had collapsed to a single chunk, so there was no join left in it to get wrong

only found out bcuz i reverted the fix to watch them fail and they sat there green

status
the green “strong” band is verified, which closes the open item from the last log. seen in a browser by somebody who knew the answers, rather than by a driver answering option 1 every time

readme
the privacy section had gone from cautious to false. “nothing is stored beyond the current session” stopped being true the moment runs started leaving a record behind. thats twice a claim in there has drifted while the product moved under it, so anything that stores something now drags a readme check into the same commit

still no accounts. standings are per device and clearing site data wipes them

0
1
21
Open comments for this post
Reposted by @ranveergill

3h 6m 33s logged

round mode, inspo is hackclub mail!!!!
you type a topic and start guessing. five rounds, each one takes away more of the help: two options, four options, a sentence with the word missing, the same sentence in pieces you have to put back together, then nothing on screen at all and you just say it. the ladder runs recognise -> produce bcuz thats the direction the research points, retrieval beats rereading and producing beats picking

anyway that part was already built. today was worse

the scores were fake
correct answers kept turning up in the first slot. felt wrong, so i wrote a script that generates questions thru the real route and counts where the answer actually lands

warm up came back 5 of 5 at index 0. round 1 was 7 / 5 / 3 / 0

which means every score this app has ever shown anybody was inflated. you could do well without reading the question

it was my own prompt doing it. every JSON example i handed the model had “answerIndex”: 0 sitting in it, so of course it learned that. placement happens on the server after generation now, for every format with ordered options, and that includes the chip tray, which had been shuffling in the browser where nothing could measure it

197 questions across four topics. chi-square under the 5% critical value on every format

repeated questions are gone too. the dedupe compares what a question asks for rather than how its worded, so a rephrasing doesnt sneak past. when a topic runs dry the generator gets told to ask abt distinctions and consequences instead of drawing from the same pool twice

three things a diff would never show
drove headless chrome over all 21 presentations, cuz none of this is visible in code

constellation’s stars stacked into a column. tailwind emits .relative after .absolute, and Pick set relative, so it beat the absolute that was being passed in

doors swung 72 degrees, which turns the correct answer edge on at the exact moment you need to read it

and a burst balloon faded to 0.25 opacity. so a wrong answer got softened by becoming unreadable. that one still bugs me, the marking is the one part that has to stay honest and it was quietly making the bad news harder to look at

audio
the generated pad sounded like fan noise. gone. its “8bit Dungeon Level” by Kevin MacLeod now, CC BY 4.0, credited in the app and in the repo

on by default, the feel is half of why the mode works, and theres a mute for anyone sitting in a library

autoplay turned into its own afternoon. no browser lets a page make noise before you touch it, so the track asks to play on mount, the rejection arms a listener, and your first click or keypress is what starts it

testing that turned up a bug i had already talked myself out of. react batches state, so if the first thing you touched was the mute button, the listener fired while the value still read on, started the track, then paused it a frame later. a blip of music played at exactly the person switching it off. set synchronously now

Two things from the test rig mattered more than the thing it was testing. element.click() doesnt grant user activation in chrome, so my first run looked like the whole feature was broken and was just the harness lying to me. and running chrome with a permissive autoplay flag meant the gesture fallback never fired once, so i was measuring nothing at all

not done
nobody has played the full ladder in a real browser yet. the presentations render, thats genuinely all i know. tomorrow

0
1
45
Ship Changes requested

Are you smarter than AI, your friends, or alone?

Learnova is a study tool that only counts it as learned once you can say it back with no help. Multiple choice, then fill in the blank, then rebuild the explanation from pieces, then explain it cold, in your own words, with nothing to lean on. Most study tools stop testing you the moment you can recognize the right answer. This one starts there.

The new part is who you’re up against. Debate Mode puts you against an AI opponent that argues the other side of whatever you just explained, four speeches, then a real judge call scores who actually held their ground. Or skip the AI and go against a friend instead, live, same format, one shared link, no accounts. The room exists the moment two people are in it and nothing else.

Built this week: live 1v1 debate, real time, no database, a room is just two people and a shared connection. Rewrote how the grading talks to you, since a screen that quietly claims you contradicted a source that was never there does real damage to someone trying to learn. Killed the rating system twice over, first for hiding how different a study run and a debate round actually are, then for existing at all when neither needed to accumulate into a score. Rebuilt the whole color palette off the actual logo instead of picking colors that looked fine.

None of it is graded on vibes. The AI opponent isn’t told to be nice or mean, it’s told to actually argue, and the judge is a second, separate model call that never sees what the first one said about itself. The score is out of ten, not a made up elo number a language model invented on the spot, because a model asked to do arithmetic will hand you a plausible number whether or not the arithmetic happened.

Live at learnova.software. Open source. Built with Claude Code, over about five weeks of actual work, dates and all in the README because a repo that predates its own hackathon submission should say so plainly.

Try it against yourself first. Then a friend. Then, if you’re feeling something, the AI.

  • 4 devlogs
  • 19h
Try project → See source code →
Open comments for this post

5h 25m 30s logged

live rooms, and the rating that stopped existing
live 1v1 debate shipped. two people, a four character code, no accounts

the real decision was what a room even is. serverless functions dont share memory between instances, so a Map tracking whether a room exists lies abt half the time. host creates it on one instance, the guest’s join lands on another, and the guest gets told the room doesnt exist while the host is sat inside it. so nothing tracks existence any more. presence on an ably channel is the room

two bugs that only turned up by testing it properly
only the host’s browser calls the judge, so the ballot came back written entirely from the host’s side. both players read the host’s strengths and the host’s weaknesses in the second person. the judge writes both ballots now and mirror swaps them for the guest

and a room was ending when the first person left instead of the last, which threw out whoever had stayed

this reverses the last log, twice
both elo modules got deleted. one number going up and down implies a round mode run and a debate round measure the same thing, and they dont. it became a plain record instead

then the record got deleted too. a debate ends on its verdict and nothing counts up across rounds

results were showing +1,380 of 2,280, a division you have to do in your head at the exact moment you want one answer. its a score out of ten now. anything above ten written by an older build gets dropped rather than converted, cuz converting needs a denominator that was never stored

cut
suggestion chips, which turned “name a topic” into “pick one of these”. three motions that typewrote themselves onto the debate note for no functional reason. /proof, which was a third way into a landing page arguing there are two. thirteen exported symbols nothing was calling

and the “get the ballot” button. the eighth speech lands and the round goes to the judge on its own

palette
rebuilt off the logo. the dark ground is sampled straight out of the asset, and every neutral swapped for the grey at the same relative luminance, so the contrast ratios that were already tuned still hold. type warmed to the logo’s cream and the accent became the star’s gold

two prompt bugs
the voice instructions were teaching third person inside their own example. and the ballot voice used bare letters A and B, which now and then came out as “a flaw in A’s hanging out point”

worst near miss of the session: the case insensitive fix for the letter A also matched the article “a”, and shipped “with they cheaper alternative” thru a live judge call before anybody caught it

separate one, numbered lists were coming out as a single run-on line. fixed, and property tested against 200 random chunkings

copy
the unavailable message used to claim nothing youd typed had been lost, which this app has no way of knowing

bigger one. every ai call was failing with a raw HTTP 402 on a student’s screen, telling them to retry something that was never going to work, cuz the shared key had run out of balance. it says plainly that retrying wont fix it now

readme
the 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, 1.6s to join, each speech reaching the other window in 423 to 1039ms, and a 15.2 second wait before a disconnect gets noticed, written down as measured rather than rounded down. the judge was stubbed that pass, the key had no balance

second pass, once the key refilled: two real judge calls, two genuinely different ballots, no stray letters

still open: a judge call made from inside a live room and mirrored to the guest has only ever been checked against a stub

1
1
23
Open comments for this post

5h 46m logged

debate mode, and the source that wasnt there
biggest thing this session is a second mode. round mode’s ladder tops out at saying something in your own words. debate wants something else out of you, holding a position for four speeches while an opponent tries to take it off you. own route, rather than bolting a sixth round on the end

the rating is arithmetic
the judge hands back a winner, a margin and ten dimension scores. the elo change gets worked out from those in integer maths the model never sees. ask a model to update an elo directly and you get a number that looks like arithmetic, and you cant catch it going wrong cuz every value it gives you is plausible

two tabs and they never mix. open debate is judged on whether the argument holds up. tournament prep gets judged against a tournament bar, where a dropped argument is conceded and 60 means mediocre rather than good for a beginner. format is required and never defaulted, a Public Forum ballot handed to somebody practising Lincoln-Douglas is worse than no ballot cuz theyll act on it

tritoflex
somebody ran a topic-only session on Tritoflex, a spray-on rubber roofing compound, and got told over and over that it was torch-applied. he caught it cuz he installs the stuff. anybody studying something new wouldnt have

ask the model cold abt an obscure term and it comes back with a protein, an alpha helix, signal transduction, implicated in cancer. none of it true, none of it reading as invented, and it never once says it doesnt know

the worst bit wasnt a missing disclaimer. on a topic-only round 4 the marking screen printed “Contradicts the source” under a heading reading “The notes”, in a session where the student pasted nothing and the server blanks every citation on the way out anyway. so somebody who wrote a true sentence got told they contradicted evidence that had never existed. it says “the model disagrees” now

the header badge went from “AI-generated” to “AI, unchecked”. they typed the topic in themselves so they already know who wrote it. what they have no way to know is that nothing checked it. “AI” stays in the label cuz it outlives the moment, screenshots get shared and come back a week later

runs leave something behind
they used to die with the tab. honest enough abt the plumbing. but retrieval practice does its work thru spacing, and meeting a concept once, failing to explain it and never seeing it again is the half that only feels like studying

the session already worked out the thing worth keeping, a map of which ideas you can recognise but cant say. computed it, showed it once, threw it away on the walk to the results. one standing per concept sticks around now and the front door leads with whats still unsaid

the tests that tested nothing
my first two boundary assertions both passed against the exact bugs they were written for. one compared trimmed pieces, and trimming erases the evidence, so it cant tell a mid-word cut from a clean one. the other ran on a sample that had collapsed to a single chunk, so there was no join left in it to get wrong

only found out bcuz i reverted the fix to watch them fail and they sat there green

status
the green “strong” band is verified, which closes the open item from the last log. seen in a browser by somebody who knew the answers, rather than by a driver answering option 1 every time

readme
the privacy section had gone from cautious to false. “nothing is stored beyond the current session” stopped being true the moment runs started leaving a record behind. thats twice a claim in there has drifted while the product moved under it, so anything that stores something now drags a readme check into the same commit

still no accounts. standings are per device and clearing site data wipes them

0
1
21
Open comments for this post

4h 58m 32s logged

deleting the score
biggest change this session was taking things out. round mode had points, a running total and a combo multiplier. all three gone!!!

the argument lowk fell out as soon as i said it aloud. the number at the top of the results was the run time, and the quickest way thru a round is to answer everything wrong immediately. so the headline figure was paying you for the one behaviour the app exists to catch. points and combos were the same information twice over, worked out from how fast and how often you were right, then shown next to how fast and how often you were right

whats there instead weights every answer by how little help it had. warm up counts once, round 1 three times, round 2 five, round 3 six, and saying a concept in your own words in round 4 is worth 150. speed isnt in the formula anywhere and two tests hold that down: the same answers given at wildly different speeds come out identical, and fast-and-wrong lands below slow-and-right

it reads +615 of 2,120. a bare number says nothing when a short session and a long one have different ceilings

round 3
the chip tray used to have wrong words mixed in, so the round was a hunt for what to avoid. now it holds the sentence’s own pieces and nothing else

grading stopped being fussy abt list order. seven tests, four of them cases that still have to fail: “sugar traps light” for “light traps sugar”, a scrambled non-list, a missing chip, a changed verb

round 4
cant be skipped any more. there was a “stop here and see the results” button sitting right in front of the only moment in the session with nothing on screen to lean on, which is where bailing is most tempting

the interface stopped hiding
the header used to empty itself during a round, on the theory that chrome at the edges competes with retrieval. thats true for one person at a desk. round mode gets passed round a room with several people reading one screen, so it stays up now

locking the page to the viewport turned up two bugs. one of them clipped the verdict off the bottom on a short window, and the verdict is the line that tells you the answer

the run clock was a nice one. it measured wall clock from the start of the run, so it counted loading and the between-round screens, and it disagreed with the time the results reported. header said 3:20 against a reported 1:08. built off the same splits the results use now

the cold open prompt
trimmed it after noticing it asked the model to write explanation lines nobody reads. a/b against the real proxy over 10 topics took median completion tokens from 397 to 266, abt 33%, on the one call every student sits and waits for

setTimeout
i overrode it in the harness to freeze auto-advance long enough to screenshot a verdict, and it swallowed the harness’s own sleeps. script hung and i captured the wrong state. keep a reference to the real function before you replace it

status
the assembled round is verified, which closes the open item from the last log. full ladder played end to end, in dev and against a production build

0
1
39
Open comments for this post

3h 6m 33s logged

round mode, inspo is hackclub mail!!!!
you type a topic and start guessing. five rounds, each one takes away more of the help: two options, four options, a sentence with the word missing, the same sentence in pieces you have to put back together, then nothing on screen at all and you just say it. the ladder runs recognise -> produce bcuz thats the direction the research points, retrieval beats rereading and producing beats picking

anyway that part was already built. today was worse

the scores were fake
correct answers kept turning up in the first slot. felt wrong, so i wrote a script that generates questions thru the real route and counts where the answer actually lands

warm up came back 5 of 5 at index 0. round 1 was 7 / 5 / 3 / 0

which means every score this app has ever shown anybody was inflated. you could do well without reading the question

it was my own prompt doing it. every JSON example i handed the model had “answerIndex”: 0 sitting in it, so of course it learned that. placement happens on the server after generation now, for every format with ordered options, and that includes the chip tray, which had been shuffling in the browser where nothing could measure it

197 questions across four topics. chi-square under the 5% critical value on every format

repeated questions are gone too. the dedupe compares what a question asks for rather than how its worded, so a rephrasing doesnt sneak past. when a topic runs dry the generator gets told to ask abt distinctions and consequences instead of drawing from the same pool twice

three things a diff would never show
drove headless chrome over all 21 presentations, cuz none of this is visible in code

constellation’s stars stacked into a column. tailwind emits .relative after .absolute, and Pick set relative, so it beat the absolute that was being passed in

doors swung 72 degrees, which turns the correct answer edge on at the exact moment you need to read it

and a burst balloon faded to 0.25 opacity. so a wrong answer got softened by becoming unreadable. that one still bugs me, the marking is the one part that has to stay honest and it was quietly making the bad news harder to look at

audio
the generated pad sounded like fan noise. gone. its “8bit Dungeon Level” by Kevin MacLeod now, CC BY 4.0, credited in the app and in the repo

on by default, the feel is half of why the mode works, and theres a mute for anyone sitting in a library

autoplay turned into its own afternoon. no browser lets a page make noise before you touch it, so the track asks to play on mount, the rejection arms a listener, and your first click or keypress is what starts it

testing that turned up a bug i had already talked myself out of. react batches state, so if the first thing you touched was the mute button, the listener fired while the value still read on, started the track, then paused it a frame later. a blip of music played at exactly the person switching it off. set synchronously now

Two things from the test rig mattered more than the thing it was testing. element.click() doesnt grant user activation in chrome, so my first run looked like the whole feature was broken and was just the harness lying to me. and running chrome with a permissive autoplay flag meant the gesture fallback never fired once, so i was measuring nothing at all

not done
nobody has played the full ladder in a real browser yet. the presentations render, thats genuinely all i know. tomorrow

0
1
45

Followers

Loading…