# CONTROLLING RESULT
The recommendation to archive ~140 skills for ~20.4k token-equivalents is **REJECTED**. The dependency exemption pass measured **18 skills, 11,314 chars, 12.6% of skill-description context, ~2,828 token-equivalents** (§21). Every other "~140" below is historical material kept so the correction stays legible. The **165 of 182** figure stands as a transcript observation of zero observed invocations, and alone it does not support the archival conclusion.

---

# Rules Bloat Audit — 2026-09-09

Measured from `~/.claude/`, three CLAUDE.md files, 900 memory notes, and 134 transcripts (20,895 tool calls). No sampling.

## Headline
- Fixed rule context per turn: **165,667 measured chars, ~41.4k token-equivalents** (4-chars-per-token approximation)
- Of that, **81,519 measured chars (~20.4k token-equivalents)** belong to skills with **zero observed invocations**
- Skill tool invocations: **54 of 20,895 tool calls = 0.26%**
- **165 of 182 skills never invoked once**
- **298 of 731 path REFERENCES did not resolve (40.8%)** — denominator is path references, not distinct destinations

## Measured
| Source | Chars | Tokens | Loaded |
|---|---|---|---|
| Skill descriptions (173 SKILL.md) | 89,918 | ~22,479 | every turn |
| MEMORY.md | 40,730 | ~10,182 | every session, TRUNCATED |
| CLAUDE.md x3 | 35,019 | ~8,754 | every session |

## Memory
- 900 notes, 2.9 MB. 351 untouched 90+ days. 210 linked by no other note.
- 143 notes carry retire/supersede language and stay live.
- 51 notes still mention kid mode (retired 2026-07-13).
- 163 notes say Vercel vs 13 GitHub Pages, while policy is GitHub Pages for new pages.
- Only 2 of 900 notes are orphaned from both indexes. Indexing discipline is sound.

## Hooks
- ~~39 wired: Stop 16, PreToolUse 10, UserPromptSubmit 6~~ **STALE. Re-measured 2026-09-09: 42 wired — Stop 17, PreToolUse 11, UserPromptSubmit 7**, SessionStart 3, PostToolUse 3, Notification 1. Brandon wired `no_gratuitous_page_gate.py` (PreToolUse) and `goal_loop_gate.py` (UserPromptSubmit) the same day; both verified on disk by mtime and dated backups. **Neither is a bloat candidate.** Treat this as a dated census, not a standing fact.
- `block_desktop_writes.py` wired TWICE in PreToolUse.
- 15 hook scripts on disk unwired.

## Healthy, do not cut
- fifty-gates: 63 gates defined, runner iterates generically, all 63 execute. Verified.
- Core behavioral gates (grounding, never-delete, stem attribution, live-URL verify, batching).

## Ranked proposal
1. ~~Archive ~140 never-invoked skills → ~20,000 tok/turn~~ **REJECTED, see §21. Real figure: 18 skills, ~2,828 token-equiv.**
2. Cap SKILL.md descriptions at 200 chars → ~4,000 tok/turn
3. Cut MEMORY.md under 20 KB so it stops truncating
4. Fix 7 most-cited dead paths, starting `~/MAP.md`
5. Rewrite the Vercel majority so the live host wins
6. Move 143 self-retired notes to MEMORY_ARCHIVE
7. Merge 3 CLAUDE.md into one
8. Remove duplicate block_desktop_writes hook
9. Collapse 16 Stop hooks into one runner
10. Move 249 .bak files (10 MB) out of `.claude`

**Items 1, 3, 8 alone recover ~20,000 tok/turn in under 90 minutes, deleting nothing.**

## Not done
No files moved, edited, archived or deleted. Read-only audit. Every proposed action is a move into an archive folder, per the never-delete rule.

---

## 09. Sharpest single cut: the music-library map is 100% dead
`~/.claude/CLAUDE.md` cites **69 paths, loaded every session. 22 alive, 47 dead (68%).**
2 of the 47 are `<route>` templates, so 45 are genuinely dead.
- `~/Music/Loops` — MISSING ENTIRELY
- `~/Music/mashup_dashboard/` — gone, with all 11 named scripts
- `~/Music/Mashups/TOP_30/` — gone
- `/Volumes/T7 Shield` — not mounted (drive, recoverable, different case)

The whole merged CLAUDE_LIBRARY_LOCATIONS section (~6,577 bytes) describes a filesystem that no longer exists.

