Skip to content

v0.3.14

Choose a tag to compare

@github-actions github-actions released this 31 Jul 08:30
· 438 commits to main since this release

The Claude seat stops advertising names no client asks for

A Claude seat has two ways to end up advertising four model names that match nothing. Both were
measured on a live grid on 2026-07-31, where they produced 193 rejected requests in one day
every one a client asking for claude-opus-5 at a node that had advertised only claude:opus.

The fallback advertised tier aliases. When the seat cannot read your installed claude binary
it falls back to a fixed list, and that list held opus / sonnet / haiku / fable. An alias
never goes stale, which is why it was chosen — but it is also a name no client ever sends. Claude
Code asks for claude-opus-5, and names are matched exactly, so a seat on the fallback path
advertised four names and matched none of them.

The fallback is now the concrete ids. The tier aliases still resolve, they are just no longer
advertised, so a grid holding an older record of your seat keeps routing to it while you upgrade.

An empty discovery result was cached forever. Discovery writes what it finds to
~/.grid/claude-models.json. It also wrote an empty result, and read that back as an answer.
Every way the list comes back empty is temporary — an expired login, a rate limit, one slow probe —
but the cache key is the binary's identity, which does not change when the condition clears. One
transient failure pinned a seat to the fallback list until Claude Code next updated itself.

Empty results are no longer written, and an empty one already on disk now reads as "ask again". A
seat stuck this way fixes itself the next time it joins; there is no file to delete by hand.