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
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
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
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
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
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
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
claiming 23 minutes
claiming 23 minutes
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
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
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
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
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
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
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
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
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
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