DEV Community

Cover image for Why Developer Experience (DX) Isn't Enough in 2026: You Need Agent Experience (AX)
JimmyLiao for Google Developer Experts

Posted on Edited on Originally published at memo.jimmyliao.net

Why Developer Experience (DX) Isn't Enough in 2026: You Need Agent Experience (AX)

For the last decade, we spent our weekends polishing .dotfiles. We tuned Nerd Fonts, crafted shell aliases, and memorized window manager keybindings. That entire discipline was built around DX (Developer Experience)—optimizing the machine for human eyes and human fingers.

In 2026, if you look at htop on my 16GB M1 MacBook or my multi-cloud Ubuntu Dev-Boxes (across Google Cloud Compute Engine and Azure Linux VMs / WSL2), the hardest-working user on those machines isn't me anymore.

It's a fleet of concurrent AI Coding Agents—led by Google Antigravity (agy / Gemini CLI powered by Gemini 2.5 Pro's 1M context window & context caching) alongside OpenAI Codex (codex / GitHub Copilot CLI), Claude Code (claude), and OMP (omp)—running across dozens of tmux panes, driving headless browsers via Chrome DevTools MCP, building Docker images in parallel git worktrees, and streaming tens of megabytes of .jsonl session state.

Here is the catch: system defaults that feel "fine enough" to a human are often a brick wall for an autonomous agent.

While preparing my upcoming Build with Gemini Taipei (Google Developer Groups / GDE) session on AI-Native Ops, I instrumented and measured every hidden bottleneck that was slowing down my agents, freezing my 16GB Mac's UI, or wiping out agent session histories across cloud VM reboots. No fluff, no theoretical hype—just hard numbers, root causes, and why we need to start engineering for AX (Agent Experience).

DX vs AX Architecture


Case 1: The 8-Second Browser Black Hole & 12GB of APFS Ghost Clones

Whenever my Gemini / agy or omp agents needed to verify a UI change or inspect DOM state via Chrome DevTools Protocol (CDP), Chrome DevTools MCP, or Puppeteer, everything felt sluggish. A tiny verification task would burn 15+ seconds just opening and closing Chrome. Worse, after Chrome 136+, many existing CDP setups suddenly stopped connecting altogether.

I measured what was actually happening on my M1 16GB Mac (running Chrome Dev 159) and uncovered two compounding issues:

1. Chrome 136+ Default Profile Lockout & The "Fat Profile" Tax

Starting in Chrome 136, Chromium intentionally blocks --remote-debugging-port when pointed at the default user data directory (~/Library/Application Support/Google/Chrome or Chrome Dev) to prevent local malware from hijacking active cookies and sessions.

Even if you clone or point an agent at a copy of a human profile (mine had 878MB+ of data, 11 extensions, and active Service Workers), the startup and teardown latency is brutal:

DX vs AX Benchmark Table

