Shutting Down the Current Persona
Overview
A persona is armed by pasting a role-scoped prompt into a fresh session; the session
then self-paces with /loop. Standing it down is the inverse: get everything back
onto disk and into git, then stop. The session's chat context is the only thing
allowed to die.
Survives a shutdown: the prompt file (with a fresh CURRENT STATE block), the bus,
the journal, the comm ack, committed branches and recorded worktrees. Does not
survive: the loop, Monitor tasks, crons, and everything this session knew but never
wrote down.
This skill stands down the persona armed in the session running it — one session,
one role. It does not retire the persona: pasting the prompt into a fresh session
re-arms it. Setting a loop up is setting-up-persona-loops.
When to Use
- The user wants to close this session — machine going down, done for the day, or
the session is being moved to another checkout or model tier.
- Context is nearly exhausted and the clean move is a handover to a successor session
rather than dying mid-item.
- A session is wedged and will be replaced.
Not for: retiring a persona permanently (a to-user proposal, then a removal — see
setting-up-persona-loops), or a momentary pause (just let the loop wake).
The Rule
A stood-down session must be indistinguishable from one that never ran, except for
what it wrote down. Every claimed item is closed or parked, every session-only thing
is recorded with the exact invocation that re-arms it, every commit is pushed, and
CURRENT STATE answers what the successor's first wake will ask.
Shutdown is a stop, not a sprint. It starts no work, deploys nothing, and decides
nothing an open item left open.
Sequence
Work the checklist in references/shutdown-checklist.md — it carries the exact
commands and the three templates (parked-item note, CURRENT STATE block, journal
entry). Order matters; the first step is what makes the rest safe.
- Stop the clock, then freeze intake. End the loop by the mechanism that started
it, delete this session's cron and any Monitor task it armed, and copy each exact
invocation into RE-ARM before deleting it. Leave your heartbeat file where it
is — an absent heartbeat means "never looped", the worst state in the liveness
taxonomy, and deleting it makes a clean stand-down look like the failure the pod
watches hardest for. From here on claim nothing new: a wake that fires mid-drain
re-claims an item and undoes the work you just did.
- Take stock in one pass. Sync fast-forward-only (
git fetch -q origin && git merge --ff-only origin/main — never pull --rebase in a shared checkout), read
the comm (the shutdown order may already be there, and a neighbour may have
posted something you must answer before going), then list: items addressed to your
role with status: in-progress, live worktrees and branches, uncommitted work of
your own, unpushed commits, open soaks with their T0, active incidents.
- Finish only what is near-done (definition below). One pass. Anything that does
not close in it gets parked.
- Park the rest.
status: todo plus a dated note saying exactly where the work
got to, what was verified, the branch and sha, and what comes next. Commit it.
Never leave an item in-progress: a successor cannot tell that apart from a session
that died, and at 24 h it is filed as an ops-issue.
- Leave the workspace resumable. Every live worktree is either removed (its work
merged and verified) or recorded — path, branch, last commit, whether tests were
green. Uncommitted work in a worktree gets a wip commit on its branch or the
successor loses it. Never delete a worktree holding unmerged work.
- Write the handover into the prompt file. A new
## CURRENT STATE (<date time TZ>) block on top, the previous one moved under ## Previous state. Chat does not
survive this session; the prompt file is the only channel to the successor. Pay the
prompt debt here too: any rule this session learned goes in dated, with its cause.
- Journal the stand-down — append-only, your own section in the day-file: when you
stood down, why, what was left open.
- Commit, push, and tell the pod. Commit named paths only (
git commit -m … -- <file> <file>; a directory pathspec sweeps a neighbour's in-flight work) and
push — an unpushed commit is invisible to every other session. Then post
ack: <role> stood down at <HH:MM> to the comm: that entry is what stops a live
neighbour from reading your freezing heartbeat as a crash. Operator: you go last
— collect the others' acks first, file what nobody could close, then post
note: pod down.
- Name the gap out loud. Say which env is unmonitored from what time, what no
longer self-heals, and what the user should watch. For a user-facing or prod env,
file a
to-user ops-issue as well. Whether to accept the gap or hand it to
another live session is the user's call, not yours.
- Verify, then declare. Run the verification commands and show their output: no
in-progress items addressed to your role, clean git status in your pathspecs,
empty git log origin/<branch>..HEAD, git worktree list matching CURRENT STATE. Only then tell the user it is safe to close. Evidence before the claim.
What "near-done" means
An item is near-done only when the work is already verified and what remains is
bookkeeping: merge a branch that already passed its whole-branch review, write the
## Outcome, git mv to done/, file the follow-up item to the next role.
It is not near-done — park it — if closing it would need any of: writing or
continuing implementation, running a review, a deploy, restart, promotion or any other
env action, a soak, or a judgment the item itself does not already settle. Ambiguity
fails closed here exactly as it does in the loop: park with the question, never guess
to tidy up.
The ceiling is one pass and no new implementation subagents (a verification run is
fine). A shutdown that starts shipping is how a session that was five minutes from
closing spends an hour and dies mid-merge anyway.
Quick Reference
| Thing |
Must end up |
Never |
| Item you claimed |
done/ with an Outcome, or todo with a dated parked note |
left in-progress |
| Loop, Monitor, cron |
stopped/deleted, exact invocation copied into RE-ARM |
stopped silently, or left running against a dead session |
| Worktree with unmerged work |
recorded in CURRENT STATE (path, branch, last commit, test state) |
deleted, or left with uncommitted changes |
| What you learned today |
a dated rule in the prompt file |
in the chat transcript |
| Deployed sha, open soak, incident |
the new CURRENT STATE block |
in your head |
| Any commit |
pushed, named paths only |
git add -A, a directory pathspec, commit -a |
| Your heartbeat file |
left in place to go stale, explained by your comm ack |
deleted — that reads as "never looped" |
| The fact that you stopped |
an ack: <role> stood down in the comm |
silence, and a neighbour filing you as down |
| An env losing its monitor |
said out loud, plus a to-user ops-issue if user-facing |
assumed the user knows |
| "Safe to close" |
after the verification commands, quoting their output |
as the first sentence |
Common Mistakes
- Draining before stopping the loop — the next wake fires mid-shutdown, claims a
fresh item, and the session you just tidied is dirty again. Stop the clock first.
- Recording state in the final chat message — the successor never sees chat. If it
is not in the prompt file, the bus, or the journal, it does not exist.
- Leaving an item
in-progress "because it's nearly done" — nearly done and parked
is a handover; nearly done and claimed is a mystery that gets flagged as a dead
session.
- Committing without pushing — invisible to every other persona, and lost with the
machine.
- Disarming a Monitor without saving its invocation — the successor rebuilds it
from prose and reintroduces the false alerts the checked-in script exists to prevent.
- "Finishing" something that needed a decision — a shutdown is the worst moment to
choose an interpretation. Park it with the question.
- Deleting a worktree to leave things clean — clean is not the goal; resumable is.
Unmerged work is deleted only by the session that decides to abandon it.
- A CURRENT STATE block with no timezone, or appended at the bottom — blocks are
newest-first and dated with a TZ; a successor that tails the file misses same-day
entries.
- Silent about the gap — the loop's whole value is that something is watching. The
moment it stops, say so, with the time.
- Deleting the heartbeat to tidy up — absent and stale are different failures and
the pod treats absent as the worse one, reported at once with no second test. A
stood-down session leaves a stale heartbeat and an ack; it never leaves a hole.
- Syncing with
pull --rebase — in a shared checkout it refuses on any dirty
file, which is the normal state, so the sync silently does not happen and you stand
down against a stale tree. fetch + merge --ff-only.
- Declaring "safe to close" unverified — the one claim in this whole procedure the
user acts on directly. Quote the commands and their output.
1---2name: shutting-down-current-persona3description: Use when standing down the persona armed in the current Claude Code session so the session can be closed safely — ending its /loop, closing or parking claimed work items, recording what must be re-armed, and writing the handover into the prompt file. Triggers on "shut down this persona", "I want to close this session", "stop the loop and hand over", a session running out of context, or a persona being re-armed elsewhere.4---56# Shutting Down the Current Persona78## Overview910A persona is armed by pasting a role-scoped prompt into a fresh session; the session11then self-paces with `/loop`. Standing it down is the inverse: **get everything back12onto disk and into git, then stop.** The session's chat context is the only thing13allowed to die.1415Survives a shutdown: the prompt file (with a fresh `CURRENT STATE` block), the bus,16the journal, the comm ack, committed branches and recorded worktrees. Does not17survive: the loop, Monitor tasks, crons, and everything this session knew but never18wrote down.1920This skill stands down **the persona armed in the session running it** — one session,21one role. It does not retire the persona: pasting the prompt into a fresh session22re-arms it. Setting a loop up is `setting-up-persona-loops`.2324## When to Use2526- The user wants to close this session — machine going down, done for the day, or27 the session is being moved to another checkout or model tier.28- Context is nearly exhausted and the clean move is a handover to a successor session29 rather than dying mid-item.30- A session is wedged and will be replaced.3132Not for: retiring a persona permanently (a `to-user` proposal, then a removal — see33`setting-up-persona-loops`), or a momentary pause (just let the loop wake).3435## The Rule3637**A stood-down session must be indistinguishable from one that never ran, except for38what it wrote down.** Every claimed item is closed or parked, every session-only thing39is recorded with the exact invocation that re-arms it, every commit is pushed, and40`CURRENT STATE` answers what the successor's first wake will ask.4142Shutdown is a *stop*, not a sprint. It starts no work, deploys nothing, and decides43nothing an open item left open.4445## Sequence4647Work the checklist in `references/shutdown-checklist.md` — it carries the exact48commands and the three templates (parked-item note, `CURRENT STATE` block, journal49entry). Order matters; the first step is what makes the rest safe.50511. **Stop the clock, then freeze intake.** End the loop by the mechanism that started52 it, delete this session's cron and any Monitor task it armed, and **copy each exact53 invocation into RE-ARM before deleting it**. **Leave your heartbeat file where it54 is** — an absent heartbeat means "never looped", the worst state in the liveness55 taxonomy, and deleting it makes a clean stand-down look like the failure the pod56 watches hardest for. From here on claim nothing new: a wake that fires mid-drain57 re-claims an item and undoes the work you just did.582. **Take stock in one pass.** Sync fast-forward-only (`git fetch -q origin && git59 merge --ff-only origin/main` — never `pull --rebase` in a shared checkout), read60 the comm (the `shutdown` order may already be there, and a neighbour may have61 posted something you must answer before going), then list: items addressed to your62 role with `status: in-progress`, live worktrees and branches, uncommitted work of63 your own, unpushed commits, open soaks with their T0, active incidents.643. **Finish only what is near-done** (definition below). One pass. Anything that does65 not close in it gets parked.664. **Park the rest.** `status: todo` plus a dated note saying exactly where the work67 got to, what was verified, the branch and sha, and what comes next. Commit it.68 Never leave an item `in-progress`: a successor cannot tell that apart from a session69 that died, and at 24 h it is filed as an `ops-issue`.705. **Leave the workspace resumable.** Every live worktree is either removed (its work71 merged and verified) or recorded — path, branch, last commit, whether tests were72 green. Uncommitted work in a worktree gets a wip commit on its branch or the73 successor loses it. Never delete a worktree holding unmerged work.746. **Write the handover into the prompt file.** A new `## CURRENT STATE (<date time75 TZ>)` block on top, the previous one moved under `## Previous state`. Chat does not76 survive this session; the prompt file is the only channel to the successor. Pay the77 prompt debt here too: any rule this session learned goes in dated, with its cause.787. **Journal the stand-down** — append-only, your own section in the day-file: when you79 stood down, why, what was left open.808. **Commit, push, and tell the pod.** Commit **named paths only** (`git commit -m …81 -- <file> <file>`; a directory pathspec sweeps a neighbour's in-flight work) and82 push — an unpushed commit is invisible to every other session. Then post83 `ack: <role> stood down at <HH:MM>` to the comm: that entry is what stops a live84 neighbour from reading your freezing heartbeat as a crash. <Operator:> you go last85 — collect the others' acks first, file what nobody could close, then post86 `note: pod down`.879. **Name the gap out loud.** Say which env is unmonitored from what time, what no88 longer self-heals, and what the user should watch. For a user-facing or prod env,89 file a `to-user` `ops-issue` as well. Whether to accept the gap or hand it to90 another live session is the user's call, not yours.9110. **Verify, then declare.** Run the verification commands and show their output: no92 `in-progress` items addressed to your role, clean `git status` in your pathspecs,93 empty `git log origin/<branch>..HEAD`, `git worktree list` matching `CURRENT94 STATE`. Only then tell the user it is safe to close. Evidence before the claim.9596## What "near-done" means9798An item is near-done only when **the work is already verified and what remains is99bookkeeping**: merge a branch that already passed its whole-branch review, write the100`## Outcome`, `git mv` to `done/`, file the follow-up item to the next role.101102It is *not* near-done — park it — if closing it would need any of: writing or103continuing implementation, running a review, a deploy, restart, promotion or any other104env action, a soak, or a judgment the item itself does not already settle. Ambiguity105fails closed here exactly as it does in the loop: park with the question, never guess106to tidy up.107108The ceiling is one pass and no new implementation subagents (a verification run is109fine). A shutdown that starts shipping is how a session that was five minutes from110closing spends an hour and dies mid-merge anyway.111112## Quick Reference113114| Thing | Must end up | Never |115|---|---|---|116| Item you claimed | `done/` with an Outcome, or `todo` with a dated parked note | left `in-progress` |117| Loop, Monitor, cron | stopped/deleted, exact invocation copied into RE-ARM | stopped silently, or left running against a dead session |118| Worktree with unmerged work | recorded in CURRENT STATE (path, branch, last commit, test state) | deleted, or left with uncommitted changes |119| What you learned today | a dated rule in the prompt file | in the chat transcript |120| Deployed sha, open soak, incident | the new CURRENT STATE block | in your head |121| Any commit | pushed, named paths only | `git add -A`, a directory pathspec, `commit -a` |122| Your heartbeat file | left in place to go stale, explained by your comm ack | deleted — that reads as "never looped" |123| The fact that you stopped | an `ack: <role> stood down` in the comm | silence, and a neighbour filing you as `down` |124| An env losing its monitor | said out loud, plus a `to-user` ops-issue if user-facing | assumed the user knows |125| "Safe to close" | after the verification commands, quoting their output | as the first sentence |126127## Common Mistakes128129- **Draining before stopping the loop** — the next wake fires mid-shutdown, claims a130 fresh item, and the session you just tidied is dirty again. Stop the clock first.131- **Recording state in the final chat message** — the successor never sees chat. If it132 is not in the prompt file, the bus, or the journal, it does not exist.133- **Leaving an item `in-progress` "because it's nearly done"** — nearly done and parked134 is a handover; nearly done and claimed is a mystery that gets flagged as a dead135 session.136- **Committing without pushing** — invisible to every other persona, and lost with the137 machine.138- **Disarming a Monitor without saving its invocation** — the successor rebuilds it139 from prose and reintroduces the false alerts the checked-in script exists to prevent.140- **"Finishing" something that needed a decision** — a shutdown is the worst moment to141 choose an interpretation. Park it with the question.142- **Deleting a worktree to leave things clean** — clean is not the goal; resumable is.143 Unmerged work is deleted only by the session that decides to abandon it.144- **A CURRENT STATE block with no timezone, or appended at the bottom** — blocks are145 newest-first and dated with a TZ; a successor that tails the file misses same-day146 entries.147- **Silent about the gap** — the loop's whole value is that something is watching. The148 moment it stops, say so, with the time.149- **Deleting the heartbeat to tidy up** — absent and stale are different failures and150 the pod treats absent as the worse one, reported at once with no second test. A151 stood-down session leaves a stale heartbeat and an ack; it never leaves a hole.152- **Syncing with `pull --rebase`** — in a shared checkout it refuses on any dirty153 file, which is the normal state, so the sync silently does not happen and you stand154 down against a stale tree. `fetch` + `merge --ff-only`.155- **Declaring "safe to close" unverified** — the one claim in this whole procedure the156 user acts on directly. Quote the commands and their output.