The two one-shot entry points map the same outcome to different codes (failed/partial/budget -> 2 on -z, 1 on -q/-Q; completed-with-no-text -> 1 vs 0) and the reference documented both tables 60 lines apart without saying so. Also `iteration_limit` is a metrics end_reason, not a turn_exit_reason; the finalizer emits `max_iterations_reached(N/M)`.