System Pillar DX (Human Assumption) AX Bottleneck (What Agents Hit) ax-playbook Measured Result
Pillar 01 · Browser CDP
Chrome 136+ CDP Launch & Shutdown
Humans open Chrome once a day; an 878MB daily profile loaded with 11 extensions and tab history feels fine. Chrome 136+ blocks --remote-debugging-port on the default profile; fat profile cold start takes 5,345ms and shutdown hangs for 8,002ms on SIGTERM. Dual-instance isolation with dedicated agent --user-data-dir: warm CDP attach in 459ms (11.6x faster), clean exit in 92ms (87x faster).
Pillar 02 · APFS Hygiene
macOS Gatekeeper code_sign_clone & Stale Frameworks
macOS automatically manages /private/var/folders temp files, and app updates don't silently eat SSD space. Frequent CLI/agent app launches trigger syspolicyd staging, leaving 12.0 GB of orphaned *.code_sign_clone bundles plus 745 MB of old Chrome Frameworks. Safe dry-run & surgical purge of orphaned clones and stale frameworks: 0 B orphans remaining, +12.7 GB reclaimed in one pass (human cookies untouched).
Pillar 03 · Local AI & ASR
16GB M1 Local LLM & Speech-to-Text Disk
Downloading a few multi-GB HuggingFace weight files to test a local LLM or Whisper model is harmless. Multi-model experiments accumulate 14.3 GB inside ~/.cache/huggingface, choking 256GB/512GB SSDs and causing heavy Unified Memory swap. Switch to macOS 27 native /usr/bin/fm --model system (0 B extra disk, 0.76s TTFT) paired with an 848MB quantized whisper.cpp model.
Pillar 04 · 16GB Stability
16GB Memory Guard & Spotlight Indexing Storms
If a terminal or Node process eats RAM, a human notices the lag and kills it; full-disk Spotlight indexing is convenient. A runaway >4GB node child process freezes WindowServer before Jetsam intervenes; rapid agent writes in ~/.cache and .worktrees spike mds_stores CPU. Deploy a 30s RSS Guard (auto-kills runaway >4GB child node processes) + drop .metadata_never_index across caches (Apps-only Spotlight).
Pillar 05 · Continuity
Dev-Box Reboot & Multi-Agent Tmux Resume
tmux-resurrect saves every 15 minutes; restoring empty shell panes after a cloud VM or Mac reboot is good enough. Within 15 minutes of a reboot, empty tmux overwrites the last healthy snapshot—and naive restore loses active conversation UUIDs across 20+ agents. Kernel boot_id / bootsessionuuid guard archives preboot-* snapshots and resolves exact JSONL / Session UUIDs in-place across OMP, AGY, Claude, and Codex.
Browser Mode Cold Start / CDP Ready Shutdown (SIGTERM) What Actually Happens
Fat Human Profile (878MB+, 11 extensions, session restore) 5,345 ms 8,002 ms Extensions and Service Workers refuse to exit cleanly until SIGTERM times out
Isolated Clean Profile (chrome-dev-fast minimal flags) 2,801 ms (Headless: 2,076 ms) 92 ms 87x faster shutdown; exits almost instantaneously
Warm Daemon Instance (Persistent CDP Attach) 459 ms 0 ms (reused) 11.6x faster than cold start; instant attach for back-to-back Chrome DevTools MCP tasks

2. The 12GB code_sign_clone Ghost Hiding in /private/var/folders

While profiling Chrome startup, I audited my APFS disk usage and found 18GB+ of vanished space caused by how macOS handles frequent browser launches and background updates.

Whenever a 1.5GB .app bundle like Google Chrome Dev.app updates or gets interrupted mid-launch during heavy CDP automation, macOS Gatekeeper (syspolicyd) stages an APFS copy-on-write bundle under /private/var/folders/.../X/com.google.Chrome.dev.code_sign_clone/.

When those checks time out or get interrupted, the clones are orphaned. I had 8 orphaned .app.bundle copies sitting in /private/var/folders, silently eating 12.0 GB of SSD space—on top of 745 MB from duplicate Chrome Framework versions and 5.3 GB of bloated Service Worker/CacheStorage directories.

The AX Fix: Dual-Instance Isolation

Security and speed point in the exact same direction here. I split my browser architecture into two strict tracks:

  1. Human Chrome: Full extensions, Apple Keychain, sync enabled, zero CDP ports open.
  2. Agent CDP Chrome (--user-data-dir isolation + Warm Daemon): Stripped of background networking, sync, and phishing checks, wrapped in a dedicated emerald-green CDP Dock icon so I never Cmd+Tab into the wrong window. High-frequency agents (agy, omp, Chrome DevTools MCP) attach to the warm daemon in 459 ms; one-off isolated runs use chrome-dev-fast and exit in 92 ms.

Case 2: 16GB Apple Silicon Survival — WindowServer Freezes & Zero-Disk Native Models

Can a 16GB Apple Silicon Mac still run a heavy multi-agent workflow in 2026 while delegating long-context synthesis to Gemini 2.5 Pro (agy) in the cloud?

Yes—if you build the guardrails that macOS left out.

Here are the three biggest traps we hit on a 16GB M1 Mac and how we fixed them:

1. Why a Runaway node Child Process Freezes WindowServer

Normally, macOS Jetsam kills memory-hogging processes before the system locks up. However, there is a nasty edge case: developer terminals signed with the com.apple.security.get-task-allow entitlement (like development builds of cmux) pass special treatment down their process tree.