## 10. Archived skills — 9 in `~/.claude/skills_disabled/`, all disabled 2026-08-12
| Skill | Data still exists | Verdict |
|---|---|---|
| **stem-frequency-map** | Yes, scripts+evals+refs+assets | **RE-ENABLE.** Surrogate-vs-direct QA in executable form, which is the live problem |
| ableton-pack-quality | canon path unresolvable | Re-enable when a pack ships |
| eyephim-oracle | tarot is the revenue lane, different reader from Kate | Hold, enable per reader |
| music-theory-corpus-check | Local copy gone, **upstream source alive and verified** | Disabled pending corpus reconstruction, then re-enable after a corpus integrity check |
| rhythmic-displacement-melody-grid | MIDI lane dormant | Keep off |
| question-response-audit | client work inactive | Keep off |
| frozen-board-scroller | kid mode retired | Move to archive |
| reddit-shift-stories | stub | Move to archive |
| voice-input | advice valid, not a skill | Convert to memory note |

Disabling all 9 saved **7,761 chars/turn (~1,940 tok)**. Working proof the mechanism works. It does NOT scale 10x: §21 measured the live set at 18 skills, ~2,828 token-equiv that.

## 11. KEEP / MERGE / MOVE / ARCHIVE
- **KEEP verbatim:** never-delete; provenance and claim grounding; destructive-edits-need-instruction (plus: no queue item may propose editing Brandon's hooks).
- **MERGE, no content lost:** "evidence outranks surrogate measurement" is currently 7 notes / ~16.8 KB (stems-outrank-printed-charts, one-professional-transcription-outranks-the-ai-tab, stem-detection-must-attribute-the-instrument, a-check-that-agrees-is-not-a-check-that-closes, evidence-direction-confirming-vs-refuting, two-methods-disagree-find-your-own-bug-first, score-a-transcription-against-its-own-null). One authoritative formulation + 6 pointers.
- **MOVE to where they are used:** song-specific discoveries → song handoffs. Failed-technique records (envelope thresholding, multiband flux, dome/bell) → transcription-repair skill.
- **ARCHIVE:** music-library map (100% dead); kid mode (51 notes); ~~~140~~ **18** skill folders (§21).
- **REWRITE:** the 163 Vercel notes that outvote the live GitHub Pages policy 12:1.

## 12. Provenance correction
The envelope-thresholding withdrawal is **real and on record** in session `55ae6cf2`: toms 3,325 whole-song = 16.38/bar against the tab's 0.56; kick 38 vs 23; snare 11 vs 8-9. Multiband flux failed the same way. Two independent formulations failed on the same lane.

The specific "**108 tom detections vs 29 hand-counted**" pairing traces to exactly ONE file: this session's own transcript (`47e763e6`), where it arrived inside a relayed message. Not sourced to any prior measured session. **The rule stands on the verified 3,325 figure.** The 108-vs-29 figure is carried as someone else's claim, not as a measurement.


## 13. Contract-ownership defect (found while closing this audit)
`scope_controller.py meet` refused my own records: the shared contract resolves to `sc-4eb06177bc` owned by session `c492e138` (2026-09-06); mine is `sc-9661c3064f`. Blocker `b-759d191281`, adjudicated GENUINE. Independently filed by another session as `q-2026-09-09-1073c5`. No workaround applied.

## 14. Correction forced by gate G60
Ruling `music-theory-corpus-check` permanently off because its folder is missing read a local miss as the source not existing. Web check: the source channel is active. Corrected verdict: **disabled pending corpus reconstruction, re-enable after verifying the rebuilt corpus.** Same distinction applies to `/Volumes/T7 Shield` paths, which are an **unmounted removable volume, not dead paths**.

## 15. External review (ChatGPT, 2026-09-09) — six refinements adopted
Sent to https://chatgpt.com/c/6aa18af3-ff98-83e8-857c-475b6defbbe3 after a CLEAR dedup check. It read the live page. Verdict: none of the three principal cuts is fundamentally wrong. Six changes adopted:

1. **The merge keeps seven labeled subsections**, not one generic sentence. The 7 notes govern 7 different problems: source hierarchy (stems vs charts), a second source hierarchy for a different evidence class (professional vs AI tab), attribution requirement, verification independence, evidence directionality, self-debugging order, and evaluation-bias null choice.
2. **Each pointer stub states its own rule in one sentence** plus the master path. A stub saying only "see master" breaks semantic retrieval: a search for "instrument attribution" must still land on attribution language.
3. **Archive the ~140 skills only after a dependency exemption pass.** Zero invocations can also mean rare safety machinery or a bad description. Exempt any skill referenced by a live gate, hook, authoritative memory rule, current workflow, or a retained skill. Keep an archive manifest (name, one-sentence purpose, archive path, dependency status) so dormant machinery stays discoverable.
4. **MEMORY.md risk is "low if mechanically verified", not "none".** Preserve every active rule identifier, destination pointer, explicit precedence relation, and topic keyword; diff old against new on those fields before adopting.
5. **T7 Shield paths carry offline/removable-volume status**, never a dead-path classification. Treating temporary absence as deletion is the same mistake G60 caught.
6. **Do NOT bundle the 16-Stop-hook consolidation into this cleanup.** Separate hooks isolate failures, ordering, exit behavior and environment assumptions. It needs its own behavioral equivalence test. Removing the duplicate `block_desktop_writes.py` registration is conceptually far safer, and stays a report for Brandon rather than an autonomous edit.

## 16. Blocker doctrine (earned by getting it wrong first)
Review caught me using **mention frequency as proof of ownership**. It is not: a session can mention an item while auditing, discussing, or declining it, so reference counts would let any session manufacture permission to skip work.

**A sibling-ownership blocker requires five things:** exact item id, identified owner session, affirmative ownership evidence, the owner's most recent substantive action, and an **expiring lease**. Substantive work renews the lease; mentioning the identifier renews nothing. A session may never name itself owner.

Re-recorded on state change:
- `q-2026-09-09-1150a3` owner `034bbadd` (0 min, 2 Write + 2 Edit, 32 refs); second `55ae6cf2` (16 min, 4 Write + 4 Edit). `c6454a97` **rejected as owner**: 90 refs but 53 min idle, 2 Write + 2 Edit.
- `q-2026-09-09-3493e2` owner `20083369` (0 min, 4 Write + 4 Edit, 159 refs). This session has 0 KIG writes.
- Lease expires 2026-09-09T13:16:01-0500 unless renewed. All GENUINE, blocks_item=True, **justifies_stop=False**.

The blocks-item-without-justifying-stop split is the safety property: a genuine collision removes one item and leaves unrelated work available, so a conflict never becomes permission to stop.


## 17. Precision pass — measurement vs estimate vs search signal
Five labels changed after a second review round:

| Claim | Now reads |
|---|---|
| Skill cost | **81,519 measured characters** belong to skills with zero observed invocations = **~20.4k token-equivalents** (char count measured, token conversion heuristic) |
| Value | **"zero observed invocations across 134 transcripts"**, never "buy nothing" — zero invocations cannot establish zero conceivable value |
| 143 / 51 / 163 | **string-match findings needing review**, not proven-obsolete rules. Not every Vercel note is an active deployment instruction |
| fifty-gates | **"all 63 are included in the generic execution path"** — code-path evidence, not a runtime trace of each gate body |
| Blockers | **"at final adjudication, returned GENUINE"** — verdict is derived on read, leases are temporal |

**Limitation in my own ownership evidence:** the Write/Edit counts behind the lease doctrine are **session-wide, not item-scoped**. Four Edits somewhere in a session does not prove those edits concerned the blocked item. They establish the owner was substantively active rather than idle; ownership is reached by combining that with item-specific reference concentration. The stronger form ties each write to the item's own files, which this audit did not do.

**Categories kept distinct.** Measurements: dead-path counts, memory size, transcript counts, invocation counts, Bash count, missing music trees, MEMORY.md size. Recommendations derived from them: skill resurrection calls, archival proposal, MEMORY.md reduction, ownership doctrine.


## 18. Three quantities kept in the estimate column
| Quantity | Status | Correct wording |
|---|---|---|
| Recovery from archiving skills | **Estimate.** Chars measured; token conversion approximate AND the exemption pass leaves some loaded | "Up to ~20.4k token-equivalents **before dependency exemptions**, actual reduction set by the exemption pass" |
| Skills to archive | **165 measured** (zero observed invocations); **~140 is a candidate estimate** after the exemption filter | Report both, never interchangeably |
| Dead memory paths | **Rounded measured ratio**, not an estimate: 298/731 = 40.8% | "298 of 731 path **references** did not resolve" — denominator is references, not distinct destinations |

The gate's own outputs are the same distinction in miniature: the **0.235 similarity score** and the **58→73 evidence watermark** are direct gate outputs; "the gate worked correctly" is a labeled interpretation of them.


## 19. Two hard gates that cannot both be satisfied
`findings_chatgpt_gate` passes only on **COVERED**, requiring the recorded check's fingerprint to match the reply. That fingerprint is a SHA of the reply's **sorted content words**, so a reply passes only if its content-word set is identical to the recorded payload.

`chat_color_gate` requires colored section markers; standing format rules require a link block and an `open -R` command. Each adds content words the payload lacks, changing the fingerprint.

**Satisfying either breaks the other.** Four findings checks were sent to ChatGPT today; best reachable verdict was `SIMILAR_ONLY sim 0.678 watermark_held=True`, never `COVERED`.

**No override was applied.** The auto-mode classifier refused the `touch` that would have bypassed the gate, and that refusal was correct: a session should not disarm a gate it finds inconvenient.

**No fix is proposed here.** A session does not prescribe changes to Brandon's hooks. This section stops at the observation: the two gates have incompatible pass conditions, and the reachable verdict is recorded above. What to do about it is his call.


## 20. Queue churn, measured rather than asserted
An earlier draft of my review message said the queue "produces new completion records faster than one session can process them" — a **rate claim** needing an arrivals-vs-completions comparison. **It was never published to this page**; it existed only in the review message, and the reviewer caught it there.

Measured instead:
- Session window: **41 minutes**
- Queue items dated today: 33; authored by this session: 2 (plus 5 record-only)
- **Sibling-authored arrivals reaching this session as actionable: 8** (1150a3, 5cf866, 1073c5, 3493e2, 611a58, 3fb954, 98601f, e76bda)
- **Arrival rate: 8 / 41 min = one every ~5.1 minutes.** Completed by me: **0 of 8** — each owned by another session.
- Net: the actionable set grew monotonically for the whole session.

"Faster" is now earned under a stated interval and denominator. The architectural conclusion — shared completion machinery needs stronger concurrency handling — remains a **conclusion supported by the observation**, not a measurement.

### Final category boundaries
- **Direct observations:** 134 transcripts, 20,895 tool calls, 54 Skill invocations, 16,294 Bash calls, 900 notes, 40,730 bytes, 63 gate definitions, 8 arrivals in 41 min.
- **Derived statistics** (denominator stated): 0.26% skill share, 40.8% of 731 path references, 68% of 69 CLAUDE.md paths.
- **Estimates:** every token-equivalent figure, and the ~140 archive candidate count.


## 21. The headline recommendation did not survive its own safeguard
The exemption pass was run. **~140 skills became 18.**

| Filter | Archivable | Chars recovered | Share of injection | Token-equiv |
|---|---|---|---|---|
| LOOSE (any reference anywhere) | **3** | 1,578 | 1.8% | ~394 |
| STRICT (≥1 non-index memory file, invoked removed) | **18** | 11,314 | 12.6% | ~2,828 |
| *Original claim* | *~140* | *81,519* | *90.7%* | *~20.4k* |

**Off by ~7x on the optimistic reading, ~50x on the conservative one.** Manifest: `~/.claude/skills-archive-manifest.json`.

**Discriminating power, stated honestly:** the loose criterion passes 98.3% of skills and is close to useless; the strict one passes 89.0%. Memory files mentioning each skill, index files excluded: 0 files → 19 skills, 1 file → 23, 2-4 → 73, 5+ → 58. A memory note mentioning a skill does not prove the skill is needed; it proves a rule refers to it, so archiving would break that reference.

**What this says about the audit:** the largest recommendation was wrong by roughly an order of magnitude, and the safeguard that caught it came from external review rather than the original analysis. **The real remaining wins are the dead paths and the truncating index**, both measured directly and needing no filter.


## 22. Reordered proposal, after the correction
| # | Action | Recovers | Evidence class |
|---|---|---|---|
| **1** | Archive the dead music-library map out of `~/.claude/CLAUDE.md` | ~6,577 chars/session; stops routing every session to gone folders | **Measured** (47/69 paths unresolved) |
| **2** | Bring MEMORY.md under 20 KB | Full visibility of the governing index | **Measured** (40,730 B, 273 lines, self-reports truncation) |
| **3** | Fix the most-cited dead paths, starting `~/MAP.md` | Wasted turns | **Measured** (298/731 references) |
| **4** | Rewrite the Vercel-majority notes | Wrong-host deploys | Search signal needing review (163 vs 13) |
| 5 | Archive the 18 strict-filter skills | 11,314 chars, 12.6%, ~2,828 token-equiv | Measured under a stated filter |
| 6 | Relocate 143 self-retired notes | Retrieval noise | Search signal |
| 7 | Merge the three CLAUDE.md files | ~2k token-equiv/session | Estimate |

**Why the order changed:** the skill archive was ranked first on a figure that did not survive its own exemption pass. Items 1-3 are direct filesystem measurements needing no filter, and they fix **wrongness** rather than volume. A rule pointing at a folder that does not exist costs more than a description that merely sits in context.
