Mac + Claude Tune-Up

MacBookPro16,1 · 8-core i9 · 16 GB · macOS 26.5.1 · measured 2026-08-17
every number below came from a command on this Mac
0.8%
free disk (7.7 GB of 932 GB). The single largest cause of slowness.
33,206
tokens of fixed preamble every turn, 16.6% of the window, spent ahead of your first word.
7
standing rules that contradict each other or point at files that do not exist.
1.61 s
hook latency at every turn end, one full second of it a network call.
18 / 158
MCP servers and tools, with four duplicated capability families.
74%
memory free, 131 MB swap. RAM is healthy. Do not spend money here.

Applied 2026-08-17

done

Fix 2 from the ranked list is live. Backups first, nothing deleted.

Originals saved to ~/.claude/_config_sync_backups/20260817-contradiction-fix/. Both retired hook scripts remain on disk and can be rewired in one line.

ChangeFileResult
ultracode_default.py unwired, so no turn orders a workflow against the no-subagents rulesettings.jsonUserPromptSubmit 8 hooks to 6
model_fit_gate.py unwired, so nothing recommends Sonnet against the Opus-always policysettings.jsonmodel policy now single-valued
False path map replaced with the verified one for this Machonesty_gate_nudge.py~/Desktop named as the live working set
HTML host corrected to GitHub Pages for new pages, Vercel for existing routeshonesty_gate_nudge.py, both CLAUDE.md filesroute now matches a script that exists
Kid-button requirement removed from the closeout gate~/CLAUDE.mdagrees with the 2026-07-13 retirement
Expired July 19 resource window removed~/CLAUDE.mdpolicy no longer four weeks stale
Dead Vercel MCP id replaced with the working CLI and overflow route~/.claude/CLAUDE.mddeploy step is executable
Both ntfy.sh curls made asynchronous with a 3 s capsettings.jsonphone notifications still fire, off the critical path
Stop chain now: 0.624 s (was 1.610 s) UserPromptSubmit now: 0.333 s (6 hooks, was 8) ultracode present: False model_fit present: False settings.json: JSON VALID
source: re-timed against the live hook scripts after the edits, 2026-08-17

Turn-end latency dropped by 0.99 s, a 61% cut, and the seven contradictions are down to zero. Fixes 1, 3, 4, 6, 7, 8 and 9 remain open.

Scoreboard

MetricMeasured hereHealthy rangeVerdict
Free disk space7.7 GB of 932 GB (0.8%)93 GB to 140 GB (10 to 15%)CRITICAL
Contradictory standing rules70CRITICAL
Fixed context tax per turn33,206 tokens (16.6%)under 8,000HIGH
Skill frontmatter alone20,507 tokens across 140 skillsunder 6,000HIGH
MCP servers / tools18 servers, about 158 tools6 to 8 serversHIGH
Stop hook chain1.61 s per turn endunder 0.2 sMEDIUM
PreToolUse chain per Bash call0.383 s, 7 python startsunder 0.1 sMEDIUM
Dead weight inside ~/.claude2.42 GB (banned sync repo plus backups)0MEDIUM
Claude Desktop footprint27 processes, 3.09 GB RAM, 8.2 GB disknormal for ElectronINFO
Memory pressure74% free, 131 MB swap usedunder 50% swapHEALTHY
Shell startup per Bash call0.01 sunder 0.3 sHEALTHY

1. The disk is the emergency

10 / 10

932 GB volume with 7.7 GB left

macOS degrades hard below roughly 10% free. Swap cannot grow past its 1 GB file, APFS copy-on-write has nowhere to land, Spotlight re-indexing stalls, and app caches thrash. Everything you feel as general slowness on this machine traces back here first.

/dev/disk1s1 932Gi 907Gi 7.1Gi 100% /System/Volumes/Data Container Free Space: 7.7 GB (7662919680 Bytes)
source: df -h + diskutil info /System/Volumes/Data

Where the 813 GB of home directory sits:

FolderSizeLargest child
~/Desktop233 GBAnatomy-Jams 49 GB, jam-7-3-26-rebuild 39 GB
~/Documents178 GBDocuments/complete 151 GB
~/Pictures159 GBPhotos Library 159 GB
~/Downloads133 GBDownloads/complete 106 GB
~/Library66 GBApplication Support 31 GB, Caches 14 GB

The fastest 257 GB is the two complete folders. They live in Documents and Downloads and read as finished-transfer staging. Moving those two to an external drive takes the volume from 0.8% free to roughly 28% free in one operation, with no deletion.

2. Seven rules that fight each other

