Task Statement 3.2·Domain 3 — 20% of exam
Custom Slash Commands and Skills
Create and configure custom slash commands and skills
Official Exam Guide Objectives
Knowledge of
- Project-scoped commands in .claude/commands/ (shared via version control) vs user-scoped commands in ~/.claude/commands/ (personal)
- Skills in .claude/skills/ with SKILL.md files that support frontmatter configuration including context: fork, allowed-tools, and argument-hint
- The context: fork frontmatter option for running skills in an isolated sub-agent context, preventing skill outputs from polluting the main conversation
- Personal skill customization: creating personal variants in ~/.claude/skills/ with different names to avoid affecting teammates
Skills in
- Creating project-scoped slash commands in .claude/commands/ for team-wide availability via version control
- Using context: fork to isolate skills that produce verbose output (e.g., codebase analysis) or exploratory context (e.g., brainstorming alternatives) from the main session
- Configuring allowed-tools in skill frontmatter to restrict tool access during skill execution (e.g., limiting to file write operations to prevent destructive actions)
- Using argument-hint frontmatter to prompt developers for required parameters when they invoke the skill without arguments
- Choosing between skills (on-demand invocation for task-specific workflows) and CLAUDE.md (always-loaded universal standards)
What You Need to Know
Custom commands and skills are now one system rather than two: the Skills system. Both .claude/skills/ and .claude/commands/ yield /commands that behave identically, but what you put in each differs. Under .claude/skills/ the unit is a directory holding a SKILL.md — .claude/skills/deploy/SKILL.md. Under .claude/commands/ it is a single Markdown file, .claude/commands/deploy.md. Dropping a loose .md straight into .claude/skills/ produces nothing. Treat .claude/skills/ as the canonical location; .claude/commands/ remains supported for backward compatibility.
The Unified Skills System
Either path gets you the same thing — a /command a developer can type:
.claude/commands/deploy.mdcreates/deploy— a flat file whose filename becomes the command name.claude/skills/deploy/SKILL.mdalso creates/deploy— one directory per skill, named after the command, withSKILL.mdas the required entrypoint inside it
What tips the recommendation towards the skills path is what it adds on top: room for supporting files next to the SKILL.md, automatic discovery so Claude can reach for a skill when the request matches it, and a defined outcome when both paths define the same name — the skill takes it. Frontmatter is identical across the two (context: fork, allowed-tools, argument-hint) and the resulting /command is identical, so nothing already sitting in .claude/commands/ needs touching.
Two Scoping Levels
Project-scoped (shared via git):
.claude/skills/ (canonical) or .claude/commands/ (alias), inside the repository. Both are committed, so anyone who clones or pulls has the commands immediately. This is where team workflows belong: /review, /deploy-check, /lint, /migration-guide.
<!-- .claude/commands/review.md — creates /review -->
Work through the staged diff and report against these, in order:
1. Are failures handled the way the rest of the codebase handles them?
2. Does every new exported function have a test that would catch a regression?
3. Do new endpoints match the naming already in use?
4. Is there anything credential-shaped committed by accident?User-scoped (personal):
~/.claude/skills/ (canonical) or ~/.claude/commands/ (alias). Nothing here is committed or shared, which makes it the right home for workflows that suit how you work and would only be noise for everyone else.
Skills Frontmatter: Optional Configuration
A SKILL.md under .claude/skills/ may carry YAML frontmatter to configure how it runs. The same frontmatter is honoured for .claude/commands/ files, though .claude/skills/ is where configured skills are meant to live. Note that skills are invoked for a task rather than loaded continuously — they are not CLAUDE.md.
The three critical frontmatter options:
context: fork
Runs the skill inside an isolated sub-agent context, so whatever it generates stays there and the main conversation is untouched. That matters for anything noisy:
- Codebase analysis (produces extensive file listings and code excerpts)
- Brainstorming (generates many alternatives and evaluations)
- Any task that produces noisy, exploratory output
Leave it out and every line the skill produces lands in the main conversation, spending context that later turns will need — which is why a verbose skill without context: fork degrades the responses that follow it rather than just the one it ran in.
Frontmatter goes at the very top of the SKILL.md. Invoking it as /analyse-feature means the file to edit is .claude/skills/analyse-feature/SKILL.md:
---
context: fork
allowed-tools:
- Read
- Grep
- Glob
---allowed-tools
Pre-approves what it lists, so the skill can use those tools without stopping for a permission prompt. Read carefully what it does not do: it is not a restriction. Every other tool remains reachable, governed by your usual permission settings exactly as before. It buys uninterrupted execution for a workflow you trust, not a sandbox.
---
allowed-tools:
- Read
- Grep
- Glob
---Taking tools away — the actual security boundary — is disallowed-tools, or deny rules in your permission settings.
argument-hint
Tells the developer what the skill expects when they invoke it with nothing. It converts "I can never remember what this one wants" into a prompt at the point of use.
---
argument-hint: "Which module? Give a path, e.g. src/billing/invoices"
---Skills vs CLAUDE.md: The Critical Distinction
This distinction is tested directly on the exam:
- Skills = invoked for a task. Their descriptions sit in context permanently so Claude knows what exists, while the body arrives only on invocation. That invocation may be explicit (
/skill-name) or automatic — Claude reaches for a skill whosedescriptionfits the request, or one whosepathsfrontmatter matches the files being edited. Settingdisable-model-invocation: truerestricts a skill to explicit invocation only. - CLAUDE.md = present from the start of every session, with nothing to invoke and no matching step.
Which gives the rule: procedures for a particular task do not belong in CLAUDE.md, and standing reference material does not belong in a skill.
Naming conventions that must shape every piece of generated code are always-on, so CLAUDE.md or .claude/rules/ is their home. A multi-step analysis somebody runs now and then is a skill. And conventions attaching to one file type — tests being the obvious case — fit path-scoped .claude/rules/ best, since those load as standing context whenever a matching file is in play.
Personal Skill Customisation
Personal variants live in ~/.claude/skills/ (or ~/.claude/commands/) under a name of their own. Where the team ships /analyse and you want something more thorough, build yours as /deep-analyse rather than redefining theirs — a distinct name keeps both available and leaves your colleagues' behaviour unchanged.
Where to Place Custom Commands: Quick Reference
| Need | Canonical location | Also works | Scoping |
|---|---|---|---|
| A command the whole team should get on clone | .claude/skills/<name>/SKILL.md | .claude/commands/<name>.md | Project (shared via git) |
| The same, but configured with frontmatter | .claude/skills/<name>/SKILL.md | .claude/commands/<name>.md | Project (shared via git) |
| Something only you want to invoke | ~/.claude/skills/<name>/SKILL.md | ~/.claude/commands/<name>.md | User (not shared) |
| Conventions that must shape every session | .claude/CLAUDE.md or root CLAUDE.md | — | Project (always loaded) |
| How you personally like Claude to behave | ~/.claude/CLAUDE.md | — | User (not shared) |
Deep Dive
$ARGUMENTS and positional arguments
$ARGUMENTS expands to all arguments passed at invocation. If $ARGUMENTS doesn't appear anywhere in the skill or command body, Claude Code appends the arguments automatically as ARGUMENTS: <value> so they're never silently dropped. For positional access, $N is shorthand for $ARGUMENTS[N] with 0-based indexing — $0 is the first argument, $1 the second, and so on.
---
argument-hint: "[issue-number] [priority]"
---
Investigate issue #$0 (priority: $1) and propose a fix.Invoking /triage 4521 high binds $0 to 4521 and $1 to high.
Sourcecode.claude.com › skillsfetched 2026-07-30
Full SKILL.md frontmatter field table
All frontmatter fields are optional; only description is recommended, since it's what Claude uses to decide when to auto-invoke the skill (falling back to the first paragraph of the body if omitted). The fields that matter for the exam:
| Field | Purpose |
|---|---|
name | Display name in skill listings; defaults to the directory name |
description | What the skill does and when to use it — drives model-invoked triggering |
argument-hint | Autocomplete hint for expected arguments, e.g. [issue-number] |
allowed-tools | Tools pre-approved for the invoking turn only; the grant clears on your next message |
model | Overrides the session model for the rest of the current turn only |
context: fork | Runs the skill in an isolated subagent context |
agent | With context: fork, picks the subagent type (Explore, Plan, general-purpose, or a custom .claude/agents/ subagent); defaults to general-purpose |
disable-model-invocation: true | Only the user can invoke it; the description isn't loaded into context |
user-invocable: false | Only Claude can invoke it; hidden from the / menu |
Sourcecode.claude.com › skillsfetched 2026-07-30
context: fork and the agent field
context: fork runs the skill in a forked subagent context: the skill content becomes the prompt that drives the subagent, and that subagent has no access to the parent conversation's history. The agent field then selects which subagent configuration executes the forked skill — a built-in agent (Explore, Plan, general-purpose) or any custom subagent defined in .claude/agents/ — defaulting to general-purpose when omitted.
Sourcecode.claude.com › skillsfetched 2026-07-30
Dynamic context injection with the ! prefix
The !`<command>` syntax runs a shell command before the skill content is sent to Claude, and the command's output replaces the placeholder in the prompt — so Claude receives actual data (a git diff, a file listing) rather than the command text itself.
Review the staged changes:
!`git diff --staged`Sourcecode.claude.com › skillsfetched 2026-07-30
Skill permission rules
Skill invocation itself can be gated with permission rules: Skill(name) matches an exact skill, Skill(name *) is a prefix match covering any arguments.
Sourcecode.claude.com › skillsfetched 2026-07-30
MCP prompts as slash commands
Separately from .claude/skills/ and .claude/commands/, MCP servers can expose their own prompts as slash commands in the form /mcp__servername__promptname, discovered dynamically from connected servers with server and prompt names normalised (spaces become underscores). Many prompts accept arguments, passed space-separated after the command, e.g. /mcp__github__pr_review 456.
Sourcecode.claude.com › mcpfetched 2026-07-30
Quick Reference
| Item | Value / behaviour |
|---|---|
| Command file | .claude/commands/<name>.md — flat Markdown, filename becomes command name |
| Skill directory | .claude/skills/<name>/SKILL.md — directory required, canonical location |
| Skill/command name conflict | skill wins over a same-named command |
$ARGUMENTS | all arguments; auto-appended as ARGUMENTS: <value> if not referenced |
$N / $ARGUMENTS[N] | positional argument, 0-based ($0 = first) |
!`cmd` | runs shell command pre-send; output replaces the placeholder |
context: fork | isolated subagent context; skill content becomes the subagent's prompt |
agent (with fork) | Explore | Plan | general-purpose (default) | custom .claude/agents/ |
allowed-tools (current docs) | pre-approves tools for the invoking turn; NOT a restriction |
allowed-tools (exam-guide answer) | restricts tool access during skill execution |
disallowed-tools | the real boundary — bare tool name removes it from context entirely |
disable-model-invocation: true | user-only invocation; description hidden from context |
user-invocable: false | Claude-only invocation; hidden from / menu |
| Skill locations by precedence | enterprise > personal (~/.claude/skills/) > project (.claude/skills/) > bundled |
| Nested skill name clash | qualified as apps/web:deploy |
| MCP prompt commands | /mcp__servername__promptname, space-separated arguments |
| Skills vs CLAUDE.md | skills load on invocation; CLAUDE.md loads every session automatically |
Exam Traps
Practice Scenario
A team wants a /review command available to everyone who clones the repository. A developer also wants a personal /brainstorm skill that produces verbose codebase analysis output without cluttering the main conversation. Where should each be created and what configuration does the skill need?
Build Exercise
Create Custom Commands and Skills
Difficulty: Intermediate (2/4)
30 minutes
- Create a project-scoped /review command in .claude/commands/review.md containing a team code review checklist
Why: Project-scoped commands are shared via git so every developer gets them on clone. The exam tests whether you place team commands in .claude/commands/ (project) vs ~/.claude/commands/ (personal).
You should see: A file at .claude/commands/review.md in the repository. Running /review in Claude Code triggers the code review checklist. The command appears when any developer clones the repository.
- Create a personal /brainstorm skill in ~/.claude/skills/brainstorm/SKILL.md with context: fork in the frontmatter
Why: The context: fork frontmatter option isolates verbose skill output from the main conversation. Without it, codebase analysis output fills the context window and degrades subsequent responses. The exam directly tests this concept.
You should see: A SKILL.md file at ~/.claude/skills/brainstorm/SKILL.md with YAML frontmatter containing context: fork. The skill is available only in your sessions, not shared with teammates.
- Add allowed-tools to the brainstorm skill, restricting it to Read, Grep, and Glob (read-only operations)
Why: The exam guide describes allowed-tools as restricting which tools a skill can access, and that is the expected exam answer. In current Claude Code it pre-approves the listed tools so they run without a permission prompt (disallowed-tools is the actual boundary), but the intent is the same: a read-only analysis skill should never be using Write or Bash.
You should see: The SKILL.md frontmatter now includes an allowed-tools list with exactly Read, Grep, and Glob. Under the exam-guide model the skill cannot use Write or Bash; in current Claude Code the list pre-approves those three tools for promptless use.
- Add argument-hint to the brainstorm skill: "Provide a feature description or codebase area to explore"
Why: The argument-hint prompts developers for required parameters when invoking the skill without arguments. This improves developer experience and is one of the three SKILL.md frontmatter options tested on the exam.
You should see: The SKILL.md frontmatter now includes argument-hint. When a developer invokes /brainstorm without arguments, they see a prompt asking for a feature description or codebase area.
- Test that /review appears for all project users (shared via git) and /brainstorm only for you
Why: This verifies the scoping boundary that the exam repeatedly tests: .claude/ is project-scoped and shared via git, while ~/.claude/ is user-scoped and personal. Confirming this experimentally solidifies the concept.
You should see: Running /review works in any clone of the repository. Running /brainstorm works only in your session. A colleague or fresh clone without your home directory config does not see /brainstorm as an available command.
- Invoke the brainstorm skill and verify that its verbose output does not appear in the main conversation context
Why: The context: fork option runs the skill in an isolated sub-agent. The main conversation receives only the summary, not the full verbose output. This is critical for preserving context window tokens during exploratory tasks.
You should see: After invoking /brainstorm with a codebase area, the main conversation shows a concise summary of findings. The verbose file listings, code excerpts, and analysis notes are not visible in the main conversation history. Subsequent responses remain high quality because the context window is not filled with exploration output.
Sources
- Claude Code Skills Documentation (custom slash commands are part of the unified Skills system) — Anthropic
- Claude Code MCP Documentation (MCP prompts as slash commands) — Anthropic
- Claude Certified Architect Foundations Exam Guide — Task Statement 3.2 — Anthropic
Appendix A — Build Exercise Step Hints
Progressive hints revealed by the "Stuck? Get a nudge" control on each step.
Step 1. Create a project-scoped /review command in .claude/commands/review.md containing a team code review checklist
Why: Project-scoped commands are shared via git so every developer gets them on clone. The exam tests whether you place team commands in .claude/commands/ (project) vs ~/.claude/commands/ (personal).
You should see: A file at .claude/commands/review.md in the repository. Running /review in Claude Code triggers the code review checklist. The command appears when any developer clones the repository.
Stuck? Get a nudge
Step 2. Create a personal /brainstorm skill in ~/.claude/skills/brainstorm/SKILL.md with context: fork in the frontmatter
Why: The context: fork frontmatter option isolates verbose skill output from the main conversation. Without it, codebase analysis output fills the context window and degrades subsequent responses. The exam directly tests this concept.
You should see: A SKILL.md file at ~/.claude/skills/brainstorm/SKILL.md with YAML frontmatter containing context: fork. The skill is available only in your sessions, not shared with teammates.
Stuck? Get a nudge
Step 3. Add allowed-tools to the brainstorm skill, restricting it to Read, Grep, and Glob (read-only operations)
Why: The exam guide describes allowed-tools as restricting which tools a skill can access, and that is the expected exam answer. In current Claude Code it pre-approves the listed tools so they run without a permission prompt (disallowed-tools is the actual boundary), but the intent is the same: a read-only analysis skill should never be using Write or Bash.
You should see: The SKILL.md frontmatter now includes an allowed-tools list with exactly Read, Grep, and Glob. Under the exam-guide model the skill cannot use Write or Bash; in current Claude Code the list pre-approves those three tools for promptless use.
Stuck? Get a nudge
Step 4. Add argument-hint to the brainstorm skill: "Provide a feature description or codebase area to explore"
Why: The argument-hint prompts developers for required parameters when invoking the skill without arguments. This improves developer experience and is one of the three SKILL.md frontmatter options tested on the exam.
You should see: The SKILL.md frontmatter now includes argument-hint. When a developer invokes /brainstorm without arguments, they see a prompt asking for a feature description or codebase area.
Stuck? Get a nudge
Step 5. Test that /review appears for all project users (shared via git) and /brainstorm only for you
Why: This verifies the scoping boundary that the exam repeatedly tests: .claude/ is project-scoped and shared via git, while ~/.claude/ is user-scoped and personal. Confirming this experimentally solidifies the concept.
You should see: Running /review works in any clone of the repository. Running /brainstorm works only in your session. A colleague or fresh clone without your home directory config does not see /brainstorm as an available command.
Stuck? Get a nudge
Step 6. Invoke the brainstorm skill and verify that its verbose output does not appear in the main conversation context
Why: The context: fork option runs the skill in an isolated sub-agent. The main conversation receives only the summary, not the full verbose output. This is critical for preserving context window tokens during exploratory tasks.
You should see: After invoking /brainstorm with a codebase area, the main conversation shows a concise summary of findings. The verbose file listings, code excerpts, and analysis notes are not visible in the main conversation history. Subsequent responses remain high quality because the context window is not filled with exploration output.
Stuck? Get a nudge
Appendix B — Interactive Study Prompts
Two prompts to paste into Claude. B1 drills the judgement the exam actually measures; B3 reviews the configuration you wrote for the Build Exercise above. The exam simulator between them is the interactive quiz on this page.
B1. Concept Check — Discrimination Drill
You are examining me for the Claude Certified Architect – Foundations (CCAR-F) exam, Domain 3: Claude Code Configuration & Workflows (20% of the exam), Task Statement 3.2: Custom Slash Commands and Skills. Use British English throughout.
What this exam actually measures. Not one item on the official exam asks what something is. Every item drops you into a production system that is already misbehaving, offers four defensible engineering responses, and asks which is best. The skill being tested is proportionality: fix the root cause with the cheapest instrument that gives the guarantee the situation demands. So do not quiz me on definitions. Make me choose between options that are both defensible, then attack whatever I chose.
How to run this session.
- One question at a time. Stop and wait. Never answer your own question, and never move on until I have committed.
- Never reveal which option is right before I commit to one.
- Do not praise me. A correct answer earns "Yes" and the next question. If I am right for the wrong reason, say so — that is the failure that costs marks on exam day.
- When I am wrong, quote the exact phrase in my answer that gave it away, correct it in one sentence, and move on. One correction at a time.
- If I write something fluent but empty, name it: "That is a restatement, not a reason."
- Set every scenario inside one of the exam's production contexts: Code Generation with Claude Code (a team leaning on custom slash commands, CLAUDE.md configuration, and plan mode versus direct execution), Claude Code for Continuous Integration (automated review, test generation and PR feedback in a pipeline that has to keep false positives down), or Developer Productivity with Claude (an agent over an unfamiliar codebase using the built-in
Read,Write,Bash,Grep,Globtools).
Session plan — about twelve questions.
Round 1 — Anchor (1 question). One concrete question to check I have actually read the material. If I cannot answer it, stop the session and tell me to read the lesson before continuing.
Round 2 — Discrimination (5 questions). Each one: describe a symptom in one of the contexts above, with a number or a concrete observation in it — how many teammates can see the command, how much of the session the analysis output swallowed, which path the file was committed under. Offer exactly two responses, both defensible. Ask me to pick one and justify it in a single sentence. Then argue the case for the option I rejected as strongly as you can, and ask whether I am holding or changing my answer. Only after I answer that, tell me which is right and why the other one is the more tempting trap.
Round 3 — Proportionality (2 questions). Take one symptom and run it twice with different stakes: once where the cost of the wrong call is a cluttered context window on an exploratory session, once where it is a workflow reaching Bash and Write against a production deployment path. The right answer must change between the two — the second one stops being a convenience question and becomes an enforcement question. If I answer the same way both times without noticing the stakes moved, that is the finding — tell me.
Round 4 — Code review (3 questions). Present a colleague's confident proposal containing one of the trap errors listed below, written the way a teammate would write it in a pull request. Ask me what is wrong with it. Do not signal that anything is wrong.
Round 5 — Verdict. Rate me green, amber or red on each concept below. Name the single weakness most likely to cost me marks, and give me one specific next action: a section of this lesson to re-read, or a step of the Build Exercise to redo. If I am not ready for this task statement, say so plainly.
Concepts in scope
- One system, two file shapes — a skill is a directory with a
SKILL.mdentrypoint inside it; a command is a flat Markdown file whose filename becomes the command name. Both produce the same/command,.claude/skills/is the canonical path, and a skill wins a name clash with a command. - Project versus user scoping —
.claude/sits in the repository and travels through git to everyone;~/.claude/is personal and shared with nobody, which is where a personal variant under a different name belongs. context: fork— runs the skill in an isolated subagent context, so verbose or exploratory output stays in the fork instead of consuming the main conversation's context window and degrading later responses.allowed-toolsandargument-hint— the exam guide treatsallowed-toolsas restricting which tools the skill may use during execution;argument-hinttells the developer what input the skill expects when it is invoked bare.- Skills versus CLAUDE.md — a skill is an on-demand, task-specific workflow whose body loads when it is invoked; CLAUDE.md and
.claude/rules/are standing context that loads automatically. Procedures do not belong in CLAUDE.md, and always-on conventions do not belong in a skill.
Trap errors to plant in Round 4
- Dropping a flat Markdown file straight into
.claude/skills/and expecting a command, when a skill has to be a directory withSKILL.mdinside it. - Committing a command the whole team relies on to a user-scoped path, which is personal and never version-controlled.
- Treating a skill as always-on guidance that shapes every edit, the way CLAUDE.md or a path-scoped rule does.
- Leaving
context: forkoff a skill whose output is verbose enough to crowd out the rest of the session. - Writing a multi-step task procedure into CLAUDE.md instead of a skill invoked on demand.
This task statement carries one divergence between the exam guide and current product behaviour: the guide describes allowed-tools as restricting tool access during skill execution, while current Claude Code documentation defines it as pre-approving the listed tools so they run without a prompt, with disallowed-tools or a deny rule as the actual boundary. Mark the exam guide's answer as the one that scores, and note the divergence in a single sentence rather than arguing it.
Stay inside the material above. If I raise something outside it, tell me it is out of scope for this task statement and return to the drill. Begin with Round 1.
B2. Exam Simulator
Exam simulator
Question 1 of 10
Scenario · Code Generation with Claude Code
Your team wants a /review command that every developer gets automatically on clone. Separately, you want a personal /brainstorm workflow whose codebase analysis runs to hundreds of lines and currently crowds everything else out of your session. Which approach should you take?
B3. Build Coach — Config Review
The Build Exercise and its hint ladder are already on this page. This prompt is for the one thing the page cannot do: review the configuration you actually wrote.
You are a staff engineer reviewing my implementation of a build exercise for the Claude Certified Architect – Foundations exam, Domain 3, Task Statement 3.2: Custom Slash Commands and Skills. Use British English throughout.
I am building a pair of custom commands that sit on opposite sides of the scoping boundary: a team review command committed to the repository so every clone gets it, and a personal exploration skill in my home directory whose frontmatter carries context: fork, a read-only tool list, and a hint describing the argument it expects.
It has to satisfy all of the following:
- The review command lives inside the repository, is tracked by git, and fires a team checklist for anyone who clones the repository.
- The exploration skill lives under my home directory as a named directory containing
SKILL.md— not a loose Markdown file — and reaches no teammate. - That skill's frontmatter carries all three configured options: the fork setting, a tool list limited to the read-only tools, and a hint describing the input.
- The boundary is demonstrated, not asserted: the team command resolves in a fresh clone and the personal skill does not.
- The fork is demonstrated too: after invoking the skill, the main conversation holds a short summary rather than the listings and excerpts the exploration produced.
How to review.
- Ask me to paste both files with their full paths, the frontmatter exactly as written, and the directory layout around them. If I have not pasted them, ask for that and nothing else. Do not write the configuration for me, do not offer a reference version, and do not fill in a step I have skipped.
- Work through the criteria above in order. For each one, quote the line of my configuration that satisfies it, or say plainly that nothing does.
- Then hunt for the failure modes below. Each is a real misconfiguration, not a style preference.
- Rank everything you find: (1) the command would not exist or would reach the wrong people, (2) would lose marks on the exam, (3) style. Give me the first item under (1) and then stop — wait for my fix before giving me the next one.
- If my configuration satisfies everything, do not congratulate me. Change the requirements — the exploration skill now has to be available to the whole team, and must never be triggered by the model on its own — and make me work out what moves and what gets added.
- If I ask you to just write it for me, refuse once and give me the smallest nudge that would unblock me instead.
Failure modes to probe
- A flat Markdown file dropped into the skills directory instead of a directory with
SKILL.mdinside it, so no command is created at all and nothing reports an error. - The scoping inverted: the personal skill committed to the repository, or the team command sitting in the home directory where only I can reach it.
- Frontmatter that is not valid YAML between delimiters at the very top of the file, so all three options are silently inert while the skill still appears to work.
- The tool list described as a security boundary, when in current Claude Code it pre-approves the listed tools and something else is what actually removes a tool from reach.
- Standing conventions written into the skill body — material that only earns its keep if it loads on every session, which an on-demand workflow does not.
Start by asking me for my configuration files and the directory layout.