PR #TBD — Making the First Win Reach S10

The Decision

Task 4 of gh:#2310 asked whether first_win_loop.py was still dead code after the onboarding engine wiring work. A fresh read of the wizard and Vizor flow showed that S10 existed in the state machine, but neither live surface called execute_first_win_cycle().

The fate decision is therefore to keep and wire the module. Its git-diff-based verify_first_win_effect() helper has no equivalent helper elsewhere in the codebase, so it remains the single-purpose verification helper rather than being duplicated or replaced.

What Changed

The wizard now runs the first-win cycle after an accepted remediation and reports the resulting S10 state. The Vizor onboarding step endpoint uses the same cycle when the requested stage is S10_BuildExperience. A flow-level test drives cmd_wizard_init, including the accepted first-win path, and verifies the persisted state reaches S10.

This closes the gap that let the original first-win module pass isolated tests while remaining unreachable from onboarding.