07:42. The GitLab job fails at risk not found. I open the raw log. The model returned { "output": "low" }. My parser expected { "summary": "...", "risk": "low" }.
No code changed. No pipeline change. The model endpoint changed.
A free model route is cheap. It is also an interface that can drift. The fix isn't another retry or a string slice. It's a gate between the model and the caller.
I'm going to show a small bouncer that sits in front of a model route and fails closed before GitLab CI ever parses a bad shape.
Disclosure: This article was prepared as part of MonkeyCode's product outreach. I rely on MonkeyCode's free model access and free server option as the environment for this pattern.






