Once the face model finished downloading, KiFinder showed you an enrollment sheet, but nothing stopped you from dismissing it. Cancel, Escape, or a click outside the sheet all dropped you straight into Review with nobody enrolled and nothing to match against, which defeated the entire point of the onboarding flow it was supposed to be. The fix gates the sheet on a simple condition, whether the person list is empty, and when it is, the sheet hides its Cancel button and disables the system's interactive dismiss, so completing enrollment is the only way out. Re-enrolling someone who already exists, or adding a second person while the first stays around, is still freely cancelable, since that is a real choice rather than a required first step.
The same logic showed up again from an angle I had not planned for: what happens if you delete the last person you enrolled? Before this, you would land back in Review with an empty roster and no way back into enrollment short of relaunching. Now deleting the last person re-opens the same mandatory sheet automatically, since a library with zero people in it is first-run again in every way that matters, regardless of how it got there.
While I was in that code I also fixed something that had been bothering me since the first onboarding pass: the window opened absurdly tall, something like 3576 points, because the onboarding view greedily filled its frame with no finite height for the window system to size around. Giving the root view an explicit ideal frame, while still leaving room to resize or maximize, fixed it. The persisted window now opens at a sane 1000 by 640 and stays there.