Four passes for one spark rule, and back on the Quest
Five more headset passes (55 to 59). Four of them were about one small question, whether a whetstone should spark when you scrub it, and the last was the first build on the Quest itself in three weeks. The second half we…
Five more headset passes (55 to 59). Four of them were about one small question, whether a whetstone should spark when you scrub it, and the last was the first build on the Quest itself in three weeks. The second half went better than the first, and I learned something from each.
A code review that found the gaps
Astra reviewed the whetstone work before I merged it and found two real bugs I couldn't have felt yet. The stone decides it's touching the steel by checking a baked cross-section of each blade, and between the 16 measuring points that section was a straight blend. On a blade with teeth (the macuahuitl) or a stepped head (the breaching axe), the blend missed real steel by up to 27 mm. At the very top it narrowed to a single point, so broad blade ends were missed by up to 111 mm.
Claude didn't take the numbers on trust. It wrote a test that cuts every blade's model every 2 mm and checks that every point of real steel sits inside the section, and the test reproduced Astra's numbers to a tenth of a millimetre before anything changed. The fix stores each blade as a stack of 1 cm slabs, each the box around all the steel in its centimetre, so it can't miss steel by construction. All seven weapons now measure zero millimetres of steel outside.
Two smaller ones I decided myself: when the stone touches two weapons it prefers the one in your hand, and only a consistent stroke should spark.
Four passes to answer one question
"Only consistent strokes, no scrubbing" turned out to be harder to pin down than it sounds.
The first rule said a stroke had to travel 6 cm in one direction before it sparked. In pass 55 I scrubbed back and forth and threw 304 sparks. My scrubbing legs were just longer than 6 cm.
Instead of guessing a new number, Claude added a log line every time the stone turned or lifted, saying how far that leg went and how long it took. Pass 56 was nothing but measuring: five long strokes and a few seconds of scrubbing. The numbers were clear. My strokes ran 35 to 56 cm and ended with a lift. My scrub legs ran 5 to 27 cm and every one ended with a turn. A length threshold between them would have had a 3 cm margin. The turn was the real difference, so that's the rule now: a turn on the blade silences the sparks until you lift the stone.
Pass 57 confirmed the sparks stopped, but scrubbing still wore out the stone, because any scrub leg past 25 cm counted as a draw. So in pass 58 draws got the same rule: a scrub neither sparks nor sharpens. Only a proper draw does.
By pass 58 I was done with it. Not because it was wrong, it works, but because putting the headset on and off four times for one or two asks each was a bad use of my time. The fix for that is about process: small checks get folded into fuller passes, and when a check fails, measure before the next attempt. Pass 56 was the one that actually settled it, and it should have come first.
Back on the Quest
The last device build was 09-13, and a lot has gone in since. I was nervous. It launched straight into the hub, looked the same as over Link, held 72 frames per second, and combat, sparks and sounds all worked. The arc crackle that Astra worried might stall the first time it loads cost no frames at all.
The device log found something I couldn't see. On the Quest, the game can only build a collision shape from a model marked readable, and two of ours weren't: the jar's eight pieces and the mission table. In the Editor everything is readable, so no test and no Link pass could catch it. On the device the pieces had no collision and the table let you walk into it. The fix is a setting on those models, plus a test that fails if any model the game builds a collider from at runtime isn't readable.
While I was in there, I asked for something I'd wanted for a while: the pass notes inside the game. They used to only show over Link. Now a dev panel page opens them on the Quest too, read from a file copied onto the headset before the pass. In pass 59 it worked "perfectly smooth", the table stopped me, the jar's pieces bounced on the floor, and the whetstone worked on the macuahuitl.
One open question got answered without anyone doing anything: the mission board has to deal the same missions on every runtime, and the game now checks itself at startup. The Quest's log said it deals board 7 exactly as pinned.
Still rough
The game crashed once as I quit after pass 59, inside the Quest's graphics driver, half a second after the scene started shutting down. None of our code is in the crash trace and the pass before quit cleanly, so I'm watching for it rather than chasing it. Two small fixes since then are unworn: the field journal finally pays its 5-coin discovery fee, and the vault board counts spaces instead of reading "14/12". The portal still plays a placeholder sound while I look for a better one.