llming / skills
CLAUDE.md0 starsChanged 3 months agoMITView on GitHub
README.md here records why each skill exists, what it's for, and where it might go next — see the root CLAUDE.md for the convention and the split between the two files. Nothing enforces that it keeps up. When adding, removing or substantially rethinking a skill, check README.md still matches: both the one-line summaries at the top and the section for the skill below them, since the summary carries a compressed version of the same reasoning and will quietly contradict its…
In this repository9 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- lookup-mesh-tree-numbers/CLAUDE.mdCLAUDE.md
- settings/CLAUDE.mdCLAUDE.md
- copilot-reviewSkill
- github-issuesSkill
- github-milestonesSkill
- pr-updateSkill
- sync-docsSkill
- wrapSkill
The file
We split this CLAUDE.md into the rules it gives an agent
1 rule. About 0 are common, 1 is distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 99
Read the bodies, not just the scores: Every scripted check passed on both versions in the first round.
≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
skills/
README.md here records why each skill exists, what it's for, and where it might go next — see the
root CLAUDE.md for the convention and the split between the two files.
Nothing enforces that it keeps up. When adding, removing or substantially rethinking a skill, check
README.md still matches: both the one-line summaries at the top and the section for the skill
below them, since the summary carries a compressed version of the same reasoning and will quietly
contradict its section. This is the file most likely to go stale, because a SKILL.md can be
edited from end to end without ever opening it.
Commands inside a SKILL.md get run, not read
Prose in a skill is advice an agent weighs; a shell command in a fenced block is something it runs
and believes the output of. So the bar is different: check that each command actually answers the
question the sentence above it asks. Three in one block of pr-update didn't, and every one failed
silently rather than erroring — a commit count standing in for a containment test, a gh lookup
resolving against the clone's default repo instead of the PR's base, a grep dropping the
owner/repo qualifier and querying the wrong repository. Each returns a confident answer about
something else. Run them against a real case before committing, especially the ones whose output
feeds a decision the agent then acts on.
The mirror image is prose promising a check the commands under it don't perform, or perform and
then walk past. wrap's step 0 promised a [origin/x: gone] marker a plain git fetch cannot
produce; pr-update's step 1 promised to catch a diverged head, first with commands that compared
nothing and then, once they did, with no instruction to stop. Prose reads as true because it
describes an intention, and an agent following it will narrate the check it was told about rather
than the one it ran. Read the block as if the surrounding sentences weren't there: what would it
actually tell you, and what does the skill do differently on each answer?
Checking whether a skill fires
Session transcripts record every skill load as a Skill tool call, so a fire check is two greps:
sessions that did the thing the skill covers, and sessions that loaded the skill. A session in the
first list and not the second is a miss. The first grep only sees the gh CLI — an issue changed
through gh api or an MCP tool is not counted — so that list is a floor.
cd ~/.claude/projects
# github-issues
grep -lrE --include='*.jsonl' \
'"command":"([^"]|\\")*gh issue (create|edit|close|reopen|comment)' . | sort
grep -lr --include='*.jsonl' '"skill":"github-issues"' . | sort
# github-milestones; repos/<owner>/<repo>/ keeps the gaurav/milestones repo itself from matching
grep -lrE --include='*.jsonl' \
-e '"command":"([^"]|\\")*gh issue (create|edit)([^"&;|]|\\")*(--milestone|-m )' \
-e '"command":"([^"]|\\")*gh api ([^"]|\\")*repos/[^/" ]+/[^/" ]+/milestones' . | sort
grep -lr --include='*.jsonl' '"skill":"github-milestones"' . | sort
# pipe any list through this for each session's start time
while read -r f; do
echo "$(grep -o -m1 -- '"timestamp":"[^"]*"' "./$f" | cut -d'"' -f4) $f"
done- Only sessions started after the install count. The first run of the
github-issuesgrep found about thirty sessions, all from before the skill existed. A file's mtime is the wrong date: it is when the session last wrote, and a session running across the install picks the skill up mid-session yet acted on plans made before it existed. Use each session's first timestamp. - Count per machine. Transcripts stay on the machine that ran the session, and so does the install date, so run the greps on every machine against its own cutoff and add them up.
- The paths may come back as
-Users-…/<id>.jsonlwith no leading././usr/bin/grepprints the./, but thegrepin Claude Code's shell is ugrep, which drops it, and a bare path reads as an option:xargs ls -lterrors, andgrepprints nothing, which looks like a session with no timestamp. Hence the--and the./, which is harmless (././…) when the./is there. ([^"]|\\")*, not[^"]*. The command field can contain a quoted argument before theghcall — a heredoc into"$S/issue.md", ased -i '' 's/…/…/' "$f"on the line above. A plain[^"]*stops at the first escaped quote and silently drops the session, which looks exactly like a session where the skill correctly had nothing to fire on. It was missing about a third of them.- After
gh issue, the gap also stops at&,;and|. Otherwise the-mpattern matches in the next command on the line —gh issue create … && git commit -m "…"— and a session with no milestone in it counts as a miss. An-minside the issue's own title still matches.
Testing a skill that writes to GitHub
pr-update commits, pushes and edits a PR, so its test runs need a real PR they cannot change. What
worked, when it was tightened against prcoder#109: each run gets its own clone whose origin is a
local bare copy of the repo, so pushes land nowhere real, and a stand-in gh first on PATH that
passes reads through to GitHub and records every write (pr edit, issue changes, an api call
that writes) to a file instead. The stand-in also serves a planted title and body
for a scenario, so one live PR can be tested in several states. Grade the recorded body, not the
agent's report of it.
ghcan't infer the PR onceoriginis a local path.gh pr viewwith no number fails withnone of the git remotes … point to a known GitHub host, so the stand-in has to add the PR number and--repoitself.- Tell an
apiwrite by what it does, not by its flags. A GraphQL call is a write only if its query is amutation, and a REST call only if its effective method isn't GET. Fields don't decide it:pr-update's Step 3 sends-f/-Ftographqlfor a read-only lookup, and--method GETcan carry fields too. Record those, and the run never sees the answers it needs. - Shell state doesn't persist between a subagent's Bash calls, so the
PATHprefix goes on every command. Give it in the prompt as a literal prefix, and afterwards check that the live PR's title and body are byte-for-byte what they were. - The snapshot goes stale while you work. The user pushed to #109 between iterations, a run saw
GitHub's head ahead of its
origin, and it rightly stopped at Step 1, which tested nothing. Record the head each iteration was cut at, and refresh the copy before re-running a scenario that reads the live PR. - Give each run its own scratch directory. Parallel runs otherwise share the session scratchpad and overwrite each other's test logs and body drafts.
- Read the bodies, not just the scores. Every scripted check passed on both versions in the first round; the one regression, an exact test count, turned up only on reading the output, and became a check afterwards.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

