Problem
Antigravity discovery can reintroduce a retired deployment when its wire ID is also the logical family ID.
collapseAntigravityModels() first excludes retiredMembers, but its logical-ID fallback adds family.id without checking retirement. The existing claude-opus-4-6 family uses that same ID as a retired member, so a discovery response containing only this retired entry still publishes the family. This contradicts the existing retired-only-family exclusion immediately below the fallback.
Reproduction and expected behavior
On main f6b49ae59605b1276b8267f2886d22c03f01533c, call the production fetchAntigravityModels() with a successful standard discovery JSON response containing only the retired Opus entry. It returns a logical model rather than an empty dynamic result.
The fallback should not add a retired ID back. No retirement list, static baseline, route policy or entitlement assumption needs to change.
A table-driven production-entry test covers retired-only, live-only and mixed responses for the three existing retired-member families: before the fix 8 pass / 1 fail (Opus retired-only), after the guard 9/9 pass.
Scope: this fixes dynamic discovery. Static baseline models remain; this does not claim the picker loses all access or that a real account cannot use the model. No live provider calls were made.
Problem
Antigravity discovery can reintroduce a retired deployment when its wire ID is also the logical family ID.
collapseAntigravityModels()first excludesretiredMembers, but its logical-ID fallback addsfamily.idwithout checking retirement. The existingclaude-opus-4-6family uses that same ID as a retired member, so a discovery response containing only this retired entry still publishes the family. This contradicts the existing retired-only-family exclusion immediately below the fallback.Reproduction and expected behavior
On main
f6b49ae59605b1276b8267f2886d22c03f01533c, call the productionfetchAntigravityModels()with a successful standard discovery JSON response containing only the retired Opus entry. It returns a logical model rather than an empty dynamic result.The fallback should not add a retired ID back. No retirement list, static baseline, route policy or entitlement assumption needs to change.
A table-driven production-entry test covers retired-only, live-only and mixed responses for the three existing retired-member families: before the fix 8 pass / 1 fail (Opus retired-only), after the guard 9/9 pass.
Scope: this fixes dynamic discovery. Static baseline models remain; this does not claim the picker loses all access or that a real account cannot use the model. No live provider calls were made.