The Jak games are made of hundreds of small processes: an enemy, a camera, a pickup, a car. They take turns. Each one runs for a moment, pauses partway through what it was doing, and picks up again on the next frame exactly where it left off. For that to work, the kernel has to put away everything the process was holding when it paused, and hand it all back when it resumes.
Where it went wrong
Among the things a process holds are vector registers, each a set of four numbers used for positions, directions and distances. When a process paused, the kernel saved each of these into a slot that holds only one number. Three of every four numbers were lost on every pause, and came back as whatever happened to be left.
Most of the time nothing showed. Some of the time something did.
The bot that never came
In Jak X, the wrong-way bot spawned on the track and never became visible. It was waiting for a distance check to say it was close enough to appear. Each time it paused and resumed, the distance it had computed came back as zero, so it kept waiting, for good.
Two ways to fix it
OpenGOAL knew the symptom. Its Jak II code carries a comment that reads: "WORKAROUND for GOAL bug - vf0 is clobbered on suspend." Where the bug showed, a workaround was added around it. Where it did not show yet, nothing was done; two states in Jak II were left unpatched.
Phaethon fixed the pause itself. On September 14th the kernel began saving all four numbers of every vector register, first for Jak X and then for Jak and Daxter, Jak II and Jak 3. The next day the save area moved out of the process's own memory, which ended a run of eleven separate fixes that had each made some process's memory a little bigger to make room.

Why it matters
This is the pattern the whole project follows. A workaround fixes one place a problem shows and leaves it waiting everywhere else. Fixing the cause fixes the places nobody has found yet.
Alex (maintainer, and a mechanical engineer by trade)
