Skip to content
Goatfied

Changelog

What's new in Goatfied.

What shipped, why it matters, and how to use it. Updated as releases land — roughly weekly.

Aug 20, 2026

The name under a reply is the model that wrote it

Picked models were being refused upstream and quietly answered by Auto, while the reply still carried the name you chose. Both halves of that are fixed.

Your pick is enforced by a signed grant, and the service had been issuing grants from an out-of-date list that named no specific models at all. Every pinned model was therefore refused, and the turn was handed to Auto instead. Since the reply still reported the model you asked for, there was nothing on screen to suggest the substitution had happened — you would read a weaker answer and blame the model you thought you were using. The grant list is now generated rather than copied, so it cannot fall behind again.

A model we hold a direct key for is no longer sent through an aggregator. It previously went out to the aggregator first with the direct route as a fallback, which was slower, dearer, and pointless when we can reach the model ourselves. It also meant the strictest privacy setting refused models it could have served privately all along; those now run on the direct key with the aggregator left out of the request entirely.

Nothing will claim to be a model it is not. A reply names the model that produced it, or it names nothing — it no longer falls back to whatever the picker happens to be showing when you scroll past. Turns that Auto routed say GOAT rather than naming whichever model it reached for, because that choice is made fresh each turn.

The context bar reads correctly on routed turns again. It sizes itself from the model in use, and a turn answered by a routing family matched nothing it knew, so it fell back to a smaller assumed window and filled a third too fast.

Build 2.31.14

Aug 19, 2026

The picker only offers models it can actually run

Several entries in the built-in model list could not be routed and quietly ran a default instead. They are gone, and a saved choice now survives the catalogue refreshing underneath it.

The list the app falls back to before it has talked to the service named twelve specific models but only pinned a few of them. The rest sent nothing but a family, and a family request is answered by whatever that family defaults to — so Grok 4, Gemini 2.5 Pro, DeepSeek R2, Llama 4 Maverick, Mistral Large and Qwen3 235B all sent byte-identical requests. Six names, one model. Those entries have been removed rather than left to misrepresent themselves; the full catalogue still arrives from the service as before.

The served catalogue and the built-in list also named the same models differently, and the served one replaces the other once it loads. A choice saved against either could not be found in the other, so it silently reverted to Auto — you would pick Opus, and keep picking it, and keep not getting it. The two are now reconciled through the service's own identifier, and the stored choice is rewritten to match so it stays put.

Both faults produced the same symptom as last week's routing bug and were left behind by the fix for it. The model list now has tests that fail if any entry cannot pin what it claims, or if two entries ever send the same request again.

Build 2.31.13

Aug 19, 2026

Watch it work, then let it get out of the way

A running turn now stays open while it runs, and collapses once it is done. Reasoning stays readable either way.

Steps used to fold away the instant each one finished, which meant a turn was already mostly hidden while it was still running — the one time you actually want to see what it is doing. Watching an agent work is most of how you learn whether to trust it, and that was the part being taken away.

Folding now belongs to finished turns. While a turn runs, every step stays on screen; when it ends, the tool steps close up into a summary line so the history stays skimmable. Reasoning is exempt from the fold entirely — it is the model explaining itself to you rather than a record of a command it ran, so it stays visible after the turn is over.

A related fault is fixed alongside it. Long sessions trim their oldest events to stay within a limit, and that trim could cut through the middle of a turn, removing the marker that says where the turn began. The transcript then lost track of which reply answered which prompt. Trimming now removes whole turns at a time.

Build 2.31.12

Aug 19, 2026

Every reply says which model wrote it

The name under a response is now the model that produced it, reported by the service, rather than whatever the picker happens to say.

The label under a reply was read from the picker at the moment the screen drew — not from the turn it belonged to. So it described the present rather than the past: change model and old replies quietly relabel themselves, and a request that ran on something other than what you chose still looked correct. That is why last week's routing fault could sit there for four days looking fine. The service already reports which model served each turn; that is what the footer shows now.

The routing fix from the previous release also needed one more piece. The model list is cached for offline use, and it is cached after processing — so a list saved before the fix kept the gap that caused it, and only a successful refresh would clear it. The cache is now repaired when it is read, so the fix applies immediately rather than whenever the network next cooperates.

Build 2.31.11

Aug 19, 2026

The model you picked is the model you get

Choosing a specific model was sending only its family, so every pick quietly ran that family's default instead.

A model in the picker carries two things: the family it belongs to and its own identifier. Only the family was being sent. The backend does exactly as asked with that — it runs the family's default — so selecting Claude Opus 5, or anything else, ran the routed default while the picker went on displaying the name you chose. Asking the agent what model it was gave an honest answer that looked like a bug, because the answer was right and the label was wrong.

The billing record shows it plainly: a named model was last run on the fifteenth, and everything since has been the default. It is fixed at the source — a model's identifier now travels with the request — and the local fallback list has been corrected to use the same identifiers the service actually publishes, which is where the mismatch started.

Related: when a chosen model cannot be resolved, the app substitutes one. That is reasonable, but it was completely silent, which is why this went unnoticed for four days. The substitution is now recorded.

Build 2.31.10

Changelog · Goatfied