Cover
General
Aug 31, 2026

The obstacle looked impossible. So I searched every button press to find out.

GRAZE just got three new obstacles. I built six. Here is what the other three taught me, and the trick I now use to tell "hard" apart from "broken."

THE RULE I ENDED UP WITH

An obstacle has to ask a question.

Two of the ones I cut failed the same way. One synced its movement to the soundtrack, which sounds clever until you notice most people play with sound off. Another was a hole that shrank as it flew at you, which turned out to be a gate wearing a costume: the aperture is already near its final size by the time you are inside it, so the shrinking was telegraphy, not a decision.

The three that shipped each ask something.

RAIL is one lethal beam with open air on both sides. Nothing makes you go near it. Fly around and you score literally nothing. The question is how close, and for how long.

BOMB arrives solid and detonates the moment it hits the screen, throwing a ring of shrapnel. Every shard carries its own scoring edge, so threading a gap pays more than dodging wide. The emptiest place on screen is the middle of the blast.

ORBIT is a rotating ring with gates cut into it and a lethal core. Time a gate, drop inside, orbit the core until the next one comes round. It is the only place in the game with no way out but the way in.

THE NUMBER THAT DECIDES IF A BLAST IS FAIR

The shards thrown back at you arrive first, while the ring is still tight. So the gap they leave at that exact moment decides whether the thing is passable at all. Circumference over shard count, less two shard widths:

8 shards, slow -> 1.4 player widths at speed. A wall. 6 shards, slow -> 2.4 6 shards, fast -> 3.4

None of that is feel. It is one line of arithmetic, and it is the difference between a set piece and a coin flip.

The first version also detonated on a fixed 1.5 second fuse, which is a distance of 1.5 times the scroll speed. Late in a run that is wider than the screen, so deep bombs exploded off camera and the first you saw was shrapnel already in flight with no visible origin. It goes off at the frame edge now.

ROTATION SPEED IS NOT A FREE PARAMETER

Orbit nearly shipped as a trap. Inside the ring you are committed, so a gate has to come back round before you cross or the far wall is a death you could not read.

That guarantee sets the rotation speed, and the rim speed it costs is revolutions times pi times the scroll speed. Radius does not enter into it. So you cannot just slow the ring down. The only lever is how soon an identical opening returns, which means gate count:

1 gate -> 930px/s at the rim, faster than the player can move 2 gates -> 698px/s, 61% of the player's own top speed 8 gates -> 195px/s, 14%

Eight gates, and the rate is now fixed rather than derived, so the ring turns at the same speed at 300 points and at 30,000.

THE PART I ACTUALLY WANT TO TELL YOU ABOUT

I test obstacles with a scripted pilot flying headless. For orbit it died 25 times out of 25. Three different strategies, same result. That looks damning, except a bad pilot and an impossible obstacle produce identical numbers, and I could not tell which I had.

So I stopped writing pilots and searched the control space instead. The game has exactly one input, held or not, and deterministic physics. That makes it a tree. I reimplemented the physics constants in a standalone script, beam searched every held/released sequence against the real ring geometry, and asked whether any path enters and escapes.

800 out of 800 surviving sequences got in and out.

The obstacle was fine. My pilot was flying into the wall. Same story for the bomb: 600 surviving paths, the best keeping a third of the screen height of clearance from the nearest shard.

Two hours of work, and now "is this unfair or am I bad" is a question I can answer instead of argue about.

GRAZE: Edge Rush is free on iOS. Score by almost dying: the closer you graze the edge that kills you, the higher your multiplier climbs, and playing it safe scores nothing. Same course for every player, every day, generated from the date.

Today's board resets at 8pm EST and it is still open.

Discussion