When a runaway node process or MCP server spawned inside that terminal leaks memory and crosses 4 GB RSS, Jetsam hesitates to kill it. Instead, WindowServer starves for memory and freezes the entire GUI—your cursor moves, clicks do nothing, and only a hard power-button reboot saves you.

The AX Fix (cmux-rss-guard): A lightweight LaunchAgent running every 30 seconds that walks the terminal's child process tree. Any child node process exceeding 4 GB RSS (4,194,304 KB) is immediately terminated with SIGKILL (kill -9) before WindowServer can stall.

2. Stopping Spotlight (mds_stores) from Thrashing Agent Worktrees

Humans create a new project folder once a week. A fleet of agents creates five git worktrees and hundreds of thousands of node_modules / .venv files before lunch. Leaving macOS Spotlight on default settings causes mds_stores to burn CPU and SSD I/O non-stop.

The AX Fix: Configure Spotlight to Apps & System Settings Only, and automatically drop .metadata_never_index markers into ~/workspace, ~/.cache, ~/.npm, ~/.cargo, and container runtime directories.

3. Reclaiming 14.3GB of Model Cache (Gemma 4 / Phi-4-mini Benchmarks vs. Zero-Disk /usr/bin/fm)

While benchmarking small local models—including Google's Gemma 4 E2B, Microsoft's Phi-4-mini, and Qwen 3.5 4B—my ~/.cache/huggingface ballooned by 14.3 GB of redundant 3B–4B experimental weights. To keep my 16GB Mac's SSD and unified memory lean for heavy agent orchestration, I offloaded heavy long-context reasoning to Gemini (agy) and switched lightweight local shell tasks to macOS 26/27's built-in /usr/bin/fm CLI (Apple Foundation Models, AFM 3 Core).

Because AFM ships inside the read-only macOS system volume, it has zero extra disk overhead. In my M1 benchmarks on short summarization tasks, running /usr/bin/fm with --model system delivered a median TTFT (Time to First Token) of 0.69s–0.76s and total completion under 0.97s. Paired with an 848 MB whisper.cpp model (ggml-breeze-asr-26-q4_0.bin) for local bilingual speech-to-text, the entire local AI stack runs fast without eating the disk.

