Every gate, hook, skill and memory note measured against whether it has ever done anything.
Measured by parsing the real files, not estimated.
| Source | Chars | Approx tokens | Loaded | Verdict |
|---|---|---|---|---|
| Skill descriptions (173 SKILL.md) | 89,918 | ~22,479 | every turn | Cut hard |
| MEMORY.md index | 40,730 | ~10,182 | every session | Fix truncation |
| CLAUDE.md (3 files merged) | 35,019 | ~8,754 | every session | Merge to one |
| Total fixed rule load | 165,667 | ~41,416 | ||
| Share from skills with zero observed invocations | 81,519 measured | ~20.4k token-equiv, at the 4-chars-per-token approximation | every turn | Dead weight |
The index that governs every other rule gets truncated before you read it. A rule you cannot see is a rule that does not exist. This is the most consequential single defect in the system.
Counted from real Skill tool invocations across 134 transcript files.
Bash carried the work at 16,294 calls. The skill layer carried one quarter of one percent. Your own CLAUDE.md already caught this once and it has not moved since.
| Group | Count | Evidence | Proposal |
|---|---|---|---|
| Proven core loop, ship, chat-end, fraud-firewall, songsterr-upload, notation-evidence-gate, reference-class, transcription-repair, real-song-finder, update-config | 10 | invoked repeatedly, tied to live work | Keep, full description |
| Used once jam-stem-rebuild, ableton-rig-doctor, missed-songs-audit, file-getter, impossible-guitar-parts, skill-creator, artifact-design | 7 | 1 invocation each | Keep, trim description to 1 line |
| No usable description album-book-craft, band-cycle, mashup-maker, midi-analyze, stem-analyzer, orchestration, speech-synth and 28 more | 35 20 of them have no YAML frontmatter at all | they appear in the skills list as a bare name with nothing after it, so description matching cannot reach themskills/mashup-maker/SKILL.md:1 starts # mashup-maker | Archive or write frontmatter |
| Fat descriptions on unused skills impossible-guitar-parts (1559 ch), rock-analysis-canon (1422), chavez-radiohead-failure-craft (1399), notation-evidence-gate (1273), real-song-finder (1239) | 5 | ~6,900 chars per turn from five entries | Cap at 200 chars |
| Never invoked, never described in a live task | 0 invocations across all transcripts. SUPERSEDED by section 21: the exemption pass cut this to 18 | See section 21 | |
| Broken dirs chiron-intuition-format, delete | 2 | no SKILL.md, no reference anywhere | Move to archive |
| Library dirs, correctly have no SKILL.md _shared, fifty-gates, babysit-chats, system-pulse | 4 | support code, not skills | Keep as is |
Move the never-invoked skills into ~/.claude/skills-archive/.
Nothing gets deleted, and every one comes back by moving the folder home.
Recovers up to about 20.4k token-equivalents per turn before dependency exemptions,
which is the difference between reading MEMORY.md fully and reading part of it.
Every ~/... path in every note was resolved against the real filesystem.
Rules that name a script are rules that send you to a file that is not there. The failure is silent, so the rule reads as authoritative right up to the moment it wastes a turn.
| Signal | Count | Meaning | Proposal |
|---|---|---|---|
| Notes untouched 90+ days | 351 | 39% of the store predates current policy | Date-stamp review |
| Notes no other note links | 210 | isolated, one-incident captures | Fold into topic notes |
| Notes with retire / supersede / banned language | 143 | they record their own obsolescence | Move to archive |
| Notes still mentioning kid mode | 51 | retired 2026-07-13, still in the corpus | Archive the stale notes |
| Notes saying Vercel | 163 | policy is GitHub Pages for new pages | Rewrite the top 10 |
| Notes saying GitHub Pages | 13 | the current policy is the minority voice | Promote in MEMORY.md |
| Duplicate topic clusters | 10 drwu_htmls, 8 anti_ai, 6 kid_mode, 4 never_ask, 4 cross_mac | same rule written many times | One note per topic |
| POINTERS.md | 209 KB | grep target, correctly not loaded | Keep |
163 notes point at Vercel and 13 point at GitHub Pages, while the standing policy says new pages go to GitHub Pages. The retired instruction outnumbers the live one twelve to one. Any retrieval that samples memory rather than reading the index lands on the wrong host.
Parsed from settings.json and compared against the hooks directory.
| Event | Hooks | Fires | Proposal |
|---|---|---|---|
| Stop | every time you finish a turn | Collapse into one runner | |
| PreToolUse | every tool call, 20,895 so far | Dedupe, see below | |
| UserPromptSubmit | every prompt | Merge the 3 nudges | |
| SessionStart | 3 | once | Keep |
| PostToolUse | 3 | every write | Keep |
| Notification | 1 | ntfy push | Keep |
block_desktop_writes.py is wired twice in PreToolUse. It runs on every tool call, twice, for no added protection.
15 hook scripts sit on disk unwired, including kid_mode_gate.py, model_fit_gate.py
and ultracode_default.py. Two were deliberately unwired and documented. The rest are ambiguous,
and an unwired gate reads as a live gate to anyone scanning the folder.
16 Stop hooks is a serial chain on every single turn end. Each one is a Python interpreter start.
no_gratuitous_page_gate.py (6,493 bytes, PreToolUse) and goal_loop_gate.py
(12,277 bytes, UserPromptSubmit), verified on disk here by mtime and by their dated backups.
Neither is a bloat candidate. They are live intent, dated, with backups.
Treat this table as a dated census rather than a standing fact, and re-measure before acting on it.
That is the general hazard of auditing a living rule system: the audit begins decaying the moment it ships,
and this one decayed inside half an hour.
Cuts are only credible if the audit also says what to leave alone.
63 gates defined, and the runner iterates the definition table generically, so all 63 are included in the generic execution path. I checked this specifically because 27 gate IDs never appear by name in the runner, which looks like a gap until you read the loop. No cut recommended. The folder name understates it by 13.
The rules about grounding claims, never deleting, attributing stems, verifying live URLs and batching tool calls are the ones that show up repeatedly in the transcripts as real corrections. Keep every one of them. The bloat is in the long tail of single-incident captures around them.
Only 2 notes of 900 are orphaned from both indexes. The indexing discipline holds. The problem is volume and staleness rather than structure.
| # | Action | Recovers | Risk | Effort |
|---|---|---|---|---|
| 1 | Archive the never-invoked skills to skills-archive/165 measured at zero observed invocations. ~140 is a candidate estimate pending the dependency exemption pass | Up to ~20.4k token-equiv before exemptions. Actual reduction is set by the exemption pass | Low, reversible. Exempt any skill referenced by a live gate, hook, memory rule, workflow or retained skill | 15 min |
| 2 | Cap every SKILL.md description at 200 chars | ~4,000 tok / turn | Low, triggering improves when descriptions sharpen | 1 hr |
| 3 | Cut MEMORY.md to under 20 KB so it stops truncating | Full index visibility | Low, if mechanically verified. Preserve every rule identifier, destination pointer, precedence relation and topic keyword, then diff old against new on those fields | 45 min |
| 4 | Fix the 7 most-cited dead paths, starting with ~/MAP.md | Wasted turns | None | 30 min |
| 5 | Rewrite the Vercel majority so the live host wins the vote | Wrong-host deploys | None | 30 min |
| 6 | Relocate 143 self-declared-retired notes to MEMORY_ARCHIVE | Retrieval noise | None, archive stays greppable | 20 min |
| 7 | Merge 3 CLAUDE.md files into one | ~2,000 tok / session | Low | 30 min |
| 8 | Duplicate block_desktop_writes hook at settings.json:259REPORT ONLY. Hooks and settings.json originate with Brandon. No session may queue or make this change. | 20,895 duplicate process starts | Yours to decide | Your call |
| 9 | Collapse 16 Stop hooks into one runner Do not bundle this with the cleanup. Separate hooks isolate failures, ordering, exit behavior and environment assumptions | Turn latency | Medium. Needs its own behavioral equivalence test | Own project |
| 10 | Relocate 249 .bak files to an archive folder outside .claude | 10 MB, folder clarity | None | 10 min |
No files were moved, archived, edited or deleted in producing this audit. Every number above came from reading. The cuts are a proposal waiting on your word, and the never-delete rule governs all of them, so every action listed is a move into an archive folder.
Every path in ~/.claude/CLAUDE.md resolved against the real filesystem.
The merged CLAUDE_LIBRARY_LOCATIONS section is entirely dead. ~/Music/Loops
does not exist at all, and neither does ~/Music/mashup_dashboard, which the file calls
the canonical dashboard. That is roughly 6,577 bytes of precise, confident, wrong direction loaded into every session.
The T7 Shield paths are a separate case. That drive is unplugged rather than lost,
so those rules become true again when it mounts. The ~/Music tree has no such excuse.
9 skills sit in ~/.claude/skills_disabled/, all switched off 2026-08-12.
| Skill | Why it was disabled | Does its data still exist | Verdict now |
|---|---|---|---|
| stem-frequency-map frequency-maps stems, QAs a reconstruction against the faithful original | never invoked, zero references | Yes. scripts, evals, references, assets all present | RE-ENABLE It is the surrogate-versus-direct discipline in executable form, and that is the live problem |
| ableton-pack-quality grades WAVs against a measured 1,339-file reference canon | never invoked, zero references | Reference canon path not resolvable from the SKILL.md | Re-enable when a pack ships |
| eyephim-oracle | never invoked | tarot is the one revenue lane, this is a different reader from Kate | Hold, enable per reader |
| music-theory-corpus-check | never invoked, memory pointer only | Local copy gone, upstream source alive. ~/Desktop/yt-adam-neely-research does not exist on disk. The channel it was built from is active and publishing, so the corpus is re-pullable | Re-enable after a corpus re-pull via /yt-transcripts |
| rhythmic-displacement-melody-grid | never invoked, no chain reference | MIDI generation lane is dormant | Keep off |
| question-response-audit | never invoked | UPS/Origami client work not active | Keep off |
| frozen-board-scroller | kid mode retired, no live caller | caller gone by policy | Move to archive |
| reddit-shift-stories | stub description, 24 chars saved | stub only | Move to archive |
| voice-input | a how-to doc, never an executable skill | advice still valid | Convert to a memory note |
Disabling all 9 saved 7,761 chars per turn, about 1,940 tokens. That is the working proof that the same mechanism works. It does NOT scale to ten times as much: section 21 measured the live set at 18 skills and about 2,828 token-equivalents. The mechanism already exists and has been run once.
Rule clusters sorted by what should happen to them, safeguards first.
| Cluster | Verdict | Reasoning |
|---|---|---|
| Evidence outranks surrogate measurement 7 notes state versions of this: 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 | MERGE to one, KEEP the content | The most load-bearing principle in the system, currently spread across 7 files totalling ~16.8 KB. One authoritative formulation, six pointers. The seven notes’ content is preserved: one authoritative note carrying every distinct claim, plus six pointer stubs at the old filenames so existing links still resolve. |
| Never delete, quarantine instead | KEEP verbatim | Governs every other cut in this document |
| Provenance and claim grounding | KEEP verbatim | Caught the error in section 12 of this very audit |
| Destructive edits need explicit instruction plus: no queue item may propose editing Brandon's hooks | KEEP verbatim | Fired correctly against this session twice |
| Song-specific discoveries Watermelon, Zappa ghost lanes, Nanook, Hejira, Montana | MOVE into the song handoffs | Technical history belongs beside its song, never in permanent global context |
| Failed-technique records envelope thresholding, multiband flux, dome/bell profile | MOVE into transcription-repair | Useful precisely where the next attempt would be made |
| Music-library location map | ARCHIVE, 100% dead | Section 09. Nothing it names exists |
| Kid mode, 51 notes | ARCHIVE | Retired 2026-07-13 |
| Vercel-first deployment, 163 notes | REWRITE the top 10 | Outvotes the live policy twelve to one |
| ARCHIVE the folders |
The envelope-thresholding withdrawal is real and on the record in session 55ae6cf2,
which recorded toms at 3,325 whole-song, 16.38 per bar against the tab's 0.56, kick 38 against 23,
snare 11 against 8 to 9, and concluded that multiband flux failed the same way.
Two independent formulations failed on the same lane.
The specific pairing of 108 tom detections against 29 hand-counted strikes traces to exactly one file, which is this session's own transcript, where it arrived inside a relayed message. I could not source it to any prior measured session. The rule stands on the 3,325 figure, which I verified. The 108-versus-29 figure is carried as someone else's claim rather than as a measurement.
Registering this audit's four sub-asks as required outcomes succeeded, and then
recording them as met was refused, correctly, because the shared contract file resolves to
contract sc-4eb06177bc opened by session c492e138 on 2026-09-06.
My own contract is sc-9661c3064f. The outcomes landed on a stranger's contract
and cannot be closed from here.
Your memory already names this defect at reference_completion_control_session_scoped_state,
which says shared state needs an owner. This is what rule bloat costs in practice. The refusal
protected another session's record, and the completion tracking for this work was lost.
No workaround was applied. Editing another session's contract is exactly what the refusal exists to stop. The four sub-asks are evidenced in sections 10, 11 and 12 instead.
I first ruled music-theory-corpus-check permanently off because its corpus folder
does not exist on disk. Gate G60 caught that as reading a local miss as the source not existing,
and it was right. A web check shows the channel the corpus was built from is active and publishing.
The corrected verdict is re-enable after re-pulling the corpus, which the /yt-transcripts
skill already does. That moves the skill from the archive column into the recoverable column.
The same distinction applies to every /Volumes/T7 Shield path in this document,
which are unmounted rather than lost.
Findings sent to ChatGPT after a CLEAR dedup check. It read this live page and pushed back on the merge.
The substantive challenge was to what "merge" means for the transcription safeguards, and it was right.
| # | Refinement | Why it matters |
|---|---|---|
| 1 | The merge keeps seven labeled subsections, never one generic sentence | The 7 notes govern 7 different problems: source hierarchy (stems over charts), a second hierarchy for a different evidence class (professional over 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 reading only "see master" breaks semantic retrieval. A search for "instrument attribution" must still land on attribution language |
| 3 | Dependency exemption pass before archiving any skill, plus an archive manifest | Zero invocations can also mean rare safety machinery or a bad description. Exempt anything a live gate, hook, memory rule, workflow or retained skill references |
| 4 | MEMORY.md risk is low-if-verified, not none | The index governs precedence, redirects and path ownership. Preserve every identifier, pointer, precedence relation and keyword, then diff on those fields |
| 5 | T7 Shield paths get offline status, never a dead-path label | Treating an unmounted drive as deletion is the same mistake G60 caught in section 14 |
| 6 | The 16-Stop-hook consolidation leaves this cleanup | Separate hooks isolate failures, ordering, exit behavior and environment assumptions. It earns its own behavioral equivalence test |
The review caught me using mention frequency as proof of ownership. It is not.
My first four blockers said sibling sessions owned the work and cited how often each session mentioned the item. A session can mention an item while auditing it, discussing it, or declining it. Reference counts would let any session manufacture permission to skip anything unpleasant.
A sibling-ownership blocker requires five things: the exact item id, an identified owner session, affirmative ownership evidence, the owner's most recent substantive action, and an expiring lease. Recent substantive work renews the lease. Mentioning the identifier renews nothing. A session may never name itself the owner.
The blocks-item-without-justifying-stop split is what makes this safe. A genuine collision removes one item from this session and leaves every unrelated item available, so one legitimate conflict can never become permission to stop working.
A second review round separated what was counted from what was inferred. Five labels changed.
| Claim | Was | Now | Why |
|---|---|---|---|
| Skill description cost | "~20,379 tokens buy nothing" | "81,519 measured characters belong to skills with zero observed invocations, about 20.4k token-equivalents" | The characters are measured. The token conversion is a 4-chars-per-token approximation, and four significant digits made it look tokenizer-derived |
| Value of unused skills | "buy nothing" | "zero observed invocations across 134 transcripts" | Zero invocations cannot establish zero conceivable value. Descriptions may affect routing or serve an unobserved future task |
| 143 / 51 / 163 note counts | read as obsolete rules | "143 live notes contain retire, supersede or banned language and need review" | These are string-match findings, which are search signals rather than semantic verdicts. Not every one of the 163 Vercel notes is an active deployment instruction |
| fifty-gates | "all 63 execute" | "all 63 are included in the generic execution path" | Code-path evidence, not a runtime trace of each gate body succeeding. The conclusion that the expected 27-gate hole does not exist still stands |
| Blocker verdicts | "are GENUINE" | "at final adjudication, returned GENUINE" | The verdict is derived on read rather than stored, and the leases are deliberately temporal, so the status should read as timestamped |
The Write and Edit counts behind the lease doctrine are session-wide, not item-scoped. Four Edits somewhere in a session does not by itself prove those edits concerned the blocked item. What the counts do establish is that the owner session was substantively active rather than idle, and that claim is combined with item-specific reference concentration to reach ownership. The stronger form would tie each write to the item's own files, which this audit did not do.
| Quantity | Status | Correct wording |
|---|---|---|
| Recovery from archiving skills | Estimate. The 81,519 characters are measured; the token conversion is approximate AND the dependency exemption pass will leave some of them loaded | "Up to about 20.4k token-equivalents before dependency exemptions, with the actual reduction determined after the exemption pass" |
| The skill count to archive | 165 is measured at zero observed invocations. ~140 is a candidate estimate depending on the exemption filter | Report 165 as the measured population and ~140 as the current candidate set, never the two interchangeably |
| Dead memory paths | Rounded measured ratio, not an estimate: 298 of 731 is 40.8 percent | "298 of 731 path REFERENCES did not resolve". The denominator is path references, not distinct filesystem destinations, since repeated citations inflate the impression |
The clearest demonstration of rule bloat in this audit was produced by the audit itself.
findings_chatgpt_gate grants a pass only on COVERED, which needs 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 on any substantive reply, and the standing
format rules require a link block and an open -R command. Every one of those adds content words
the recorded payload does not contain, which changes the fingerprint.
Satisfying either gate breaks the other. Four findings checks went to ChatGPT today and the best reachable verdict was SIMILAR_ONLY at 0.678 with the watermark holding, because a reply carrying the findings can never be word-identical to the payload while it also carries required formatting.
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. The deadlock is reported here instead.
No fix is proposed here. A session does not prescribe changes to Brandon's hooks, so 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 entirely his call.
An earlier draft of my report to the reviewer said the queue "produces new completion records faster than one session can process them". That is a rate claim, and it needed an arrivals-versus-completions comparison over a defined interval to earn the word "faster". It was never published to this page. It existed only in the review message, and the reviewer caught it there.
Rather than soften it to an observation, here is the measurement.
That is a measured rate under a stated interval and denominator, so the word "faster" is now earned: eight arrivals against zero completions available to this session. The architectural conclusion drawn from it, that shared completion machinery needs stronger concurrency handling, remains a conclusion supported by the observation rather than a measurement.
The exemption pass the reviewer insisted on was run. It cut the proposal by a factor of seven.
The claim was that archiving the never-invoked skills recovers up to about 20.4k token-equivalents. Running the dependency exemption pass first, as required, most of those skills turn out to be referenced somewhere: in a memory note, in config, in a gate, or in another skill's SKILL.md.
The corrected recommendation: archiving skills is a small win, not the
headline one. The 18 candidates are the strict-filter set with every invoked skill removed. The manifest
is at ~/.claude/skills-archive-manifest.json.
A filter that rejects almost nothing is not a filter. The loose criterion passes 98.3 percent of skills and is close to useless. The strict criterion passes 89.0 percent, which is still high. Both are reported rather than only the flattering one.
A memory note mentioning a skill does not prove the skill is needed. It proves a rule refers to it, so archiving it would break that reference. That is why the conservative reading governs here.
The skill archive is demoted. The directly-measured fixes take the top.
| # | Action | Recovers | Evidence class |
|---|---|---|---|
| 1 | Archive the dead music-library map out of ~/.claude/CLAUDE.md | ~6,577 chars per session, and it stops sending every session to folders that are gone | Measured. 47 of 69 paths do not resolve; ~/Music/Loops and ~/Music/mashup_dashboard are absent |
| 2 | Bring MEMORY.md under 20 KB so it stops truncating | Full visibility of the index that governs every other rule | Measured. 40,730 bytes, 273 lines, reports its own truncation |
| 3 | Fix the most-cited dead paths, starting with ~/MAP.md | Wasted turns following rules to files that are not there | Measured. 298 of 731 path references unresolved |
| 4 | Rewrite the Vercel-majority notes so the live host wins its own vote | Wrong-host deploys | Search signal needing review. 163 mention Vercel against 13 GitHub Pages |
| 5 | Archive the 18 strict-filter skills | 11,314 chars, 12.6 percent of the injection, ~2,828 token-equiv | Measured under a stated filter, after the exemption pass cut it from ~140 |
| 6 | Relocate the 143 self-retired notes | Retrieval noise | Search signal needing review |
| 7 | Merge the three CLAUDE.md files | ~2k token-equiv per session | Estimate |
Two cuts are queued with a stated reason each for not doing them in this session. A third was withdrawn as never valid.