learnova-v2
- 10 Devlogs
- 27 Total hours
study tool!
study tool!
no idea how i have this unlogged time lol
Feedback
Hey ranveergill,
Awesome project! I'd love to see what you make in the future!
For any other questions, DM @dodge1 or create a ticket in Slack—#ask-the-shipwrights.
Shipwright walkthrough
Feedback
Hey!
Nice project but it does seem to hide the users cursor which makes navigation very difficult.
Please fix this and re-ship,
thanks!
Shipwright walkthrough
Feedback
hi, cool project!!
unfortunately, we are unable to accept your project at this time because your project has the following issue(s):
- the banner is not a picture of your shipped project. before reshipping, please ensure it is.
- the readme is written with assistance from ai tools. this is prohibited and you need to rewrite it yourself.
Shipwright walkthrough
Feedback
hi, cool project!!
unfortunately, we are unable to accept your project at this time because your project has the following issue(s):
- the readme is incomplete. please follow the guide for instructions: https://stardance.hackclub.com/resources/great_readme
Shipwright walkthrough
Feedback
nice project, but you've to rewrite the README "yourself" since it has clear "AI" signals then resubmit!
Shipwright walkthrough
Feedback
Hey ranveergill,
You seem to have used a lot of AI in your readme. Please rewrite it yourself, as we would like to see how you worked on the project!
Your code seems mostly AI, please rewrite most of the code without AI.
For any other questions, DM @Carlson Huang or create a ticket in Slack—#ask-the-shipwrights.
Shipwright walkthrough
Feedback
Hi there the debate thing doesnt seems to be working fix that and reship !
Shipwright walkthrough
Feedback
hi, cool project!! unfortunately, we are unable to accept your project at this time because the project itself uses a lot of ai code which exceeds our 30% limit. there have been 0 commits since last ship (asking for the same change) so we are unable to approve it. the banner is also not a FULL picture of your shipped project which is what it needs to be.
Shipwright walkthrough
Feedback
mrrp mrrp~ :3
i'm rejecting this project as you've used too much AI in its development (over 30%), please rewrite the code yourself.
if you have any questions, please ask them in #ask-the-shipwrights.
Shipwright walkthrough
Feedback
Hi there! It seems like you over exceeded the 30% AI usage limit. Please try to rewrite some components of your code on your own. Thanks!
Shipwright walkthrough
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
Feedback
Hey , this looks so cool but sadly
Your front-end is showing some clear signs of heavy AI usage. Please restyle it yourself so we can see your own work on it!
For any other questions, create a ticket in Slack, #ask-the-shipwrights.
Shipwright walkthrough
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
Feedback
Hello it looks like the round mode does not work no matter how many times i try please make sure everything is working before reshipping!
Shipwright walkthrough
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
Feedback
You have overused AI. Please try write more of the code yourself, without using AI or suggestions. DM @Carlson for questions.
Shipwright walkthrough
claiming 23 minutes
Feedback
Hey ranveergill,
Thanks for shipping learnova-v2! Unfortunately I can't approve it as it stands:
- The README reads as almost entirely AI-generated, with the emoji-heavy formatting that usually comes with it. You’re welcome to use AI for help, but the README should be primarily in your own words and should clearly document the project. Please rewrite it yourself — we’d like to see how you actually worked on this.
- This one reads as fully AI-generated end to end, without much of your own input. Please go back through it and add your own styling, design choices and personal touches so it reflects work you actually did, then resubmit.
For any other questions, DM @alexander or create a ticket in Slack—#ask-the-shipwrights.
Shipwright walkthrough
Feedback
Hey! Thanks for shipping your project. It's not quite ready for voting yet, so here's what we'd like you to change:
-your project banner should be a screenshot of your project in action , change it from project settings
Once you've made these, ship it again and we'll take another look!
Shipwright walkthrough
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
Feedback
Your code seem to be largely written by AI. This can be seen from both the code and the user interface. As a remainder, up to 30% of AI usage is allow for Stardance challenge, and exceeding the AI usage would not be accepted. Please rewrite your code to make sure you meet the limit.
If you have any questions, feel free to ask in #ask-the-shipwrights.
Shipwright walkthrough
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