(Pro tip: Always pass --model system for background agents. Calling --model pcc outside native Terminal.app fails Apple's TCC entitlement check with HTTP 503: "Please use the Terminal app".)


Case 3: The Cloud Dev-Box Reboot Trap & Terminal Type-Ahead Architecture

Alongside my Mac, I run a 24×7 cloud Ubuntu Dev-Box (a pattern that applies equally to Google Cloud Compute Engine and Azure Linux VMs / WSL2) hosting 10+ active tmux sessions, 20+ top-level agents, and 34MB+ of active .jsonl conversation transcripts.

When people set up a cloud Dev-Box, their first instinct for persistence is: "Let's add a 15-minute cron job that snapshots tmux so we can restore after a reboot!"

That naive cron job is a ticking time bomb.

1. How a 15-Minute Cron Job Wipes Your Pre-Reboot Snapshot

Trace what happens when a cloud VM hits a host maintenance reboot or spot preemption at 3:02 AM:

  1. The Ubuntu box reboots cleanly. tmux is now either empty or has a single blank session spun up by an init script.
  2. At 3:15 AM—while you are still asleep—the 15-minute cron job fires.
  3. The script sees the empty post-reboot tmux state and immediately overwrites your healthy pre-reboot snapshot (the one that had all 20 agents and their working directories).

Even worse, standard tools like tmux-resurrect only restore empty zsh shells—they have no idea which .jsonl transcript or session UUID was running in each pane across AGY (Google Antigravity), OMP, Claude Code, and Codex, or they mistakenly treat internal worker processes (like OMP's __omp_worker) as interactive sessions.

The AX Fix: Kernel boot_id Guard + Cross-Runtime JSONL Mapping

We built a cross-platform tmux-agent-checkpoint.sh around three strict invariants:

  • Kernel boot_id Preboot Archiving: Every run checks /proc/sys/kernel/random/boot_id on Linux (or sysctl -n kern.bootsessionuuid on macOS) against the last recorded boot ID. The moment a reboot is detected, before touching a single file, the script archives the last healthy snapshot to preboot-<timestamp>.sh and marks it permanently exempt from rotation cleanup.
  • Exact TTY + /proc/<pid>/fd + Lockfile Resolution: It walks each pane's process tree, filters out background helpers (__omp_worker, daemon_broker, MCP servers), inspects open file descriptors and presence locks (including Google Antigravity's .system_generated/logs/transcript.jsonl and lockfiles), and generates exact cd <cwd> && <agent> --resume <uuid> commands for agy, omp, claude, and codex.
  • Atomic flock Writes: Uses flock -n to prevent overlapping runs and validates generated restore scripts with bash -n before an atomic mv -f.

Bonus UX Insight: Why OMP Supports Type-Ahead While AGY Locks Your Keyboard

When working alongside four different agent CLIs all day, you quickly notice a huge ergonomic difference: what happens when you start typing your next thought while the agent is still busy streaming or running a tool?

Digging into the internals of OMP (omp) vs. Google Antigravity (agy) reveals why:

  • Why OMP nails Type-Ahead: OMP decouples its raw stdin reader loop from the agent turn execution state machine. Keystrokes are captured immediately into an independent input buffer even while tools are running, and hitting Enter queues the prompt into a steer (mid-turn course correction) or follow-up queue. Your train of thought is never blocked.
  • Why AGY blocks input when busy: AGY is built in Go using Bubble Tea v2. In its Elm-style update loop, while the model state is in an active/streaming turn, the text input component stops accepting keystrokes until the turn finishes—making AGY phenomenal as an autonomous background/long-context subagent orchestrator powered by Gemini's 1M context window, while OMP shines as the interactive front-line multiplexer.

In 2026, great AX + DX isn't just about raw model intelligence—it's about whether the terminal I/O loop and OS environment respect asynchronous human-agent collaboration.


Open-Sourcing ax-playbook: From .dotfiles to @AGENTS.md

I've packaged all of these scripts, benchmarks, and safety guardrails into an open-source repository:

👉 GitHub: jimmyliao/ax-playbook

It covers both sides of a modern agentic setup:

  • macos/ (Lean Agent Mac): Chrome 136+ CDP 11.6x speedup & dual-instance isolation for Chrome DevTools MCP, APFS code_sign_clone 12GB cleanup, Spotlight noise suppression, the 16GB cmux-rss-guard, and macOS 26/27 /usr/bin/fm unlocking.
  • ubuntu/ (Resilient Agent Dev-Box for GCP / Azure / Linux): Multi-runtime Tmux × JSONL session checkpointing (AGY, OMP, Claude Code, Codex), boot_id preboot protection, Docker :candidate disk hygiene, and HTTP 401 passcode gates for external tunnels.

And because this is 2026, you don't even have to run the bash scripts by hand.

The repository ships with an @AGENTS.md contract enforcing a strict 3-Phase Safety Protocol (Phase 1: 100% Read-Only Audit → Phase 2: Measured Impact & Risk Table → Phase 3: Explicit User Consent Before Any Change).

Just clone the repo, open Google Antigravity (agy), Claude Code, Codex, or OMP, and paste this one-liner:

Read @AGENTS.md, auto-detect my OS (uname -s), and run the corresponding 100% read-only diagnostic script (./macos/scripts/audit-macos.sh on macOS or ./ubuntu/scripts/audit-ubuntu.sh on Linux). Present a Markdown table of what we can optimize with expected gains, and wait for my explicit approval before applying any changes.
Enter fullscreen mode Exit fullscreen mode

Let your agent audit its own home first. When you fix the environment for your agents, you get your own time—and your machine's sanity—back.


Author Note — Google Developer Expert (GDE) in AI / Cloud & Microsoft AI MVP perspective: These benchmarks and open-source guardrails were built while orchestrating Google Antigravity (agy powered by Gemini 2.5 Pro's 1M context window), Chrome DevTools MCP on Chrome 136+, Gemma 4 & Phi-4-mini local evaluations, and multi-cloud Linux Dev-Boxes across Google Cloud and Azure VMs for our upcoming **Build with Gemini Taipei* technical session.*

Top comments (0)