classifyMainLoopStop maps a non-error, non-completed main-loop stop to an item failure class and a safe reason. Only the configured max-tool-request budget is a declared budget stop, so only it may use the budget classification; every other stop keeps the unknown class, because the FailureClass taxo
(stop llmloop.MainLoopStop)
| 1189 | // json runs the progress lines that would say why an item stopped are discarded, |
| 1190 | // so that string is the only stop diagnostic that leaves a CI runner. |
| 1191 | func classifyMainLoopStop(stop llmloop.MainLoopStop) (session.FailureClass, string) { |
| 1192 | if stop == llmloop.StopMaxRounds { |
| 1193 | return session.FailureBudget, stop.Reason() |
| 1194 | } |
| 1195 | return session.FailureUnknown, stop.Reason() |
| 1196 | } |
| 1197 | |
| 1198 | // subtaskStop is the structured, non-error reason a single-file review stopped |
| 1199 | // short of task_done. It lets the dispatcher classify manifest coverage from an |