Cerebro doctor
Meta-audit of the skill system. Walks `{brain_root}/skills/` + `{brain_root}/AGENTS.md` and reports three classes of drift: (a) skills with no resolver row (unreachable), (b) AGENTS.md rows pointing at missing skills (orphan phrases), (c) DRY overlap — two skills claiming the same trigger substring. Exit code 0 = clean; non-zero = drift. Trigger on: "cerebro doctor", "check resolvable", "skill health check", "resolver audit", "DRY audit", "are my skills reachable".From its SKILL.md
npx -y skills add cerebrocybersolutions/libro --skill cerebro-doctorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 1 command, including `python3 {brain_root}/skills/cerebro-doctor/Scripts/check_resolvable.py`.
SKILL.md
3.8 KB, 842 tokens by cl100k_base, as published. Nobody here has run it
skill-doctor
Mechanical audit of your skill resolver system. Three checks, one Python script, no LLM in the loop.
What it does
-
Reachability — every
{brain_root}/skills/<name>/SKILL.mdhas at least one row in{brain_root}/AGENTS.mdmapping a phrase to<name>. "Surgeon on staff but not in the hospital directory" — if a skill exists but nothing routes to it, it's invisible. -
Orphan phrases — every AGENTS.md row points at a skill that actually exists (not archived, not typo'd). Catches stale rows after a skill retires.
-
DRY overlap — no two active skills claim the same trigger substring in their SKILL.md
description:frontmatter. When overlap is legitimate, the fix is a discriminator row in AGENTS.md under "Known DRY pairs." When overlap is a bug, the fix is narrowing the SKILL.md description.
How to run
python3 {brain_root}/skills/cerebro-doctor/Scripts/check_resolvable.py
Optional flags:
--root <path>— override Brain root detection (default: walk up from script location)--format json— machine-readable output for daily cron integration--quiet— only print if there's drift
Exit codes:
0— clean1— reachability drift (unreachable skill or orphan phrase)2— DRY overlap found3— both
Scope contract
- Reads:
{brain_root}/skills/*/SKILL.md,{brain_root}/AGENTS.md,{brain_root}/skills/_archive/(to disambiguate retired from missing) - Writes: nothing. Read-only audit.
- MCP / tools: Python stdlib only. No network, no external models.
- Network egress: none.
- Surface: Claude Code (pure FS read). No git operations.
- Credentials: none required.
- Escalation triggers: if the script can't parse a SKILL.md frontmatter cleanly, it reports
PARSE_ERRORfor that file and keeps going. Does not abort.
Filing rules
- Writes no Brain output. The script prints to stdout; callers decide whether to file the report.
- If a daily cron wraps this, it can file a digest at
{brain_root}/audits/<date>-skill-doctor.md— that's the cron's filing rule, not this skill's.
Known limitations (V0)
- DRY check uses naive substring matching on description text. False positives are possible (e.g., "find clients" vs "find solicitations" both contain "find" — the check uses multi-word phrases, not single words, to dampen this).
- Script-callability check (verifying every referenced script is callable) is deferred to V1 — V0 only does reachability + DRY.
- No
--fixmode. Drift surfaces; operator or next session authors the fix.
Rollback
Delete {brain_root}/skills/cerebro-doctor/. AGENTS.md keeps working as a
human-readable registry; only the machine check goes away.
Related
{brain_root}/AGENTS.md— the resolver registry this audits{brain_root}/skills/brain-setup/— scaffolds the Brain this audits{brain_root}/skills/sessionstart/+{brain_root}/skills/sessionend/— session rituals that consume a healthy resolver
References (auto-wikilinks)
- [[-skill-doctor]]
- [[SKILL]]
What ships with it: 6 files
31.0 KB alongside SKILL.md, 4 of them executable
Scripts/
- check_canonical_drift.pyruns9.9 KB
- check_resolvable.pyruns10.6 KB
- doctor.pyruns3.6 KB
- run_daily.shruns2.1 KB