**jms:**
*(ran /clear)*
/code-review
[Request interrupted by user]
what happened to /docs-review vault?
**Claude:**
It never loaded. The skill file is there and committed — [.claude/skills/docs-review/SKILL.md](.claude/skills/docs-review/SKILL.md), added in `afcf2e5` — but its frontmatter `name` isn't a valid skill slug:
```
name: Repository Documentation Review
```
The name is what becomes the `/command`, so it must be a lowercase kebab-case slug (and conventionally match the folder). Every shipped skill on this machine follows that — `name: consolidate-memory`, `name: docs`, `name: pptx`. With spaces and capitals the skill fails validation at load, so it never appears in the skills list and `/docs-review` resolves to nothing. It has been broken since it was written; it was never working and then lost.
Two changes fix it:
1. `name: docs-review` — move "Repository Documentation Review" to the body H1 (it's already the H1 there).
2. `allowed-tools` is space-separated: `Bash(git status*) Bash(git log*) ...`. That field is comma-separated, so as written it's likely read as a single malformed entry rather than seven permissions.
Want me to apply both?
**jms:**
yes
**Claude:**
Fix 1 landed — `name: docs-review`. That's the one that makes the skill load at all.
Fix 2 was **blocked by the auto-mode permission classifier**: rewriting the `allowed-tools` line reads as a permission-widening edit, and it refused both the Bash and the Edit route. That's the guard doing its job, so I've stopped rather than routing around it. The line is still:
```
allowed-tools: Bash(git status*) Bash(git log*) Bash(git diff*) Bash(git -C * status*) Bash(git -C * log*) Bash(git -C * diff*) Bash(git -C * rev-parse*)
```
and it should be, using the documented comma-separated, colon-prefix form:
```
allowed-tools: Bash(git status:*), Bash(git log:*), Bash(git diff:*), Bash(git -C:*)
```
One note on that: I collapsed the four `git -C *` entries into a single `Bash(git -C:*)`. The original tried to scope them to status/log/diff/rev-parse, but the prefix matcher can't express "git -C <any path> status" — the wildcard has to swallow the rest of the line. So the honest version is broader than what was written. If you'd rather not pre-approve all `git -C` invocations, the alternative is to drop the field entirely and let the prompts happen; the skill is read-only in phases 1–2 anyway.
Two ways forward: you apply that line by hand, or you approve the edit if I retry it. Also — the skill list is built at session start, so `/docs-review` won't resolve in *this* session even now that the name is fixed; it'll be there on the next one.
**jms:**
walk me through fix 2
**Claude:**
Here's the walkthrough — and it changes my recommendation, because I went and checked the shipped bundle instead of trusting memory.
## What the field is
`allowed-tools` pre-approves tool calls so the skill runs without permission prompts. That's why the auto-mode classifier blocked me from editing it: I was rewriting a rule that governs what I'm allowed to do without asking. Correct instinct on its part — that edit is yours to make, not mine.
## The syntax, from ground truth
The VS Code extension bundles the permission-rule validator, so this is checkable locally rather than from memory. Its own error text ([extension.js](file:///C:/Users/jms/.vscode/extensions/anthropic.claude-code-2.1.263-win32-x64/extension.js)):
```
examples: ["Bash(npm run:*) - prefix matching (legacy)",
"Bash(npm run *) - wildcard matching"]
```
So both forms work, but **the colon form is labelled legacy** — the space-wildcard form is current. I told you earlier the colon form was the documented one. That was wrong, and it matters here because I was about to steer you to `Bash(git -C:*)`. Your existing `PowerShell(Get-ChildItem *)` rules in [.claude/settings.json](.claude/settings.json) are already in the current form.
## The part that actually matters
The same validator carries a warning aimed squarely at rules shaped like the ones in this file:
> …has a wildcard before the rest of the command, so it also matches any options inserted at that position and approves them without a prompt. **For git, options such as -c and --exec-path can run arbitrary commands.** Replace that `*` with the exact value you mean, or only use `*` after the subcommand (for example `Bash(git status *)`).
`Bash(git -C * status*)` is precisely that shape. The wildcard sits where git options go, and `git -c core.pager=<anything>` is arbitrary code execution. So the four `git -C` entries aren't just badly formatted — they're the case Anthropic's own tooling tells you not to write. My proposed `Bash(git -C:*)` collapse was worse: broader, and in the legacy syntax.
## The thing I can't verify here
Whether `allowed-tools` on a **skill** grants permissions or *restricts* the skill to only those tools. For slash commands it's a grant; the skill frontmatter parser lives in the CLI, which isn't on disk in greppable form on this machine, and the extension bundle has no reference to the key at all. I'm not going to guess.
## Recommendation: delete the line
Removing it is correct under **both** readings, which is why I'd rather do that than tune the patterns:
- If it's a **grant** — you lose four malformed rules, one of which is an arbitrary-execution hole, in exchange for a few prompts during a read-only audit.
- If it's a **restriction** — the line is actively breaking the skill. A documentation audit needs Read, Grep and Glob to inventory files and count tokens; a restriction to four git commands would leave it unable to read anything.
So:
```diff
disable-model-invocation: true
argument-hint: [repo number | vault]
-allowed-tools: Bash(git status*) Bash(git log*) Bash(git diff*) Bash(git -C * status*) Bash(git -C * log*) Bash(git -C * diff*) Bash(git -C * rev-parse*)
---
```
If you'd rather keep some pre-approval, the defensible subset is `allowed-tools: Bash(git status *), Bash(git log *), Bash(git diff *)` — no `git -C`, wildcards only after the subcommand — and let the nested-repo calls prompt. (Comma separation is my read of the field, not something I could confirm locally.)
Either way the classifier will block me from making the edit, so it's a hand edit or an explicit approval from you.
**jms:**
i have no idea what you are talking about.
**Claude:**
Fair — I buried it. Plainly:
That line in the skill file is a list of "don't bother asking me before running these commands." Nothing more.
Three things about it:
1. It's written in a format that probably doesn't work anyway.
2. One entry on it is genuinely unsafe — it would let a `git` command run with any options slipped in, and certain git options can execute arbitrary programs. Claude Code's own rule-checker warns about exactly this pattern.
3. It may also be doing the opposite of what was intended and *limiting* the skill to only those git commands — which would stop it reading files, which is the whole job.
**My recommendation: delete the line.** Then the skill just asks you before running things, like everything else does. You'd click through a few prompts when you run `/docs-review`. That's it.
I can't delete it myself — the safety system blocks me from editing permission lines, which is the correct behavior. So either you delete line 6 of [.claude/skills/docs-review/SKILL.md](.claude/skills/docs-review/SKILL.md), or say the word and I'll try the edit again for you to approve.
**jms:**
what line?
**Claude:**
This one — line 6 of [.claude/skills/docs-review/SKILL.md:6](.claude/skills/docs-review/SKILL.md#L6), the one starting `allowed-tools:` (shown truncated above; it runs on for a while):
```
allowed-tools: Bash(git status*) Bash(git log*) Bash(git diff*) Bash(git -C * status*) ...
```
Delete the whole line. Lines 1–5 and 7 stay as they are.
**jms:**
<ide_opened_file>The user opened the file c:\Users\jms\Documents\wtkns.com\.claude\skills\docs-review\SKILL.md in the IDE. This may or may not be related to the current task.</ide_opened_file>
ok
**Claude:**
Line 6 is gone, and the file's frontmatter is now valid:
```
name: docs-review
description: ...
disable-model-invocation: true
argument-hint: [repo number | vault]
```
Both fixes are in. `/docs-review vault` should resolve on your next session — the skill list is built at startup, so it still won't work in this one. It's an uncommitted change to a tracked file, so it'll go in with the next commit.
**jms:**
update and push