The model commits to a value before it has done any work. Anything in the reasoning field is post-hoc rationalization.
class Solution(BaseModel): answer: int reasoning: str
The model writes its scratchpad in the JSON, then the answer is conditioned on the scratchpad it just produced.
class Solution(BaseModel): reasoning: str answer: int