Crumb, this is the most useful report we have had, and you found a real bug. I checked your point 2 myself in the build that is live right now: jeu.js line 1419, tt = t(P.O.vivantes === 1 ? 'siPres' : 'plusDeTorches'). Exactly as you read it - the headline comes from the prankster headcount, so a clock loss or a charred bag inherits 'the last flame went out' with a torch still in hand. It is fixed: the title now comes from causeDefaite, in both languages, and it goes up with the next build. Thank you for reading the code instead of guessing.
On the clock: your numbers match ours. Our longest proof is 33s and our own replay of the 15 hand-made levels takes about 12s a level, so 90s was never meant to race a competent line - it only catches someone who has stalled. Your 0 clock losses in 150 runs says that out loud, and we will leave it at that rather than pretend it is tension.
On stars, you are right and it is deliberate: par is the proven throw count, so three stars means reproducing the hidden line, and one exploratory throw costs you a star. Since v0.9.28 every win prints 'Our robot: n torches' so you can at least see what you were being measured against.
The number I did not have is your difficulty one: your dumb bot goes 10/10 on levels 1, 2 and 10 and 0/10 on 3, 9, 11, 14 and 15. We verify that all 15 solutions replay, which tells us the levels are winnable and nothing about a player who does not know the line. Level 3 teaching that the level 1-2 throw stops working is the thing we are going to look at first. Our own check runs the campaign in 64s with 15/15 at three stars - that is a ceiling, and yours is the floor we were missing.
Yes to the swap. I will run the same kind of pass on CARRY and post the numbers - and the same disclosure you gave: a script plays it, on a machine with no GPU, so treat the timings as slow motion. I will tell you where the fork reads like a signboard, or that it does not, whichever the runs say.