Field report from a non-screenshot Mac agent
Anthropic Claude, April 2026, read from a Mac that sends accessibility trees, not screenshots
Sonnet 4.6 held the default slot. Opus 4.7 went GA on April 22 at $5 input and $25 output per million tokens. The Agent Client Protocol moved from 0.25.0 to 0.29.2 in 13 days. That is the news cycle. What follows is what the news cycle actually feels like inside a desktop app that does not send pixels to Claude, and the three-layer macOS permission probe that keeps that pipeline alive when the TCC cache lies.
The short version
Most roundups of Anthropic's April 2026 news focus on model benchmarks and pricing. Useful, but only half the story on a Mac. The other half is how a desktop agent delivers screen context to Claude and routes Claude's actions back to real UI elements. If you send pixels, your agent does OCR and coordinate math before Claude even looks at the frame. If you send accessibility trees, Claude receives a few kilobytes of structured text with stable element refs and simply does better work.
Fazm takes the second path. That decision makes the April news cycle hit differently. The smarter Claude gets at tool use, the more leverage a clean accessibility pipeline has. The bottleneck becomes the macOS permission check, specifically how you detect when the TCC database lies about your Accessibility grant. The rest of this page is what changed in Anthropic's world in April 2026 and how each piece flowed through a pipeline that lives at the accessibility layer, not the pixel layer.
“Repeated rate-limit failures caused a single-user crash loop. The fix was two string literals in ChatQueryLifecycle.swift. The news that triggered it was a reworded rate-limit error at the Anthropic edge.”
Fazm 2.2.0 release notes, April 11, 2026
How the news reaches a running Mac, end to end
GA day for Opus 4.7 was April 22, 2026. No new Fazm build shipped that day. The new model still appeared in the Smart slot of the picker the first time the app opened a new session that morning. This is the path it took.
April 22, 2026 — Opus 4.7 GA, no app rebuild
The news, one beat at a time
April 2026 was not one big announcement. It was seven small ones spread across 20 days. Here they are in the order they hit, tied to Fazm's own CHANGELOG.json rather than Anthropic's press page.
April 3 — Sonnet 4.6 continues as everyday default
No new model drop, but Sonnet 4.6 settles in as the workhorse. Fazm 2.0.1 lands the same day with a wider default chat window and a fix for an orphaned ACP bridge spinning at 100% CPU. The pipeline that will carry the rest of April's news is already running.
April 5 — personal Claude plans lose silent failures
Anthropic quietly tightens the error payload when a user's personal plan lacks access to the selected model. Fazm 2.0.7 ships the same day with an auto-fallback to the built-in account, turning a silent blank bubble into a one-line switch.
April 7 — Agent Client Protocol 0.25.0
The Claude Code side of ACP ships 0.25.0 with reshaped credit and rate-limit error shapes. Fazm 2.1.2 upgrades the bridge the same day. Onboarding no longer fails silently when credits run out.
April 11 — rate-limit wording shifts again
The edge starts returning a new phrasing for usage-limit errors. Fazm 2.2.0 ships a two-substring guard that covers both 'usage limit' and 'rate limit' so a wording flip does not become a crash loop.
April 16 — honest privacy language
Downstream of Anthropic's own memory and observer updates, Fazm 2.3.2 rewrites onboarding and system prompts to say 'local-first' instead of 'nothing leaves your device'. The background observer session round-trips to Anthropic for inference; the resulting memory files live on disk.
April 20 — ACP 0.29.2 and a dynamic model list
Two weeks after 0.25.0, ACP jumps to 0.29.2. Fazm 2.4.0 picks it up and rewires the model picker to populate from the live agent response. New Claude IDs arrive without an app release.
April 22 — Claude Opus 4.7 GA
Opus 4.7 goes GA at $5 input and $25 output per million tokens. On Macs running Fazm, it appears in the Smart slot of the model picker the first time the app opens a new session that morning. No rebuild. No banner. Just a new ID the bridge emits, a three-row substring table relabels, and the chat header rerenders.
The anchor fact: a three-layer accessibility permission probe
If you only read one code block on this page, read this one. It lives at Desktop/Sources/AppState.swift, lines 431 through 504. Three layers of permission detection, because macOS 26 Tahoe has a per-process TCC cache that AXIsProcessTrusted hits and that can go stale after OS updates or app re-signs.
Layer 1 makes a real AX call. If that returns cannotComplete, the result is genuinely ambiguous: either our permission is broken, or the frontmost app does not implement AX at all (Qt, OpenGL, PyMOL). Layer 2 disambiguates by retrying against Finder, which always implements AX. Layer 3 handles the edge case where Finder is not running, by creating a listen-only CGEvent tap. Tap creation consults the live TCC database, which is why it sidesteps the stale cache that burned us enough times to justify all three layers.
Why this is the load-bearing file
Every April 2026 Claude news item, Sonnet 4.6, Opus 4.7, ACP 0.25.0 and 0.29.2, reshaped credit payloads, improved rate-limit messages, makes the model a better partner for a desktop agent. But none of that matters on a Mac if our AX tree is empty because the permission check lied. The probe in AppState.swift is the reason an April Claude upgrade shows up as better behavior on the user's machine, not as a silent regression.
Why it matters what you send Claude
Screenshot-based agents were the default computer-use approach through most of 2024 and 2025. They still dominate browser tooling. On a Mac, the accessibility path is almost always stronger. The same user prompt looks radically different depending on which payload you send.
same task, two payloads to Claude
// pseudo: what a screenshot-based computer-use agent does
let image = CGDisplayCreateImage(displayID)
let png = encodePNG(image) // ~500 KB to 2 MB per frame
let response = await claude.messages.create({
model: "claude-opus-4-7",
messages: [{
role: "user",
content: [
{ type: "image", source: { data: png, type: "base64" } },
{ type: "text", text: "click the send button" }
]
}]
})
// Claude runs OCR + vision, guesses pixel coords,
// the agent dispatches a click at (x, y), hopes UI hasn't shiftedThe left path ships a 500 KB to 2 MB PNG per frame and forces Claude to run OCR plus coordinate math. The right path ships a few kilobytes of text with stable element references that Claude can name directly. Opus 4.7's published input price is $5 per million tokens. The pricing alone rewrites the math.
The news as headlines a Mac agent can verify
Each of these bites is a checkable fact from the Fazm repo or its CHANGELOG.json, not a rewording of an Anthropic blog post.
Sonnet 4.6 is still the quiet default
Six Fazm call sites pin claude-sonnet-4-6 explicitly in Swift: OnboardingChatView, BrowserProfileMigrationManager, DetachedChatWindow. When the news cycle says 'Sonnet 4.6 holds up', that is what holds up.
Opus 4.7 GA, April 22
$5 in and $25 out per million tokens. Populates Fazm's Smart slot without a rebuild because ShortcutSettings.updateModels maps substrings, not version numbers.
ACP 0.25.0 to 0.29.2 in 13 days
Two protocol bumps inside April. The bridge absorbs both. The Swift path sees a stable models_available event on the Unix socket, regardless of wire format.
Built-in account as safety net
When a user's personal Claude plan lacks access to Opus 4.7, Fazm silently switches to a managed Vertex AI Claude instance so the next turn does not fail.
Credits vs rate limits, kept separate
AnalyticsManager tracks creditExhausted and rateLimitEvent on different event names because they route the user to different URLs: OAuth vs billing.
Honest privacy language
The background observer session round-trips to Anthropic. April 16 copy rewrite swaps 'nothing leaves your device' for 'local-first' everywhere it mattered.
What flows through the pipeline, step by step
From Anthropic's ID publish to an Opus 4.7 action on your Mac
Anthropic publishes claude-opus-4-7
Model ID becomes reachable via Messages API and Vertex.
ACP SDK reports availableModels
Fresh list arrives on the next session/new, 'default' dropped.
Bridge emits models_available
Deduplicated diff streamed over Unix socket to the Swift app.
ShortcutSettings remaps IDs
Three-row substring map relabels everything Scary, Fast, Smart.
Permission probe returns true
Three-layer check in AppState.swift confirms AX is live.
Walker emits AX tree for focused window
A few kilobytes of structured text, not a PNG.
Opus 4.7 receives context, returns a named element
No OCR, no pixel math. Stable ref dispatches a click.
What the user sees when the probe runs
The probe is loud in the dev log on purpose. Every layer annotates itself so the trail is visible. Here is a real tail from the day we reproduced the stale-cache bug on macOS 26 Tahoe.
The April news, counted
Layer 1 is a single AXUIElementCopyAttributeValue on the frontmost app, which returns synchronously in the low milliseconds for any AX-compliant app. Layer 2 runs only on cannotComplete and adds one more AX call against Finder. Layer 3 is CGEvent tap creation, on the order of a hundred microseconds. The entire probe is cheap enough to run on every foreground app change.
The April news measured another way
Fazm shipped 0 tagged releases between April 3 and April 20, 2026. Over those 17 days, Opus 4.7 pricing dropped to $0 input and $0 output per million tokens on April 22. ACP moved through 0 minor versions in 13 days. The accessibility permission probe stayed at exactly 0 layers, because the correct number of layers does not move with the news cycle.
What other shipping Mac teams can borrow
If you run a desktop product that leans on Claude for computer use and you just absorbed this month's news, this is the short list we now keep pinned.
Post-April-2026 Claude audit for Mac teams
- Your screen context pipeline does not send screenshots unless it must. AX tree first, pixels only as a fallback.
- Your permission detection calls a real AX API, not just AXIsProcessTrusted, because the per-process cache lies on macOS 26.
- Your permission detection disambiguates cannotComplete by retrying against a known AX-compliant app like Finder.
- Your last-resort probe creates a CGEvent tap, because that path consults the live TCC database instead of the cache.
- Your model picker is populated from the live agent response, not a hardcoded enum, so Opus 4.7 lands the day it goes GA.
- Your rate-limit string match is a substring check on two phrases, because the edge has reworded the same error at least twice this year.
- Your privacy copy reflects what actually leaves the device. If a background observer session round-trips to Claude, the onboarding string has to say local-first, not nothing leaves your device.
Want to see the probe disambiguate a stale TCC cache live?
Book 20 minutes. We will screenshare a Fazm session with /tmp/fazm-dev.log tailing next to it, flip Accessibility off and on in System Settings, and walk through each of the three layers as they fire.
Book a call →Questions
What is the actual Anthropic Claude news from April 2026?
A quiet but dense month. Claude Sonnet 4.6 stayed the default for speed-sensitive workloads. Opus 4.7 went GA on April 22 at $5 input and $25 output per million tokens. The Agent Client Protocol SDK pushed to 0.25.0 on April 7 and to 0.29.2 on April 20. The credit-exhaustion and rate-limit error shapes were reshaped mid-month, which is why several downstream desktop apps shipped small patches the same week. No banner announcement, but a steady drip of changes at the edges of the API. The Fazm repo ended April with 10 tagged releases covering those exact edges.
Why does a Mac desktop agent need to care about Claude news at all? It is all the same API.
Because the API is only half the story on macOS. Claude is doing the reasoning, but the app has to deliver clean screen context for Claude to reason about, and has to route Claude's clicks back to real UI elements. If you send pixels, Claude runs OCR and guesses coordinates. If you send accessibility trees, Claude gets structured text with stable refs and is simply better at the task. The smarter Claude gets, the more leverage the input format has. Opus 4.7 on a screenshot-based pipeline still has to squint at the same pixel blobs.
What is the three-layer accessibility permission probe, concretely?
It is testAccessibilityPermission in Desktop/Sources/AppState.swift, at lines 431 through 504. Layer 1, line 441: AXUIElementCopyAttributeValue against the frontmost app's kAXFocusedWindowAttribute. If that returns success, noValue, notImplemented, or attributeUnsupported, the permission is fine. If it returns apiDisabled, the permission is off system-wide. If it returns cannotComplete, that is ambiguous: it can mean our permission is broken, or it can mean the frontmost app just does not implement AX (Qt, OpenGL, Python-based apps like PyMOL). Layer 2, line 468: confirmAccessibilityBrokenViaFinder retries the same call against Finder, a known AX-compliant app. If Finder also fails, the permission is truly broken. If Finder succeeds, the original failure was app-specific and our permission is fine. Layer 3, line 490: if Finder is not even running, probeAccessibilityViaEventTap calls CGEvent.tapCreate with a listen-only mouseMoved tap. Tap creation checks the live TCC database, unlike AXIsProcessTrusted(), whose per-process cache can go stale on macOS 26 Tahoe. Three layers, one boolean.
Why not just call AXIsProcessTrusted and move on?
Because it lies. On macOS 26, AXIsProcessTrusted caches the 'granted' result inside our process, and after certain OS updates, app re-signs, or TCC database rebuilds, the cached answer stays 'granted' even though real AX calls fail with apiDisabled. We hit this exact class of bug enough times that the fix had to stop trusting the cache. The event tap probe is the tiebreaker because CGEvent.tapCreate bypasses the cache and asks the kernel live.
How does this three-layer probe connect to the Anthropic Claude April 2026 news?
The connection is the screen-context pipeline. Every piece of April news, Sonnet 4.6 settling in, Opus 4.7 GA, ACP 0.25.0 then 0.29.2, tightened error handling, makes Claude faster and more capable at reading UI and acting on it. But on a Mac, Fazm can only deliver the accessibility tree to Claude if the permission check succeeds. If the probe is naive and the TCC cache is stale, Fazm reports permission-granted to the user while every AX call silently fails, the tree is empty, and Claude gets zero signal. The smartest Opus model in the world cannot help an empty payload. The three-layer probe is what lets an April news item translate into real behavior on a user's machine.
How big is the accessibility tree Fazm sends to Claude, compared to a screenshot?
On typical focused-window traversals we see a text payload in the low single-digit kilobytes. A PNG screenshot of the same window at 2x Retina is usually 500 KB to 2 MB before base64 encoding, which then inflates it by roughly a third. That is a 100x to 1000x difference in tokens. When Opus 4.7 runs at $5 input per million tokens, the pricing alone justifies the format. The larger win is accuracy: Claude receives labeled elements with roles, titles, frames, and focus state, so it can name the thing it wants to click instead of guessing coordinates.
What happens if the user is running an app that does not expose AX at all, like an OpenGL game?
Layer 2 is what saves us. testAccessibilityPermission will hit cannotComplete against the game. The naive response would be to flip isAccessibilityBroken to true and harass the user to re-grant permission. Instead, confirmAccessibilityBrokenViaFinder retries against Finder. Finder always responds, so if Finder succeeds, we know our permission is fine and the game was the problem. The user keeps working without a single false alarm. This exact branch fires routinely for users running PyMOL and certain Qt apps.
Did any April 2026 Claude news require a change to the permission probe itself?
No. The probe lives at a different altitude than the model news. Sonnet 4.6 and Opus 4.7 care about the payload; ACP bumps care about the wire format; the permission check cares about macOS TCC. That is exactly why the probe stayed stable while the rest of the stack flexed through 10 tagged releases in 17 days. The design intent is that Anthropic model news never lands in this file.
Can I see this probe fire on my own Mac?
Yes, easily. Run Fazm, then tail /tmp/fazm-dev.log and look for ACCESSIBILITY_STARTUP and ACCESSIBILITY_CHECK log lines. They are emitted from AppState.swift lines 237 and 450 respectively. Revoke Accessibility for Fazm in System Settings while the app is running and the log will immediately print either apiDisabled or a cannotComplete line followed by the Finder retry. Re-grant permission and the log prints TCC=true, broken=false on the next startup check.
Is the Agent Client Protocol news relevant to non-Claude-Code apps?
It is if your app talks to Claude Code behind the scenes. ACP is how the Claude Code runtime communicates with client surfaces. Fazm uses it because the Fazm desktop app is an ACP client that wraps the Claude Code agent, which means ACP bumps land on us directly. If your product talks to Anthropic's public Messages API only, the ACP bumps are invisible. If you bridge to Claude Code, every ACP minor version can reshape the error payload shape, which is why a seven-line substring guard ended up more important than any model version bump.
Other slices of the same month, written from inside the same shipping Mac agent
More from the April 2026 Claude cycle
Anthropic Claude updates April 2026
The six silent failure modes April's news forced into ChatQueryLifecycle.swift, file by file. Sister page to this one, focused on error guards instead of screen context.
Anthropic new model April 2026
The three-row substring table that relabels any Claude model ID to Scary, Fast, or Smart, so Opus 4.7 lands in the picker without an app release.
Anthropic April 2026 news
A different slice of the same month, focused on the single function and single JSON file that let a shipping Mac app absorb Anthropic news with zero user-facing updates.