CLAUDE LABJP
MEMORY — Claude Code closes a cluster of long-session memory leaks, including MCP stdio stderr piling up to 64 MB per server and LSP documents staying open indefinitelyTABLES — Very large markdown tables no longer stall rendering; tables over 200 rows now show the first 200 with a "… N more rows" noticeSPEED — Sessions carrying many deny/ask permission rules no longer lose seconds every turn: rule matchers are compiled once and cachedTOOLS — print/SDK sessions with many MCP tools get up to 7x faster tool rounds thanks to cached tool-pool assemblyARTIFACTS — Claude Code Artifacts turn session work into live, shareable web pages that update in place — useful for PR walkthroughs and dashboardsDEADLINE — Opus 4.7 fast mode is removed on July 24; speed: "fast" will error, so move to Opus 4.8 fast mode before thenMEMORY — Claude Code closes a cluster of long-session memory leaks, including MCP stdio stderr piling up to 64 MB per server and LSP documents staying open indefinitelyTABLES — Very large markdown tables no longer stall rendering; tables over 200 rows now show the first 200 with a "… N more rows" noticeSPEED — Sessions carrying many deny/ask permission rules no longer lose seconds every turn: rule matchers are compiled once and cachedTOOLS — print/SDK sessions with many MCP tools get up to 7x faster tool rounds thanks to cached tool-pool assemblyARTIFACTS — Claude Code Artifacts turn session work into live, shareable web pages that update in place — useful for PR walkthroughs and dashboardsDEADLINE — Opus 4.7 fast mode is removed on July 24; speed: "fast" will error, so move to Opus 4.8 fast mode before then
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 Code193Skills7SKILL.md6automation93operations15

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-14
An Empty Variable and rm -rf: How Claude Code's Auto Mode Preflight Saved My Late-Night Cleanup
One night I let Claude Code sweep the build caches out of several app repositories at once, and an empty variable nearly turned a targeted cleanup into a wide delete. Here is the field record of being saved by auto mode's rm -rf preflight, and the confirmation rules I built afterward.
📚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 →