Workloft
▸ WORKLOFT RESEARCH NOTE №68 · 06 AUGUST 2026

Don't Delete CLAUDE.md

The trend says agents have memory and hooks, so the instruction file is dead. We tested that on our own live config. It is half right.

CONFIG AUDIT ●●● · n=1 LIVE FLEET · CLAUDE.md + 58 MEMORIES + 15 HOOKS

§1The verdict: don't delete it, demote it

A post doing the rounds says the quiet part loudly: delete your AGENTS.md and CLAUDE.md files, because agents have memory and hooks now. It is a good provocation and it is half right. We run exactly the stack it says makes the instruction file obsolete: a 59-line CLAUDE.md, 58 auto-memory files (about 13,000 words), and 15 hooks wired across seven lifecycle events. So rather than argue, we audited our own live config against the claim.

Here is what we found. The three things are not substitutes you pick between. They are a ladder, ranked by how reliably each one fires. "Delete CLAUDE.md" is the wrong instruction. "Demote every line to the strongest layer whose trigger it actually fits" is the right one. Run that pass and a bloated CLAUDE.md shrinks by about 60%. It does not reach zero, and the part that remains is the part that matters.

§2The three layers are a ladder, not a menu

Rank the three by trigger predictability times enforcement strength and they fall into a strict order.

A hook is deterministic. It fires on a code-detectable trigger and enforces a pass or fail rule. It is the strongest layer, but it only covers rules you can both detect in code and express as a check. You cannot hook "write in my voice".

Memory is recall-based. A fact or pointer gets pulled into context when the model judges it relevant. Good for things that only matter sometimes. The failure mode is quiet: the model just doesn't recall at the moment it mattered, and nothing stops it.

CLAUDE.md is always in context. It is the most expensive layer per token, because every line is loaded on every turn whether it is relevant or not. That cost is also its point. It is the only layer that is guaranteed active with no trigger required.

Read in that order, the design rule writes itself. Push each directive down to the strongest layer whose trigger it fits. A hard rule with a detectable trigger belongs in a hook. A fact that matters only sometimes belongs in memory. Something that must shape every output and has no single trigger has nowhere lower to go, so it stays in the always-on file.

§3We audited our own CLAUDE.md: 62% movable, 37% not

We split our live CLAUDE.md into its 16 atomic directive blocks and classified each into the strongest layer its trigger fits. The split:

Hook, 1 block (6%). One hard rule with a clean trigger. Memory, 9 blocks (56%). Reference facts and pointers: the tech stack, the commercial terms, the URLs, the details about people. None of it needs to be in context when we are not on that topic. Context, 6 blocks (37%). Identity, the brand and taste tokens, and the precedence rules that decide which layer wins a conflict.

So 62% of the file is movable, out of the always-on layer and into a hook or into memory. That is the half the trend gets right: most of a fat CLAUDE.md is reference material that has no business being reloaded on every single turn. But 37% has nowhere lower to go. You cannot hook "use these exact brand hex values on every visual", because there is no reliable trigger for "a visual is about to be produced", and by the time a recall would fire it is too late, the output is already being generated. Taste, identity, and precedence are irreducibly always-on. Delete them and the agent is confidently off-brand.

§4The promotion is not hypothetical: we watched a rule climb the ladder

The strongest evidence for the ladder is that we already ran it, by accident, over months. Our product is called ReferRoute. It used to be called Conexus, and that name is retired. For three weeks the rule "never call it Conexus" lived as prose in CLAUDE.md and as a preference the model was supposed to recall. It failed roughly six times. Alfred kept correcting it.

So we promoted it. The rule is now a PreToolUse hook, outbound_name_lint.py. Its own docstring records the reason in one line: "Memory alone demonstrably failed, so this gate makes the rule deterministic." We tested it again writing this Note. Feed the hook a write of the word "Conexus" into an outward-facing file and it returns a hard deny. Feed it the same word inside a lowercase ~/conexus path, which is the legitimate repo directory, and it passes. It distinguishes the retired product name from the file path, which is exactly the nuance prose kept getting wrong.

That is the ladder working as designed. A rule started as prose, failed as memory, and only stuck once it became a hook. Enforcement beats memory, for any rule you can give a trigger. The corollary is the whole point: for rules you cannot give a trigger, there is no enforcement to promote them to, and prose in the always-on file is the best you have.

§5What stays, and the honest caveat

After the demotion pass, what is left in CLAUDE.md is small, sharp and load-bearing: who the agent is, the taste it has to apply to everything, and the precedence rules that settle which layer wins when two disagree. That last category is worth naming, because a precedence rule ("this block overrides any invented palette") is a rule about the other rules. It has to sit in the always-on layer by definition, or it cannot arbitrate.

The honest caveat: this is n=1, our config. The 62/37 split is specific to our file. A repo-level AGENTS.md that is mostly build and lint commands would skew far more hook-movable, because build steps have clean triggers. The exact percentage does not generalise. The ladder does. So do not delete your CLAUDE.md. Run it line by line and ask, of each line, what is the strongest layer whose trigger this fits. Move everything that can move. What refuses to move is the file you actually needed.


Methodology note. This Note tests a live trend ("delete AGENTS.md and CLAUDE.md, agents have memory and hooks") against our own production config: a 59-line CLAUDE.md, 58 auto-memory files, and 15 hooks across seven lifecycle events. Method: split the CLAUDE.md into its 16 atomic directive blocks and hand-classify each into the strongest layer whose trigger it fits (hook, memory, or always-in-context), then tally. The 62/37 split is the output of that classifier. The hook behaviour (a hard deny on the retired product name in outward text, a pass on the lowercase repo path; a hard deny on a dated article with no hero image) was verified live by feeding test payloads to the actual hook scripts on 06 August 2026. Caveat: n=1, our file. The ladder generalises; the exact percentage does not.