CLAUDE LABJP
TOOLSWAP — Mid-conversation tool changes are in beta: add or remove tools between turns while keeping the prompt cache intact, on Fable 5, Mythos 5, Opus 4.8, and Opus 5FALLBACK — The fallbacks parameter gained a default mode that applies Anthropic's recommended fallback models per refusal category, with server-side fallback also in betaADDDIR — A new DirectoryAdded hook fires right after /add-dir or the SDK register_repo_root request registers a working directory mid-sessionMCPERR — Entries skipped by --mcp-config validation now surface as mcp_server_errors in the headless stream-json init event, and terminal runs print a startup warningFANOUT — Concurrently running subagents are now capped at 20 by default, and hitting --max-budget-usd denies new spawns while halting the background agents already runningOPUS5 — Claude Opus 5 ships with a 1M-token context window, 128K max output, thinking on by default, and the same pricing as Opus 4.8TOOLSWAP — Mid-conversation tool changes are in beta: add or remove tools between turns while keeping the prompt cache intact, on Fable 5, Mythos 5, Opus 4.8, and Opus 5FALLBACK — The fallbacks parameter gained a default mode that applies Anthropic's recommended fallback models per refusal category, with server-side fallback also in betaADDDIR — A new DirectoryAdded hook fires right after /add-dir or the SDK register_repo_root request registers a working directory mid-sessionMCPERR — Entries skipped by --mcp-config validation now surface as mcp_server_errors in the headless stream-json init event, and terminal runs print a startup warningFANOUT — Concurrently running subagents are now capped at 20 by default, and hitting --max-budget-usd denies new spawns while halting the background agents already runningOPUS5 — Claude Opus 5 ships with a 1M-token context window, 128K max output, thinking on by default, and the same pricing as Opus 4.8
Articles/Claude Code
Claude Code/2026-06-13Intermediate

When Your Edited SKILL.md Doesn't Take Effect — Hot-Swapping Claude Code Skills with /reload-skills and Auto-Loaded .claude/skills

A practical routine for hot-swapping Claude Code skills without restarts: /reload-skills, SessionStart hooks, and version stamps that show which SKILL.md is live.

Claude Code204Skills7SKILL.md6automation98operations17

One Friday night, I changed a single line in a skill I use for scheduled runs. A small tweak to the log output format, nothing more. The next morning, the logs showed the run had followed the old spec. The file was saved correctly — but Claude Code had been reading "yesterday's SKILL.md."

If you run several automation tasks off SKILL.md files as an indie developer, this "I fixed it but nothing changed" moment happens more often than you would expect. The cause is when skills get loaded, not what you wrote. Recent versions of Claude Code added auto-loading for skills under .claude/skills and a /reload-skills command, which together make restart-free swaps possible. Here is the routine I settled on in day-to-day operation, along with the trap that makes a reload look like it "didn't work."

SKILL.md Is Read at Session Start

A skill lives in a Markdown file, but Claude Code consults that file primarily when a session begins. At startup it builds an index of skill names and descriptions, and then expands the body of a matching skill when a task calls for it — a two-stage process.

That means editing a SKILL.md while a session is running leaves that session's index untouched. From the outside it feels like your file is being ignored; in reality, the session keeps referencing a snapshot it already loaded. This is exactly why a restart "fixes" it.

For the design side of skills themselves, see Claude Code Custom Skill Development Patterns — SKILL.md Design, Testing, and Distribution.

Auto-Loading from .claude/skills Removed the Distribution Step

Skill distribution used to assume a plugin or marketplace flow, which always felt heavyweight for personal working skills. Now, anything placed under a project's .claude/skills directory is auto-loaded with no marketplace involved.

I took this change as a cue to keep the canonical copies of my skills in a Git repository and sync them into each project's .claude/skills. A skill is both a prompt and an operations runbook, and Git's diff history suits that dual nature better than I expected. Simply being able to trace when an instruction changed, and how, cut down the time I spend asking "why did it produce this output?"

