Originals saved to ~/.claude/_config_sync_backups/20260817-contradiction-fix/. Both retired hook scripts remain on disk and can be rewired in one line.
| Change | File | Result |
|---|---|---|
ultracode_default.py unwired, so no turn orders a workflow against the no-subagents rule | settings.json | UserPromptSubmit 8 hooks to 6 |
model_fit_gate.py unwired, so nothing recommends Sonnet against the Opus-always policy | settings.json | model policy now single-valued |
| False path map replaced with the verified one for this Mac | honesty_gate_nudge.py | ~/Desktop named as the live working set |
| HTML host corrected to GitHub Pages for new pages, Vercel for existing routes | honesty_gate_nudge.py, both CLAUDE.md files | route now matches a script that exists |
| Kid-button requirement removed from the closeout gate | ~/CLAUDE.md | agrees with the 2026-07-13 retirement |
| Expired July 19 resource window removed | ~/CLAUDE.md | policy no longer four weeks stale |
| Dead Vercel MCP id replaced with the working CLI and overflow route | ~/.claude/CLAUDE.md | deploy step is executable |
Both ntfy.sh curls made asynchronous with a 3 s cap | settings.json | phone notifications still fire, off the critical path |
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.
| Metric | Measured here | Healthy range | Verdict |
|---|---|---|---|
| Free disk space | 7.7 GB of 932 GB (0.8%) | 93 GB to 140 GB (10 to 15%) | CRITICAL |
| Contradictory standing rules | 7 | 0 | CRITICAL |
| Fixed context tax per turn | 33,206 tokens (16.6%) | under 8,000 | HIGH |
| Skill frontmatter alone | 20,507 tokens across 140 skills | under 6,000 | HIGH |
| MCP servers / tools | 18 servers, about 158 tools | 6 to 8 servers | HIGH |
| Stop hook chain | 1.61 s per turn end | under 0.2 s | MEDIUM |
| PreToolUse chain per Bash call | 0.383 s, 7 python starts | under 0.1 s | MEDIUM |
Dead weight inside ~/.claude | 2.42 GB (banned sync repo plus backups) | 0 | MEDIUM |
| Claude Desktop footprint | 27 processes, 3.09 GB RAM, 8.2 GB disk | normal for Electron | INFO |
| Memory pressure | 74% free, 131 MB swap used | under 50% swap | HEALTHY |
| Shell startup per Bash call | 0.01 s | under 0.3 s | HEALTHY |
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.
Where the 813 GB of home directory sits:
| Folder | Size | Largest child |
|---|---|---|
~/Desktop | 233 GB | Anatomy-Jams 49 GB, jam-7-3-26-rebuild 39 GB |
~/Documents | 178 GB | Documents/complete 151 GB |
~/Pictures | 159 GB | Photos Library 159 GB |
~/Downloads | 133 GB | Downloads/complete 106 GB |
~/Library | 66 GB | Application 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.
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 says | The other says | Status |
|---|---|---|---|
| 1 | ultracode_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 permission | OPPOSITE |
| 2 | model_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 Haiku | OPPOSITE |
| 3 | PATHS hook: Desktop was offloaded, never write to ~/Desktop, old content lives in ~/New Desktop | Reality on this Mac: ~/New Desktop does not exist, and ~/Desktop is the live 233 GB working set | FALSE 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 repo | STALE |
| 5 | Ship gate demands one real kid button on every page | Memory feedback_kid_mode_retired_never_inject, dated 2026-07-13 | RETIRED |
| 6 | ~/CLAUDE.md:15: conserve allowance through Sunday, July 19, 2026 at 6 PM | Today is 2026-08-17. That window closed four weeks ago | EXPIRED |
| 7 | ~/.claude/CLAUDE.md: deploy via mcp__1da7f971-…__deploy_to_vercel | That MCP server is not present in this session's tool list | MISSING |
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.
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.
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.
Eighteen MCP servers expose roughly 158 tools into this session. Four capability families are duplicated, which is a direct cause of wrong-tool selection.
| Family | Servers holding it | Tools |
|---|---|---|
| Browser control | Claude_Browser, Control_Chrome, claude-in-chrome | 18 + 10 + 22 = 50 |
| Mac control | computer-use, Control_your_Mac, terminal | 27 + 1 + 1 = 29 |
pdf-viewer, plugin_pdf-viewer_pdf | 3 + 9 = 12 | |
| Charts and widgets | visualize, a second identical server under a UUID name | 2 + 2 = 4 |
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.
| Event | Hooks | Measured | Fires |
|---|---|---|---|
| Stop | 10 python gates + 1 curl + 1 log write | 0.616 s python, 0.99 s for the ntfy.sh calls | every turn end |
| PreToolUse : Bash | 7 gates | 0.383 s | every Bash call |
| UserPromptSubmit | 8 injectors | 0.363 s for 6 of 8 | every prompt |
| PostToolUse : Write, Edit | 3 | not timed | every file write |
| statusline | 1 | 0.091 s | every 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.
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.
~/.claudeclaude-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.
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.
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.
| # | Fix | Payoff | Effort | Risk |
|---|---|---|---|---|
| 1 | Move 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. | 10 | low | low |
| 2 | Resolve 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. | 10 | low | low |
| 3 | Trim 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. | 9 | medium | low |
| 4 | Retire 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. | 8 | low | low |
| 5 | Make the two ntfy.sh curls asynchronous by appending &, or drop them. Returns a full second per turn end. | 6 | trivial | none |
| 6 | Merge the seven PreToolUse Bash gates into one dispatcher. 0.383 s becomes about 0.06 s per Bash call, same enforcement. | 6 | medium | low |
| 7 | Stage ~/.claude/claude-sync (2.3 GB) out of the tree. It is banned and disabled. Move it, do not delete it. | 5 | trivial | low |
| 8 | Clear Claude Desktop caches and review vm_bundles (6.0 GB). The app rebuilds Cache and Code Cache on its own. | 5 | low | low |
| 9 | Remove Epic Games Launcher and Untapped.gg from login items. Frees CPU headroom on a chip that throttles. | 4 | trivial | none |
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.
| Claim | Command |
|---|---|
| Free disk, volume size | df -h /System/Volumes/Data, diskutil info |
| Folder sizes | du -x -d 1 -g ~ and per-folder repeats |
| Memory and swap | memory_pressure, sysctl vm.swapusage |
| CPU and processes | ps -Ao %cpu,%mem,rss,comm -r, uptime |
| Context tax | byte count of both CLAUDE.md files, MEMORY.md, and every SKILL.md frontmatter block, divided by 4 |
| Hook latency | each hook script run directly with a real JSON payload on stdin, wall clock around the loop |
| MCP inventory | the session tool manifest plus ps for running server processes |
| Contradictions | grep against CLAUDE.md line numbers, ls against every path a rule asserts |
| Login items | osascript against System Events |