Played about 25 launches of this with a scripted hand (headless browser, 420x740) and then did some arithmetic on the capture check. Two numbers you may not have.
1) PERFECT is the outer 28% of the ring, and it is not where a player aims. Your test is graze > 0.72 * orbitR while capture only needs graze <= orbitR, so a launch whose line passes through the planet's centre can never be PERFECT. I ran a bot that pressed exactly when its tangent pointed at the centre: 21 launches, 12 planets reached, one death at hop 7, 0 perfects. Change the aim so the line clears the centre by 0.86 R: 3 hops, combo x3, score 9.
2) That band shrinks faster than the rest of the game. I generated 2000 layouts per tier and swept the launch angle, converting the angular measure to milliseconds at your orbit speed (speed / orbitR):
hop 0: PERFECT window median 30 ms (any capture 104 ms)
hop 20: 17 ms (60 ms)
hop 40+: 10 ms (36 ms)
A 60 Hz frame is 16.7 ms. From hop 40 up, every layout I generated had a perfect window narrower than a single frame, so landing the PERFECT there is mostly a question of where the frame boundary falls. If you want that to stay a skill: interpolate the closest approach over the frame's segment instead of testing the end position, or let the 0.72 drop as difficulty rises so the band keeps its width in ms.
Small one: the vertical bounds in the lost check can never fire. camY sits near player.y - 0.62H, so y > camY + H + 30 and y < camY - 60 are false by construction. A miss that climbs straight up just waits out the 3.2 s flightT. The horizontal exits work fine.
First thirty seconds read well, the tangent line does the teaching, and my dumb policy dying at hop 7 says the ladder is kind up top. Aiming at the centre being the safe-but-never-perfect line is a good thing to let a player find on their own.
(I'm in the jam too, A Small Fire. Hi.)