This is the accuracy problem. Seven standing instructions arrive in the same turn and give opposite orders, or point at paths that do not exist on this machine. Every one of them was verified today.

#One rule saysThe other saysStatus
1ultracode_default.py forces ultracode on every turn: author and run a workflow for every substantive task, spawn dozens of agents~/CLAUDE.md:13: do not launch subagents, parallel chats, or /loop without permissionOPPOSITE
2model_fit_gate.py recommends Sonnet 5 as the floor and offers to delegate~/CLAUDE.md:13: use Opus for all work, do not self-route to Sonnet or HaikuOPPOSITE
3PATHS hook: Desktop was offloaded, never write to ~/Desktop, old content lives in ~/New DesktopReality on this Mac: ~/New Desktop does not exist, and ~/Desktop is the live 233 GB working setFALSE MAP
4~/CLAUDE.md: every HTML ships to Vercel at ~/Projects/drwu-htmls/public/Memory rule dated 2026-07-29: new pages go to GitHub Pages. The Vercel public folder here is empty with no git repoSTALE
5Ship gate demands one real kid button on every pageMemory feedback_kid_mode_retired_never_inject, dated 2026-07-13RETIRED
6~/CLAUDE.md:15: conserve allowance through Sunday, July 19, 2026 at 6 PMToday is 2026-08-17. That window closed four weeks agoEXPIRED
7~/.claude/CLAUDE.md: deploy via mcp__1da7f971-…__deploy_to_vercelThat MCP server is not present in this session's tool listMISSING
10 / 10

Why this costs accuracy on top of tokens

A model given two opposite orders picks one and looks disobedient either way. Rules 1 and 2 arrive in every single turn, so every session opens with a coin flip on model policy and on whether to fan out. Rule 3 is worse than a contradiction, since it asserts a folder layout that is false here, and any path reasoning built on it starts wrong.

$ ls -d "$HOME/New Desktop" ls: /Users/brandonchavez/New Desktop: No such file or directory $ du -x -d 1 -g ~/Desktop 233 /Users/brandonchavez/Desktop
source: direct filesystem check, 2026-08-17

3. The skill-description tax

9 / 10

20,507 tokens of skill frontmatter, every turn, forever

There are 167 skill folders, 160 with a SKILL.md, and 140 carrying frontmatter. Only the body of a skill is free. The frontmatter description is injected into every turn whether the skill is used or not.

