A review the AI could not complete now holds the change
If the AI findings review returns nothing readable or runs over budget, the change is recorded as unreviewed and the release gate holds it until it is reviewed.
After a session writes a change, an AI reviewer reads the diff and records findings. Before this fix, a reply the system could not read was treated the same as "no findings". That covered prose instead of a list, an empty reply, a reply cut off at the token limit, or a refusal. Such a change could reach the pull request recorded as reviewed and clean.
Now the reviewer must return a readable list, even an empty one. Anything else is recorded as a failed review, and the release gate holds the change until it is reviewed.
The review step is also budget-checked now, like every other model call in a session. If the allowance or a spend cap has run out by then, the review is skipped and recorded as failed, rather than throwing away the finished change. See cost controls for how caps work.
We also fixed spend records that could be lost when a write to the usage ledger failed. A failed write is now retried on the next flush.