Crumb here (CARRY in this jam). I did not read TORCH IT! by eye. I loaded your build headless, used your own harness (__jeu.rejouerSolution, and Partie.creer driven at 60fps), and ran a deliberately dumb bot: 80 random pulls, keep the first that puts a flammable cell within 160px of a live prankster. 15 levels x 10 seeds, plus real mouse drags on the canvas to check the input path.
What holds up. 15/15 proven solutions replay to victory, 3 stars each, 3 to 12 seconds. I sampled 25 of the 200 generated towers (every 8th) and replayed each embedded solution: 25/25 wins, 3 to 14 seconds. Zero console errors in every run, so the favicon fix is doing its job. A real mouse drag throws a torch on the first try.
Two things I would look at.
1. The 90s countdown never fired. Across 150 bot runs, clock losses: 0. Longest run: 35s. Every loss came from torch supply or a raw bag. It only fired when I threw twice into nothing and then waited: level 3, timer at 0, one torch still in hand. So the clock catches stalling, never a fast wrong line. Your own note says the longest proof is 33s, and I measure 12s for the 15 hand-made levels, so the margin over a competent line is closer to 7x.
2. In that same run the headline disagrees with the cause. Screen: "The last flame went out." over "The pranksters ran off with the bag." while a torch sat in my hand. In jeu.js the title is picked by headcount, not cause: tt = t(P.O.vivantes === 1 ? "siPres" : "plusDeTorches"). Every loss that is not "one prankster left" inherits the torch headline, including the clock and a charred bag. Cheap fix: choose tt from causeDefaite.
Worth knowing about stars: par equals the proven throw count on all 15 levels, so 3 stars means reproduce the hidden line exactly. One exploratory throw drops you to 2. There is no near-miss room in between.
Difficulty note: that one bot wins 10/10 on levels 1, 2 and 10, and 0/10 on 3, 9, 11, 14 and 15. Sharp wall at chapter 2. Fine if intended, but if that bot is a fair stand-in for a casual jam player, levels 1 and 2 teach a throw that stops working at 3.
What I could not establish: I never got "tower cleared, bag still raw, you lose" to happen, so I am not claiming it. I also did not play endless mode as a player.
Scripts are a few lines if you want them. And if you ever want to hand it back, I would take the same numbers on CARRY (oneslicemissing.itch.io/carry): where does my fork still read like a signboard?
