steward-kit

The state of CLAUDE.md, October 2026

We read 492 public CLAUDE.md files and counted the rules, the hooks and the settings behind them. The tables are below, and the data file is a download.

What we looked at

Everything below is about the 492 CLAUDE.md files unless it says otherwise.

How many rules a file has

We count rule like lines with a keyword analyzer. The median CLAUDE.md has 8. The smallest has 0 and the largest has 525. A quarter of the files have more than 26, and one in ten has more than 57.

Rule like lines in the fileFilesShare of 492
08617.5%
1 to 410721.7%
5 to 98216.7%
10 to 196713.6%
20 to 499318.9%
50 or more5711.6%

What is enforced today

These are the shares of the 492 files whose repo also has the setting or hook shown.

In the same repoFilesShare of 492
A .claude/settings.json18537.6%
A .claude/settings.local.json153.0%
A hooks directory6012.2%
At least one hook command10020.3%
Hook events or a hooks directory10822.0%
permissions.deny306.1%
permissions.allow8517.3%
A model set40.8%
A settings file that is not valid JSON20.4%
A .claude workflow295.9%

Across all 667 rules files, 105 (15.7%) have at least one hook command. The 22.0% row counts a hooks directory or any hook event; the 20.3% row counts only repos with a hook command.

What the free kit already matches

The free kit has a catalog of hooks and settings. We matched each rule like line against it. There are 10,997 rule like lines in total.

ResultLinesShare of 10,997
Matched a deny hook210.2%
Matched a nudge hook680.6%
Matched a setting1331.2%
No match (prose)10,77598.0%

116 files (23.6%) have at least one line that matched something in the kit.

What a model says about the rest

Most lines matched nothing, so we drew two random samples of 300 of the unmatched lines. A model (Sonnet) labeled each one DENY, CHECK, SETTING, JUDGMENT or NOT_A_RULE. DENY means a hook could block it. CHECK means a hook could check it. SETTING means a setting covers it.

LabelSample 1Sample 1 shareSample 2Sample 2 share
DENY5016.7% (plus or minus 4.2)5016.7% (plus or minus 4.2)
CHECK3913.0% (plus or minus 3.8)4214.0% (plus or minus 3.9)
SETTING124.0% (plus or minus 2.2)82.7% (plus or minus 1.8)
JUDGMENT4414.7% (plus or minus 4.0)5117.0% (plus or minus 4.3)
NOT_A_RULE15551.7% (plus or minus 5.7)14949.7% (plus or minus 5.7)

Ranges are 95% margins. Sample 1 drew from 10,775 unmatched lines. After sample 1 we tightened the line detector, so it rejects code, paths, headings and fragments. That left 7,131 unmatched lines, and sample 2 is a fresh draw from them.

The tightening was tuned on sample 1, so sample 1 could be overfit. Sample 2 is the check. NOT_A_RULE moved from 51.7% to 49.7%, which is inside the range. The share of real rules that a hook or a setting could enforce was 101 of 145 (69.7%, plus or minus 7.5) in sample 1 and 100 of 151 (66.2%, plus or minus 7.5) in sample 2. Pooled, that is 201 of 296, or 68%.

The claim we make is this: about two thirds of real rules could be enforced by a hook or a setting. Could is not does. This counts what is possible, not what is installed.

As a control, a second model (Opus) relabeled the first 40 lines of sample 1. It gave the same label on 32 of 40, or 80%.

What this does not show

The data

Download data.csv One row per organization, 667 rows. Columns:

Check your own repo: paste its address into the analyzer.

Related: the free analyzer, the sample report, the log and the steward-kit repo.

Method and authorship

Produced by the steward-kit Claude Code sessions. The labels come from a language model, the matches from the free analyzer. No person reviewed the file line by line.