CLAUDE LABJP
2.1.278 — The auto mode classifier now runs server-side by default on the Claude API, Enterprise, Bedrock, Vertex and Foundry. You are not billed for the classifier, and /status gained an Auto mode server lineTASKOUT — The TaskOutput tool is gone. taskOutputMaxChars and TASK_MAX_OUTPUT_LENGTH no longer do anything, and background output is read with Read instead10/07 — The old management-configuration key spellings are accepted until noon PT on October 7, seventeen days from now. After that, entries that still use them stop working until you rewrite themBUNPANIC — Reports are coming in of the newest build crashing on launch alone. Earlier builds still run on the same machine, which points at the release rather than the environmentNEW — Deciding what belongs in Cowork and what belongs in Claude Code, using the approval boundary as the lineSONNET4.5 — A date in a deprecation table is a floor, not an end date. Sonnet 4.5 is still active and no deprecation notice has been posted2.1.278 — The auto mode classifier now runs server-side by default on the Claude API, Enterprise, Bedrock, Vertex and Foundry. You are not billed for the classifier, and /status gained an Auto mode server lineTASKOUT — The TaskOutput tool is gone. taskOutputMaxChars and TASK_MAX_OUTPUT_LENGTH no longer do anything, and background output is read with Read instead10/07 — The old management-configuration key spellings are accepted until noon PT on October 7, seventeen days from now. After that, entries that still use them stop working until you rewrite themBUNPANIC — Reports are coming in of the newest build crashing on launch alone. Earlier builds still run on the same machine, which points at the release rather than the environmentNEW — Deciding what belongs in Cowork and what belongs in Claude Code, using the approval boundary as the lineSONNET4.5 — A date in a deprecation table is a floor, not an end date. Sonnet 4.5 is still active and no deprecation notice has been posted
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 Code255Skills7SKILL.md7automation110operations29

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 $15 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-08-31
Half of My Scheduled Runs Vanished Without a Single Error
A batch job set to run twice a day was only firing once. No errors, no failure alerts. Here is how to expand your own schedule, count expected runs, and reconcile them against execution records to catch silent misses.
Claude Code2026-08-25
One Space in a Folder Name Turned 80 Checks Into Zero
An inspection loop reported 80 files checked and 0 readable. The files were fine. Here is how word splitting turns path fragments into real directories, measured side by side, plus the count assertion I now put in front of every delete-heavy batch.
Claude Code2026-08-04
Tightening Filesystem Isolation Separately from the Network — Collect the Paths, Then Squeeze the Write Surface
Claude Code v2.1.216 lets you control filesystem isolation independently from network isolation. Before tightening anything, I traced what a real job actually touches, split reads from writes, and measured how stable the path set is across repeated runs. The numbers changed how I wrote the allowlist.
📚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