freeze
The facts
Its description
Restrict file edits to a specific directory for the session. (gstack) Triggers: freeze edits to directory; lock editing scope; restrict file changes
The description the agent reads to decide when to use it. Phrases the author says should start it.
When it starts
A person asks to lock down where the agent is allowed to edit — restricting file changes to one directory for the rest of the session. The name and description alone ("Restrict file edits to a specific directory for the session") are what surface it, and the skill then asks the user which path to use.
Things a person might say (the model's guesses)
- “Freeze edits to the src/ directory”
- “Lock my editing scope to packages/api for this session”
- “Restrict file changes so nothing outside docs/ can be touched”
A model's summary of when it is used.
Tools it may use, or may not
allowed-tools: Bash, Read, AskUserQuestion
Tools it may use while it runs without asking you first.
Runs scripts
bin/gstack-paths, bin/freeze-state.sh
Scripts the text names. Found by matching words, so treat them as pointers.
Stops for a person
2 lines stop to ask a person
Lines that stop and wait for a person before going on. Found by matching words, so treat them as pointers.
Runs automatically at certain moments
Runs commands automatically at set moments
Hooks run commands at moments such as before a tool is used. The linked line shows them as written.
What it leads to
Other skills this one hands off to, calls, requires or offers instead, as a model read them.
What leads to it
- gstack hands off to this PROACTIVE all, or user names it gstack, line 223
- unfreeze hands off to this unfreeze, line 36
- guard calls this guard, line 47
Other skills that hand off to this one, call it, require it or offer it instead, as a model read them.
Licence
MIT, from LICENSE
The terms its author shares it under, which let it be shown here.
Other settings
version: 0.1.0
More settings at the top of the file, shown as written.
Other files in this skill (2) Close
The text
Most marks come from matching words in the file, so treat them as pointers.
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly --> <!-- Regenerate: bun run gen:skill-docs -->
/freeze — Restrict Edits to a Directory
Lock file edits to a specific directory. Any Edit, Write or NotebookEdit operation targeting a file outside the allowed path will be blocked (not just warned).
GSTACK_STATE_ROOT=$(~/.claude/skills/gstack/bin/gstack-paths --get GSTACK_STATE_ROOT); : "${GSTACK_STATE_ROOT:?gstack-paths failed; reinstall with ./setup or /gstack-upgrade}"
mkdir -p "$GSTACK_STATE_ROOT"/analytics
echo '{"skill":"freeze","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$GSTACK_STATE_ROOT"/analytics/skill-usage.jsonl 2>/dev/null || trueRaw lines 1 to 45Setup
Ask the user which directory to restrict edits to. Use AskUserQuestion:
- Question: "Which directory should I restrict edits to? Files outside this path will be blocked from editing."
- Text input (not multiple choice) — the user types a path.
Once the user provides a directory path:
Set the user-selected boundary with the shared state writer. It resolves the physical absolute path and serializes replacement with investigation cleanup:
bash "$HOME/.claude/skills/gstack/freeze/bin/freeze-state.sh" set "<user-provided-path>"Only report success if the helper succeeds. On FREEZE_BUSY or unexpected state, preserve it and ask the user to inspect recovery after any active writer finishes; never write or delete the state file directly.
Tell the user: "Edits are now restricted to <path>/. Any Edit, Write or NotebookEdit outside this directory will be blocked. To change the boundary, run /freeze again. To remove it, run /unfreeze."
How it works
The hook reads file_path from the Edit/Write tool input JSON, or notebook_path from a NotebookEdit (Jupyter notebook) call (shared real-JSON extractor with /careful — one copy, sourced by both hooks), then checks whether the path starts with the freeze directory. If not, it returns a hookSpecificOutput payload with permissionDecision: "deny" to block the operation (nested under hookSpecificOutput — Claude Code ignores a top-level permissionDecision).
Polarity is fail-closed: a tool payload the hook cannot parse is DENIED, not allowed — a boundary that fails open is not a boundary. A payload that parses but has neither path field (a non-file tool) is allowed. A deny names the tool, the path field, the boundary and /unfreeze. The path is resolved before the check: ~, .. and relative paths, and symlinks at every depth, even through folders that do not exist yet. A path the hook cannot place (a symlink loop, a line break, a Windows drive-relative path, over 4096 characters) is denied.
The freeze boundary persists until explicitly removed via the state file. The hook script reads it on every Edit/Write/NotebookEdit invocation. Boundaries containing spaces are supported.
Raw lines 66 to 88Notes
- The trailing
/on the freeze directory prevents/srcfrom matching/src-old - Freeze applies to Edit, Write and NotebookEdit only — Read, Bash, PowerShell, Glob, Grep are unaffected
- This prevents accidental edits, not a security boundary — Bash or PowerShell commands like
sedorSet-Contentcan still modify files outside the boundary - To deactivate, run
/unfreeze; ending or killing a conversation does not remove persisted state
From garrytan/gstack at 3f79d81, 2026-11-01. Skills read by DeepSeek V4.1 Flash on 2026-11-04. Summary and techniques by Claude Opus 5.5 on 2026-11-06.