spec-stash · git:20260910.a57f970 · 2026-09-10 · sha256 5dacf73ccd5ed2e1

spec-stash git:20260910.a57f970A

Immutable. This exact content is served forever at /api/v1/blob/5dacf73ccd5ed2e1.

---
name: spec-stash
description: Parks a change deliberately — writes a .paused marker (date + reason) so it stops counting as active and status shows it as set aside, with every artifact (ledger, index, proposal) staying warm for $spec-resume. Optional bookkeeping, not a switching ritual — switching lives in $spec-resume <name>. Refuses on a running $spec-loop change.
---
<!-- GENERATED from core/commands/stash.md — edit the core file and run node tools/generate.mjs; hand edits will be overwritten -->

# $spec-stash

Reason (optional): $ARGUMENTS

Parks a change **deliberately, with a recorded reason** — the directory stays in place with every artifact intact; gates and the Stop reminder skip `.paused` dirs, and `$spec-status` lists it as set aside instead of active. Parking is bookkeeping, not a prerequisite for working on something else: active changes coexist freely, and switching between them is `$spec-resume <name>` (the current pointer). Park what you want visibly shelved; resume anytime — the ledger's V-N history, the index, and the proposal come back exactly as left.

Unlike `git stash`, this touches **no source code and no git state** — it only marks the spec change directory as set aside. Uncommitted code changes stay exactly where they are.

## Process

1. **Identify the target**: the current change (`spec/changes/.current`) when set; else the single active change; multiple without a pointer → ask which. None → report "nothing to stash".
2. **Refuse on a running loop**: if the target has `loop.md` with `status: running`, refuse — the Stop-driver is bounded by ledger state and ignores markers; stashing under it would desync the two. Finish or let the loop's fuses end it first.
3. **Write the marker** `spec/changes/<name>/.paused` (the marker filename is a hook contract — it stays `.paused`), one line:
   ```
   paused: <YYYY-MM-DD> | reason: <the user's stated reason, or "user request">
   ```
4. **Pointer upkeep**: the stashed change was the current pointer's target → delete `spec/changes/.current` (other actives remain → recommend the next `$spec-resume <name>` target per SKILL § Gate-aware next steps).
5. **Report**: `$spec-status` will show this change as parked with the date + reason; `$spec-resume <name>` brings it back; archiving a parked change directly (without resuming) stays legal.

## What it does NOT do

- Does not archive, commit, or touch any artifact other than creating `.paused`
- Does not stash $spec-loop changes (step 2)
- Does not stack: stashing an already-stashed change is a no-op (report it)