What /reload-skills Actually Covers — It Applies from the Next Invocation

To swap a skill without ending the session, run /reload-skills. Edit, reload, and the next invocation uses the new version.

There is one detail the official description won't make obvious. A reload refreshes the skill index and the body that will be expanded next time — but any skill body already expanded earlier in the session stays in context. Reload midway through a long session and you end up with old and new instructions coexisting, with no easy way to tell which one a given output followed.

So my rule is to reload only at task boundaries. Finish the work in flight, run /reload-skills, then start the next piece of work fresh. That single habit has all but eliminated mixed-instruction confusion for me.

Unattended Runs: Pull the Latest via a SessionStart Hook

In unattended setups like scheduled runs, nobody is around to type /reload-skills. This is where the SessionStart hook earns its keep: run your skill sync at session start and return reloadSkills: true from the hook output, and the freshly pulled skills are what gets loaded.

The script below syncs my canonical skills repository before loading:

#!/bin/bash
# .claude/hooks/session-start-sync.sh
# Sync the canonical skills repo before skills are loaded
git -C "$HOME/dev/skills-repo" pull --rebase --quiet
rsync -a --delete "$HOME/dev/skills-repo/skills/" ".claude/skills/"
echo '{"reloadSkills": true}'

Register it in settings.json like this:

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash .claude/hooks/session-start-sync.sh"
          }
        ]
      }
    ]
  }
}

One caveat if you distribute skills through cloud-storage sync: if a session starts before the sync finishes, only the old version exists locally. The hook can only read what is on disk at that moment, so this gap cannot be closed by machinery alone — I catch it with the version-stamp check described next.

For the broader unattended-execution design, see Designing Claude Code Skills for Unattended Runs — Three Patterns That Avoid Permission-Dialog Stalls.

Make the Live Version Visible with a Version Stamp

What truly ended my "I fixed it but nothing changed" episodes wasn't the reload machinery — it was making the live skill version visible in the logs. It takes two steps.

First, put a version stamp in a comment at the top of the SKILL.md:

<!-- version: 2026-06-13.1 -->
# article-publisher

Second, make the first step of the skill's procedure print that line into the run log:

grep -m1 'version:' .claude/skills/article-publisher/SKILL.md

Every run now starts its log with the version it actually executed. When behavior looks stale, check the stamp first: an old stamp means a sync or reload problem, while a new stamp with old behavior means the instructions themselves need work. The triage becomes a straight line. Since adding these two lines, I have never had to guess whether an edit "should have" taken effect.

Your Next Step — Add One Version Line

Before memorizing the mechanics of /reload-skills and SessionStart hooks, make the live version observable. Add a single version line to a SKILL.md you use today and print it in your run logs — the reload timing behavior becomes dramatically easier to watch. For how I decide which skills earn a permanent place in my workflow, see The 5 Criteria I Use When Folding Claude Code Skills into Daily Development. If you run SKILL.md-driven automation of your own, I hope this routine saves you a morning of confusion.

Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

Claude Code2026-06-17
When an Announced Billing Change Gets Paused at the Last Minute: Designing Automation That Doesn't Rush the Cutover
A billing change that was supposed to take effect on June 15 was paused that same day. If your pipeline trusts the announced date, a retraction breaks it twice. Here is a design that decides the cutover from a runtime signal, with implementation code.
Claude Code2026-05-10
Catching Template Phrases Before They Ship: grep Guards in Claude Code SKILL.md
Even with detailed prompt instructions, generating articles every day eventually lets template phrases slip through. I added grep-based guards to the final step of my Claude Code SKILL.md so that violations block the push and force the model to rewrite. Here's what changed after one week.
Claude Code2026-07-27
Whose Environment Expands That Variable? Fingerprinting Your Effective Managed MCP Policy
Variable references in the Managed MCP allowlist and denylist now resolve from the startup environment and the managed-settings env block. I rebuilt both resolution orders locally to see where verdicts diverge, then wrote a preflight check that reduces the effective policy to a comparable fingerprint.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →