Every April 2026 LLM release roundup lists model IDs. Fazm's Mac app shows users three personas.
Opus 4.7 GA, Sonnet 4.6, Haiku 4.5, GPT-5 Turbo, Gemma 4, Grok 4.1, GLM-5.1, Qwen 3.6-Plus, DeepSeek V4, Mistral Medium 3, Arcee Trinity. Every SERP result enumerates IDs and benchmarks. None describe what a non-technical Mac user clicks the day those releases ship. A three-row tuple at ShortcutSettings.swift lines 159 to 163 renames every incoming model into Scary, Fast, or Smart via a single contains() match, with zero work per release.
Every April 2026 release every roundup enumerates, plus the three personas that absorb the Anthropic ones
The anchor fact
0 rows of Swift absorb every April 2026 Anthropic release
Open Desktop/Sources/FloatingControlBar/ShortcutSettings.swift. Go to lines 159 to 163. You will see a private static array called modelFamilyMap typed as [(substring: String, short: String, family: String, order: Int)]. It has three rows. Those three rows are the entire bridge between the April 2026 LLM release cycle and the pill a Mac user taps. The label "Smart (Opus, latest)" means "the most recent model whose API ID contains the substring opus", and that definition survives every future version bump.
The four-hop path from Anthropic's release to the Mac dropdown
The ACP SDK reports availableModels on session/new. The bridge strips "default" and emits a stdout JSON event. Swift decodes it. The registry runs a single contains() match per modelId. The user sees a persona, not a version number.
From session/new to the chevron pill
Hop one: the Node bridge
availableModels arrives, "default" is stripped, JSON event fires
The ACP bridge subprocess intercepts session/new at acp-bridge/src/index.ts line 1345, pulls models.availableModels off the response, and routes it through emitModelsIfChanged. That function drops the "default" pseudo-model (line 1274), dedups against the last emission, and writes the JSON event models_available to stdout. The day Anthropic adds a new model ID to the availableModels list on its side, this function picks it up on the next session/new call.
Hop two: the Swift decoder
models_available becomes a Swift tuple array
ACPBridge.swift lines 1202 to 1213 handles the typed Swift side. It pattern-matches on .modelsAvailable, compactMaps the dict array into an array of (modelId, name, description) tuples, and calls onModelsAvailable, a closure that is wired to ShortcutSettings.updateModels on app startup. No decoding of version numbers, no semver parsing. The closure is the entire interface.
Hop three: the SwiftUI Menu
ForEach(shortcutSettings.availableModels) renders the three personas
AIResponseView.swift lines 1116 to 1159 defines ModelToggleButton. The visible label is the selected model's shortLabel, either "Scary", "Fast", or "Smart". The expanded menu iterates over availableModels and shows each entry's full label. When the user taps a new option, selectedModel is written to UserDefaults and the floating bar rebinds. Clicking persona "Smart" writes "claude-opus-4-7" to disk, not a version number the user remembers.
The day Opus 4.7 ships, as a terminal log
A fresh Fazm launch after the April 2026 Opus 4.7 GA. No code update, no settings migration, no user action. The registry absorbs the new ID and the dropdown re-renders with the same three personas the user had yesterday.
Six things the three-row registry commits to
The April 2026 release wave includes three Anthropic updates, nine non-Anthropic releases, one migration, and a handful of proxy configurations. Each gets a specific behavior from the registry.
Scary = Haiku family
Matches any modelId containing the substring 'haiku'. Label 'Scary (Haiku, latest)'. Short label 'Scary'. Sort order 0, so it sits at the top of the dropdown. April 2026 this resolves to claude-haiku-4-5 without any code change in Fazm.
Fast = Sonnet family
Matches any modelId containing 'sonnet'. Label 'Fast (Sonnet, latest)'. Short label 'Fast'. Sort order 1. Default selection when UserDefaults has no saved value (ShortcutSettings.swift line 325). April 2026 this resolves to claude-sonnet-4-6.
Smart = Opus family
Matches any modelId containing 'opus'. Label 'Smart (Opus, latest)'. Short label 'Smart'. Sort order 2. April 2026 this resolves to the newly GA'd claude-opus-4-7 after the 4.7 launch, with a one-time migration from older Opus IDs handled at lines 310 to 316.
The rest of April 2026 = the else branch
Every other family (Gemma 4, Llama 4 Scout, Qwen 3.6-Plus, GLM-5.1, DeepSeek V4, Mistral Medium 3, Arcee Trinity, Grok 4.1) falls through to the else branch at lines 187 to 189. That branch uses model.name (or the raw modelId if name is empty) and assigns sort order 99, so it appears under the three core personas. Unknowns are allowed, not silenced.
One-time Opus to Sonnet migration
The init block at lines 310 to 316 reads shortcut_didMigrateFromOpus. If a user had saved an opus ID before this migration shipped, UserDefaults is rewritten to 'sonnet' and didMigrateFromOpus is flipped true. This rotates the user away from Opus during a rate-limit incident while keeping their ability to return to Smart afterward.
The full path from a new LLM release to a rendered dropdown
ACP SDK answers session/new with availableModels
The Claude Agent SDK's session/new response carries a models.availableModels array, one entry per model the currently authenticated account can call. April 2026 this includes claude-opus-4-7 for accounts with Opus access, the default pseudo-model, and legacy IDs.
Bridge strips 'default' and emits a stdout JSON event
emitModelsIfChanged at lines 1271 to 1281 filters out modelId === 'default' because it is a pseudo-model, not a real option. The remaining list is JSON-encoded, compared to the last emission for dedup, and sent as { type: 'models_available', models: [...] }.
Swift parses the event into typed tuples
ACPBridge.swift:1202-1213 pattern-matches on .modelsAvailable(let models), compactMaps to an array of (modelId, name, description) tuples, and calls onModelsAvailable if non-empty. No decoding of version numbers, just a typed handoff.
updateModels runs the registry
ShortcutSettings.updateModels iterates every tuple. For each modelId, it calls modelFamilyMap.first(where: { modelId.contains($0.substring) }). That single line, the substring match, is what absorbs an Opus 4.7 release into the Smart persona.
Publish and sort
Each matched modelId becomes (ModelOption, order), where order is the fourth column of the tuple. The whole list is sorted by order and the ModelOptions are extracted. availableModels is reassigned on @Published, which triggers SwiftUI recomputation across ModelToggleButton and SettingsPage.
The user sees Scary, Fast, Smart
AIResponseView.swift:1131 iterates the new availableModels inside a SwiftUI Menu. A user tapping the chevron-down pill sees the three persona labels. The underlying modelId is stored on selection, session/set_model sends it to the bridge, and a query proceeds against claude-opus-4-7, claude-sonnet-4-6, or claude-haiku-4-5.
Consumer abstraction vs developer enumeration
What the April 2026 SERP roundups do, next to what a consumer Mac app actually has to do. The differences come from Fazm's position above the model layer.
| Feature | Every April 2026 LLM release roundup | Fazm |
|---|---|---|
| How April 2026 releases are surfaced to the user | Model ID dropdowns, radio lists of claude-sonnet-4-6 vs opus-4-7 vs gpt-5-turbo vs grok-4-1. | Three personas: Scary, Fast, Smart. The IDs claude-haiku-4-5, claude-sonnet-4-6, claude-opus-4-7 never appear. |
| Work required when a new release like Opus 4.7 ships | Add the new model ID to a config file, push an update, notify users to re-select. | Zero. modelId.contains("opus") at ShortcutSettings.swift:184 matches on the day of release. |
| Where versioning churn lives | Visible. User sees the model ID change and has to opt in to each new version. | Hidden. Fazm's persona keeps pointing at 'latest Opus' across 4.5, 4.6, 4.7, and beyond. |
| What happens to users who had pinned an old version | User is pinned until they notice and manually update. | Lines 310 to 316 migrate them once, during a rate-limit incident, with a durable shortcut_didMigrateFromOpus bool. |
| What happens when a new family like Gemma 4 or DeepSeek V4 arrives via an Anthropic-compatible proxy | Either invisible until hardcoded, or dumped into the same flat list with no ordering. | Else branch at lines 187 to 189 shows the raw API name, sort order 99, below the three personas. |
| How many tuple columns shape the UI | A JSON config file with hand-maintained entries per release. | Twelve: three rows by four columns (substring, short, family, order) at lines 159 to 163. |
What a user sees the day after a release
The same Mac UI, before and after the April 2026 Opus 4.7 GA.
The Fazm floating bar across an Opus 4.7 launch
Floating bar dropdown shows three entries: 'Scary (Haiku, latest)', 'Fast (Sonnet, latest)', 'Smart (Opus, latest)'. Selecting 'Smart' writes 'claude-opus-4-6' to UserDefaults. Queries are answered by Opus 4.6.
- Scary / Fast / Smart visible
- Underlying ID: claude-opus-4-6
- User saw no version string
One-time migration
The only release-era branch that writes state
The registry is declarative. The one imperative exception is a one-time Opus to Sonnet rotation triggered by a rate-limit incident earlier in 2026. It runs once per user, guarded by a durable bool in UserDefaults. It does not repeat per release. It is the proof that Fazm treats release churn as a UI concern, not a configuration one.
What the three-row registry commits to
Six claims encoded in twelve tuple values
The registry at ShortcutSettings.swift lines 159 to 163 looks like a three-row lookup table. It is in fact a statement about how release churn should feel inside a consumer Mac app.
What the three-row tuple claims
- modelId.contains() is the entire release-absorption logic. No semver parsing.
- Three rows in modelFamilyMap cover every Anthropic release past, present, and future.
- Scary/Fast/Smart never changes even when Opus goes from 4.5 to 4.6 to 4.7 to 4.8.
- Unknown model families survive via the else branch as first-class but below-the-fold options.
- The ACP SDK's 'default' pseudo-model is stripped at bridge time, never reaches the UI.
- shortcut_didMigrateFromOpus is a one-time rate-limit-era migration, not a pattern repeated per release.
“modelFamilyMap.first(where: { modelId.contains($0.substring) })”
ShortcutSettings.swift line 183, the entire release-absorption logic on one line
Watch an April 2026 release land as a persona chip on a real Mac
Thirty minutes with the team. Pick any new Claude release, switch accounts, and watch Scary, Fast, and Smart re-bind automatically in the floating bar.
Book a call →FAQ: April 2026 LLM releases as three Mac personas
What were the major large language model releases in April 2026?
April 2026 was the most release-dense month on record. Anthropic shipped Claude Opus 4.7 GA, Sonnet 4.6, and Haiku 4.5. OpenAI shipped GPT-5 Turbo and GPT-6 previews. xAI shipped Grok 4.1. Google released Gemma 4 under Apache 2.0 with Dense 31B and MoE 26B variants on April 2. Meta shipped Llama 4 Scout. Alibaba shipped Qwen 3.6-Plus. Z.ai shipped GLM-5.1 as a 754B MoE. DeepSeek released V4, a one-trillion-parameter MoE under Apache 2.0. Mistral released Medium 3 on April 9 with open weights. Arcee released Trinity, a 400B Apache 2.0 model. Every SERP roundup lists these with benchmarks, API IDs, training costs, and pricing tables.
What does every April 2026 LLM release roundup miss?
They enumerate releases from the provider side: model IDs, parameter counts, benchmark scores, API pricing, training compute. None describe what the non-technical Mac user actually clicks the day a new release ships. That is a product question, not a model question. Fazm answers it concretely: three personas called Scary, Fast, and Smart, backed by a three-row substring registry that auto-absorbs every Haiku, Sonnet, or Opus release without a UI update.
Where is the three-row registry in the Fazm source?
Open Desktop/Sources/FloatingControlBar/ShortcutSettings.swift, go to lines 159 to 163. You will see a private static constant called modelFamilyMap typed as an array of four-column tuples with columns (substring, short, family, order). The three rows are literally: ('haiku', 'Scary', 'Haiku', 0), ('sonnet', 'Fast', 'Sonnet', 1), ('opus', 'Smart', 'Opus', 2). Three rows, twelve columns total, renames every shipping Claude model for every Fazm user on every Mac.
How does the registry actually pick up a new release like Opus 4.7?
At ShortcutSettings.swift lines 178 to 212, the updateModels function receives the ACP SDK's availableModels payload (an array of { modelId, name, description }). For every model, it runs Self.modelFamilyMap.first(where: { modelId.contains(substring) }). Because 'claude-opus-4-7' contains 'opus', it matches the third row, which yields a ModelOption with label 'Smart (Opus, latest)' and shortLabel 'Smart'. The sort step at line 191 orders by the fourth column so Scary, Fast, Smart always appear in that order in the dropdown. No strings, versions, or IDs ever reach the user.
Where does the ACP SDK's model list come from?
It originates from the Claude Agent SDK response to session/new, which includes a models.availableModels array. Fazm's bridge (acp-bridge/src/index.ts) intercepts this at line 1347, calls emitModelsIfChanged at line 1271, filters out the 'default' pseudo-model at line 1274, and emits a JSON event { type: 'models_available', models: [...] } at line 1279. On the Swift side, ACPBridge.swift lines 1202 to 1213 parses this into an array of (modelId, name, description) tuples and calls onModelsAvailable, which is wired to ShortcutSettings.updateModels. The day Anthropic adds 'claude-opus-4-8' to availableModels, it flows through this pipeline and shows up in the Fazm dropdown the next time a user opens the floating bar.
Why Scary, Fast, Smart instead of the model names?
Because a persona is stable across releases, and a model ID is not. In April 2026 alone, Anthropic's 'Smart' option moved from Opus 4.5 to 4.6 to 4.7 GA. A user who selected 'Smart' three months ago keeps getting the latest Opus, automatically. A user who had selected 'claude-opus-4-5' would be pinned to an older model until they manually updated. The persona abstracts away the versioning churn. 'Scary' maps to Haiku because Haiku is the fastest and the label hints at how fast it feels. 'Fast' maps to Sonnet because it is the balanced workhorse. 'Smart' maps to Opus because Opus runs slower but thinks harder.
What is the default model and fallback list?
Default: 'sonnet'. When UserDefaults has no saved value, ShortcutSettings.swift line 325 sets self.selectedModel to 'sonnet'. The fallback defaultModels array at lines 151 to 155 ships three ModelOption rows with the short aliases 'haiku', 'sonnet', 'opus' so the dropdown still works when the ACP SDK has not reported the dynamic list yet. Once session/new returns, updateModels replaces defaults with the actual model IDs like 'claude-sonnet-4-6' while preserving the persona labels.
Is there a migration path if a user previously selected Opus?
Yes, at ShortcutSettings.swift lines 310 to 316. The init checks UserDefaults for shortcut_didMigrateFromOpus. If false and the saved model contains 'opus', it writes 'sonnet' to UserDefaults and sets shortcut_didMigrateFromOpus = true. This was added during an Anthropic rate-limit incident where pinned-Opus users were hitting per-user caps; the migration rotates everyone onto Sonnet once, after which they can manually switch back to Smart if they want. The registry-based label system still points at whatever Opus variant is current.
What happens when the ACP SDK returns a model family Fazm does not know about, like Gemma 4 or DeepSeek V4?
At ShortcutSettings.swift lines 187 to 189, the else branch handles unknown families: it uses the display name from the model.name field if present, otherwise the raw modelId, and assigns order 99 so it sorts after Scary, Fast, Smart. That is why a self-hosted Anthropic-compatible proxy serving Gemma 4 would surface as 'gemma-4-31b-it' or whatever name the proxy reports, sorted below the three core personas. The three-row registry is intentionally narrow: it only absorbs releases from the three Anthropic families. Everything else is handled explicitly as an unknown.
Does switching a persona require starting a new session?
No. At acp-bridge/src/index.ts line 1475, handleQuery calls session/set_model before every query, passing the requested modelId. Switching from Smart to Fast mid-conversation just changes which modelId lands in that session/set_model call on the next prompt. The conversation keeps its memory. That is a second reason the persona abstraction works: a user can ask Smart to plan, ask Fast to execute, ask Scary to do a summary, and the underlying session/set_model handles the rotation without losing context.
Where can a user actually see the three personas on a Mac?
Two places. First, the floating control bar: AIResponseView.swift lines 1116 to 1159 defines ModelToggleButton, a SwiftUI Menu that renders a chevron-down pill with the selected shortLabel (Scary, Fast, or Smart). Clicking it expands the list of ShortcutSettings.availableModels. Second, the settings page: SettingsPage.swift line 2025 iterates over shortcutSettings.availableModels for a larger picker. Both read from the same @Published var availableModels published by the registry, so any April 2026 release flows through to both UIs simultaneously.
More Fazm guides anchored in real file:line facts.
Related reading
LLM Research Updates April 2026
TurboQuant, PaTH Attention, and Muse Spark rendered as a single orange 'compacting context' label in the Fazm chat header.
Anthropic News April 2026
What shipped from Anthropic in April: Opus 4.7 GA, Sonnet 4.6, Haiku 4.5, and how the ACP SDK exposes all three to a shipping Mac app.
Claude Code Cursor Copilot Comparison 2026
How consumer-first tools like Fazm differ from developer-first tools when a new model family drops.
Comments (••)
Leave a comment to see what others are saying.Public and anonymous. No signup.