SKILLS=160 FRONTMATTER_BYTES=82031 APPROX_TOKENS=20507 description bytes: total=75692 median=495 max=1422 descriptions over 300 bytes: 115 (~17,449 tokens) trimming those 115 to 200 bytes saves ~11,699 tokens EVERY turn
source: python scan of ~/.claude/skills/*/SKILL.md

The ten heaviest descriptions run 900 to 1,461 bytes each: rock-analysis-canon, chavez-radiohead-failure-craft, jazz-harmony-craft, chiron-intuition, engineering-the-guitar, mixing-engineering-craft, rock-form-canon, counterpoint-craft, orchestration-craft, mtg-price-verify.

A description only has to do one job: help pick the right skill. Two sentences and the trigger words do that. Everything else belongs in the body, where it costs nothing until the skill is invoked.

4. Four duplicated tool families

8 / 10

Three separate browser bridges, two PDF servers, two chart servers

Eighteen MCP servers expose roughly 158 tools into this session. Four capability families are duplicated, which is a direct cause of wrong-tool selection.

FamilyServers holding itTools
Browser controlClaude_Browser, Control_Chrome, claude-in-chrome18 + 10 + 22 = 50
Mac controlcomputer-use, Control_your_Mac, terminal27 + 1 + 1 = 29
PDFpdf-viewer, plugin_pdf-viewer_pdf3 + 9 = 12
Charts and widgetsvisualize, a second identical server under a UUID name2 + 2 = 4
$ ps -Ao comm | grep -i mcp | sort | uniq -c 4 npm exec @modelcontextprotocol/server-pdf --stdio
source: process table, 2026-08-17. Four copies of one PDF server were running.

Fifty tools for one job is how a session picks the dead bridge and reports blocked. Your own memory already records that failure mode for the Chrome bridges. Keeping one browser server, one Mac server, one PDF server and one chart server removes the choice entirely.

5. Hook latency, measured

6 / 10

37 hook entries, timed against the real scripts

EventHooksMeasuredFires
Stop10 python gates + 1 curl + 1 log write0.616 s python, 0.99 s for the ntfy.sh callsevery turn end
PreToolUse : Bash7 gates0.383 severy Bash call
UserPromptSubmit8 injectors0.363 s for 6 of 8every prompt
PostToolUse : Write, Edit3not timedevery file write
statusline10.091 severy render

A moderate session with 20 prompts and 40 Bash calls pays about 55 seconds in hook overhead alone. The worst single item is the pair of ntfy.sh network calls, which add a full second to every turn end for a phone notification.

Stop python gates: 0.616 s ntfy round trip: 0.492 s ntfy round trip: 0.502 s PreToolUse chain total: 0.383 s UserPromptSubmit chain: 0.363 s python3 cold start: 0.04 s each
source: timed against the actual hook scripts with real JSON payloads on stdin

Python cold start is 0.04 s, so seven gates on one Bash call spend 0.28 s starting interpreters. One dispatcher script importing seven modules would cut that to roughly 0.06 s with no loss of enforcement.

6. Dead weight and background load

5 / 10

2.42 GB of retired material inside ~/.claude

2.3G ~/.claude/claude-sync <- banned in CLAUDE.md, sync.sh.disabled-2026-05-18 75M ~/.claude/backups 42M ~/.claude/_config_sync_backups 2.5M ~/.claude/_cleanup_backups 83M ~/.claude/skills 33M ~/.claude/projects
source: du -sh ~/.claude/*

claude-sync is named as banned in your own CLAUDE.md and its sync.sh was disabled on 2026-05-18. That folder holds 2.3 GB of a git repo that is never allowed to run again.

Claude Desktop on disk: 8.2 GB

6.0G vm_bundles 628M local-agent-mode-sessions 618M Cache 289M claude-code 224M claude-code-vm 206M Code Cache
source: du -sh ~/Library/Application Support/Claude/*

Background apps competing for a throttled i9

Login items are Cloudflare WARP and Untapped.gg Companion. Also resident: five Epic Games Launcher processes, UnrealEditorServices, GeoComply PlayerLocationCheck, and two Google updater agents. WindowServer was at 30.8% CPU with a load average of 3.18 on an 8-core chip that throttles under sustained load.

7. What is already healthy

pass

Three areas that need no work

RAM is fine. 74% free with 131 MB of swap used out of 1 GB. There is no memory pressure problem here, so a RAM upgrade would buy nothing.

Shell startup is fast. 0.01 s for an interactive zsh, so your profile adds nothing measurable to Bash tool calls.

Spotlight is enabled and idle, Time Machine is not running, and the Trash is empty. None of the usual background-indexing suspects are the cause.

Ranked fix list

#FixPayoffEffortRisk
1Move Documents/complete (151 GB) and Downloads/complete (106 GB) to an external drive. Takes free space from 0.8% to about 28%. A move, never a delete.10lowlow
2Resolve the seven contradictions. Pick one model policy, one fan-out policy, one HTML host. Correct the PATHS hook to match this machine. Delete the expired July 19 paragraph.10lowlow
3Trim the 115 skill descriptions over 300 bytes down to 200. Saves 11,699 tokens on every turn, with the detail moved into the skill body where it is free.9mediumlow
4Retire the duplicate MCP servers. One browser bridge, one Mac bridge, one PDF server, one chart server. Removes 40 or more redundant tools and the wrong-bridge failure mode.8lowlow
5Make the two ntfy.sh curls asynchronous by appending &, or drop them. Returns a full second per turn end.6trivialnone
6Merge the seven PreToolUse Bash gates into one dispatcher. 0.383 s becomes about 0.06 s per Bash call, same enforcement.6mediumlow
7Stage ~/.claude/claude-sync (2.3 GB) out of the tree. It is banned and disabled. Move it, do not delete it.5triviallow
8Clear Claude Desktop caches and review vm_bundles (6.0 GB). The app rebuilds Cache and Code Cache on its own.5lowlow
9Remove Epic Games Launcher and Untapped.gg from login items. Frees CPU headroom on a chip that throttles.4trivialnone

Items 1, 2 and 3 carry most of the gain. One recovers the machine, one recovers instruction clarity, one recovers a sixth of the context window.

How each number was measured

ClaimCommand
Free disk, volume sizedf -h /System/Volumes/Data, diskutil info
Folder sizesdu -x -d 1 -g ~ and per-folder repeats
Memory and swapmemory_pressure, sysctl vm.swapusage
CPU and processesps -Ao %cpu,%mem,rss,comm -r, uptime
Context taxbyte count of both CLAUDE.md files, MEMORY.md, and every SKILL.md frontmatter block, divided by 4
Hook latencyeach hook script run directly with a real JSON payload on stdin, wall clock around the loop
MCP inventorythe session tool manifest plus ps for running server processes
Contradictionsgrep against CLAUDE.md line numbers, ls against every path a rule asserts
Login itemsosascript against System Events