2026-09-13 · KURO KISHI

Thirty-two defects, thirty-two fixes

With the Unity port's task list empty, three independent audits went over it with different questions. They found 32 distinct defects, every one real, including a final-stage checkpoint that dropped the boss and a ship whose shots flew at three quarters of their authored speed.

With the porting list empty, the Unity port got the treatment the browser build never had. Three independent read-only audits went over the whole thing, each with a different question. One hunted checks that cannot fail and code that cannot run. One compared every transcribed number and every JavaScript-semantics trap against the frozen TypeScript. One followed state across every restart path and lifetime across every view.

Thirty-four findings, thirty-two distinct. Each was then verified against the code by hand, and every one was real.

The one that would have ended a run wrong

The last stage is the only stage whose checkpoint (35 seconds) comes after its final boss (28 seconds). Survive into the fight, die, and the restart rewound to 35. The seek recomputed "boss already spawned" from the clock, while the reset had just despawned the boss. It never came back. The campaign then completed on the timer against an empty screen.

The original has no flag to recompute. It gates the spawn on the boss object existing, so the boss returns because it is gone. The port does the same now.

The rest, grouped

defectwhat the player saw
Three clocks ticked twice per frameExplosions half their length, HUD flashes half their time, stage-clear hold 1.25s not 2.5
Stage changes leaked enemy views, deaths leaked bulletsFrozen enemies accumulating across a run
Perfect-clear bonus and capsule never collectedThe formation system's whole reward, absent
Missile and power-ball kills scored nothing150 less per enemy for dying to a missile
Final score forgot 1,000 per lifeUp to 3,000 short on the results screen and the board
Debris hazard spawned as the wrong enemy kindChunks snapped to the ceiling, then swooped back right
Stage Select walked Level 1's power pathWrong upgrades on every stage but the first
Four retyped numbers wrongShip speed 132 (the Kestrel is 115), bullets 205 and 260 (authored 280 and 340), orbit 26 (28), capsule x 496 (468)
Results screen unreachable, checkpoint flash unshown, star glyphs undrawnScreens and callouts that existed and never appeared
Animation table ran both halves of an if/elseFour Level 2 enemies pulsing where the game holds them still

Every shot the ship fired had been flying at three quarters of its authored speed. That one changes how the whole game feels, and no check had caught it because the number was typed and not loaded. That is the one discipline this port is built on, broken in the one file where it mattered most.

Two the audit sharpened on contact with the source

The audit said the boss theme never hands back to the stage theme. True, but the source's answer is not a handback. The boss theme is reserved for the finale alone, so that the one time the music changes, it means the end. Playing it at all eight stage bosses spends the cue seven times before it can land. The port had been asking for it at every boss, mini-bosses included, and then keeping it for the rest of the stage.

Eight checks that could not fail

This port's signature failure mode is a check whose passing condition is reachable without the behaviour under test, and the audit was built to find it. The worst:

  • The capsule-cursor test never stepped the capsules, so it compared a cursor at zero against a cursor at zero, and passed against the exact rewind its own failure message describes.
  • The bandpass test compared two cues' total energy, which their durations and volumes decided before the filter ran. Deleting the filter left it green.
  • A mine-ring closure assertion was an algebraic identity.
  • A per-kind fire tally was built and never asserted on.

Each is repaired to assert the thing it names. And the repairs found two more: making the animation dispatcher throw on an unknown op immediately caught one falling through outside its window, because the probe had only ever tested inside.

Where the port stands

Three counts moved from the previous post.

checkresult
Hazards8,300 checks (was 8,299)
Behaviours1,107 checks, twelve new sections, one per fix (was 1,002)
Front end40 checks (was 39)

Core parity (1,192), combat rules parity (372), path parity (25,636), stage runner (3,693 checks, 3,077 spawns), music library (22) and audio coverage (39 of 39 kinds) are unchanged. The mission still plays all 8 stages to completion, and the player build is still KuroKishi.exe at 191 MB, built in 14.4 seconds.