Skip to content
Back to skills

Snapshot Protocol

ASecurity

Use when composing a restart snapshot or continuation - snapshot structure, worktree resolution, write rules.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 7, 2026
researchrustgobashgit

Works with

  • cursor
  • terminal

Security analysis

A100/100

Scanned November 7, 2026

npx -y skills add thrum-team/thrum-pro --skill snapshot-protocol --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Snapshot Protocol?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Snapshot Protocol
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/thrum-team-snapshot-protocol/badge)](https://www.skillsdirectory.com/skills/thrum-team-snapshot-protocol)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: snapshot-protocol
description: "Use when composing a restart snapshot or continuation - snapshot structure, worktree resolution, write rules."
---

# Snapshot Composition Protocol
This is the canonical source-of-truth for snapshot composition discipline.
Invoke this skill to compose a snapshot, then take the variant-specific
terminal action.

## Step 1 — Resolve identity and your worktree

```bash
# $REPO must be YOUR worktree — the directory `thrum prime` reads the restart
# snapshot back from. Resolve it ONLY via the daemon's authoritative,
# peercred-resolved identity (`thrum agent worktree --authoritative`) — NEVER
# via `thrum whoami --field worktree` (cwd-resolved) or `git rev-parse
# --show-toplevel` (also cwd-resolved). A cwd-derived pattern
# could silently resolve to a DIFFERENT agent's worktree, or the main repo,
# saving this snapshot where nothing ever reads it back. There is NO git
# fallback — if the daemon can't answer, refuse and stop rather than guess.
REPO=$(
  thrum agent worktree --authoritative 2>/dev/null
) || { echo "ERROR: cannot authoritatively resolve your worktree via the daemon. Refusing to fall back to cwd/git-toplevel — that would risk silently saving this snapshot to the wrong repo. Check daemon connectivity and retry."; exit 1; }
[ -n "$REPO" ] || { echo "ERROR: thrum agent worktree --authoritative returned empty"; exit 1; }
AGENT=$(thrum whoami --field agent_id) || { echo "ERROR: agent not registered"; exit 1; }
[ -n "$AGENT" ] || { echo "ERROR: empty agent_id"; exit 1; }
mkdir -p "${REPO}/.thrum/restart"
```

## Step 2 — Compose your continuation

### Composition discipline (always applies)

Your context is high (or you are preparing to park) and the goal is to preserve
all load-bearing decisions across the session boundary. Write a rich
continuation that future-you will read as the first action after wake.

**§1 of your snapshot is REQUIRED FIRST PROSE.** Write the "Big picture — what
shipped this session" (or, for sleep snapshots, "where work stands at park
time") section BEFORE anything else. Be specific: name the artifacts, the
decisions, the cycles closed. Examples:

> Locked the session-archive spec v2 with §1 Big picture requirement, five
> Q-Spec approvals, and Q-Spec-5 deferred to impl-time. Hand-off pending
> coordinator final review.
>
> Investigated rc.9 inbox-race against <implementer>'s hypothesis: confirmed
> the lock-substrate fence is the right fix. Filed thrum-XXX with 4 BLOCKING
> evidence points.
>
> Closed <epic> brainstormer-third pass. 2 BLOCKING + 5 IMPORTANT + 10 MINOR.
> All three load-bearing traps PASSed. Standing by for <epic> next batch.

This section becomes YOUR OWN log entry, visible in `thrum agent sessions list`
alongside the archives of every other session you've ever restarted from.
Future-you (and other agents inspecting your history) skim §1 to decide which
sessions are worth re-reading. Write it first — before the Resume Plan, before
file paths, before patterns — because composing the §1 summary forces you to
identify what was actually load-bearing about this session, and that priority
shapes everything else you write below it.

**Stamp your snapshot with the base it was authored against.**
Derive and emit the **Authored-against** stamp per
the /thrum:stamp-protocol skill and place it at the very top of your
§1 section (that protocol computes the SHA and merge_target for you — never
hand-type them). This is what lets `thrum prime` diff your snapshot at the next
wake and flag which cited files have MOVED; an unstamped snapshot reads as
"current", indistinguishable from one that never drifted.

Any commit your snapshot names as its own stamped SHA must also be readable
under `stamp-protocol.md`'s "Read-time provenance re-derivation" section
(SHA-resolves, then merge-status) — link to that section rather than restating
its checks here.

**Describe commits, don't claim them.** A snapshot's job is to describe what a
commit's content and effect ARE — that's checkable by anyone re-reading it.
Prohibit first-person narration of git actions in the body of a snapshot:
no "I pushed X", "I fixed Y and verified it", "I ran Z". Write instead:
"commit `<sha>` exists and does `<Y>`" / "`<sha>` addresses `<Y>`". Attribution
of WHO performed a git action already lives in `command.jsonl` / `hooklog.jsonl`
— restating it here would assert authorship the snapshot-writer has typically
never mechanically verified.

After the §1 block:

CRITICAL DISCIPLINE — compose from your own working context only. To preserve
the remaining runway:

- Do NOT dispatch sub-agents (Agent, Explore, etc.)
- Do NOT re-read files you've already read this session
- Do NOT spawn web fetches or external lookups
- Do NOT run lengthy investigations (git log spelunking, codebase searches,
  multi-file grep walks)

Each of those costs context you don't have to spend, and the cost compounds — a
sub-agent that returns 6K tokens of summary doesn't just cost the dispatch, it
pollutes the dying session further. If a fact isn't already in your working
context, label it "unknown" or "verify post-restart" rather than fetching it
now. Trust your in-context state.

Write for a competent stranger in your role — someone who has the runtime
briefing (`thrum prime`, role preamble, project state) but none of this
session's conversation context. Refer to the previous session in third person.

### Structure (16 sections)

Every variant uses this structure.

Numbered `§1.` through `§16.`. Each section names a concern; write as prose, a table, or omit with an explicit
"N/A: <reason>" rather than skipping silently.

```text
§1.  Header block — author / date / restart reason / restart-you mandate / context-percent at write time
§2.  Identity — agent_id / worktree path / branch / role / coordinator name / cut-point commit SHA
§3.  Big picture — what shipped this session  [REQUIRED FIRST PROSE]
§4.  Mission state — where this work currently sits in its pipeline
§5.  Locked design decisions — operator-LOCKs, design-fork resolutions, with rationale
§6.  Open L-questions parked for the operator — or "NONE: <reason>" with explicit note
§7.  Wire contracts — durable technical reference (types, signatures, file:line cites)
§8.  Capability matrix — per-surface contracts (row-by-row table for fanout work; OMIT if N/A)
§9.  Design inventory — locked taxonomy (entanglement classes, patterns, anti-patterns; OMIT if N/A)
§10. Cycle history — review cycles run, findings, fold record (OMIT if pre-review-phase)
§11. Pipeline state — DAG of artifacts (brainstorm → plan → impl → review) with current cursor
§12. Pre-restart artifacts on disk — durable handoff manifest (table: artifact / path / status)
§13. Anticipated Q&A — questions restart-you or downstream implementer will ask, pre-answered
§14. References — bd IDs, commit anchors, memories, file paths, message IDs (load-bearing for transcript recon)
§15. Honest unknowns — verify post-restart, do NOT fabricate
§16. Restart-you's immediate next actions — numbered; step 1 actionable from cold start
```

**Per-section guidance:**

- **§1 Header.** Top of file. Author (agent_id), date, restart reason (1-line
  trigger), one-sentence mandate to restart-you ("read this in full, then [N
  specific actions]"), context-% at write time. Read-first prominence.
- **§2 Identity.** `agent_id` / worktree absolute path / branch / role /
  coordinator name / cut-point commit SHA for any line cites that follow.
  Mechanical; lets a totally cold restart-you orient before reading any prose.
- **§3 Big picture.** REQUIRED FIRST PROSE. 1–3 sentences summarizing what the
  session accomplished. Specific: artifacts, decisions, cycles closed. Becomes
  the session-archive log entry. Write this BEFORE anything else (composing §3
  forces you to identify what was load-bearing, which shapes what you write
  below). **Sleep variant:** for `/thrum:sleep`, §3
  frames as "where work stands at park time" rather than "what shipped" — the
  agent is parking, not completing. Composition discipline (1–3 sentences,
  specific, load-bearing-first) is identical.
- **§4 Mission state.** Where this work sits in its pipeline. Not the pipeline
  DAG itself (that's §11) — the narrative status.
- **§5 Locked design decisions.** Each LOCK gets a line: decision + the
  operator's wording (when applicable) + rationale.
- **§6 Open L-questions.** Numbered Q-list with researcher recommendations. OR
  "NONE: all locked per <evidence>" with the evidence cited.
- **§7 Wire contracts.** Durable technical reference — types, function
  signatures, struct field lists, file:line cites. Cut from the live tree at
  §2's cut-point SHA. **Format:** use fenced code blocks for type signatures and
  struct fields; use inline `file:line` citations anchored to §2's cut-point SHA
  so future-you can `git show <SHA>:<file>` to reproduce.
- **§8 Capability matrix.** Row-by-row table when work fans out across N call
  sites / migration surfaces / per-symbol concerns. **OMIT criterion:** OMIT
  when work is single-call-site or single-surface. **REQUIRED criterion:**
  required when the session covered changes across ≥2 independent call sites /
  migration surfaces / per-symbol concerns. When in doubt, include — a one-row
  table is cheaper than a missing one.
- **§9 Design inventory.** Locked taxonomy: entanglement classes, pattern
  catalogue, anti-patterns. **OMIT criterion:** OMIT when the work hasn't yet
  developed a stable design grammar. **REQUIRED criterion:** required when ≥3
  named classes or patterns recur in the session's decisions.
- **§10 Cycle history.** Review cycles run, findings (BLOCKING / IMPORTANT /
  MINOR counts), fold record, verify-before-fold spot-checks. **OMIT
  criterion:** OMIT when the snapshot is written before any review cycle has
  run. **REQUIRED criterion:** required after the first dual-review cycle
  closes.
- **§11 Pipeline state.** DAG of artifacts (brainstorm → plan → impl → review)
  with current cursor position. ASCII tree or table.
- **§12 Pre-restart artifacts.** Manifest table: each durable artifact's path +
  status. Lets restart-you spot-check all artifacts exist before acting.
- **§13 Anticipated Q&A.** Pre-answer questions restart-you or downstream
  implementer will ask. Format: Q (bold) + A (short). Answers cite live code so
  downstream agents don't re-derive.
- **§14 References.** Load-bearing index: bd IDs (with one-line state), commit
  anchors (with SHA + one-line claim), memory keys (with rationale for
  relevance), file paths grouped by purpose, critical message IDs (for
  transcript reconstruction).
- **§15 Honest unknowns.** List facts you suspect changed during the session OR
  were never confirmed. Future-you must NOT carry these forward as truth until
  verified.
- **§16 Restart-you's immediate next actions.** Numbered. Step 1 actionable from
  cold start.

## Step 3 — Write the continuation directly to your restart file

Use your Write tool to save the composed continuation to:

```text
${REPO}/.thrum/restart/${AGENT}.md
```

`thrum prime` will auto-inject this file at next session start (whether wake
comes from `thrum tmux restart` or `thrum tmux create`). No bash heredoc or
`cat <<EOF` redirection is needed — write the file directly.

Variants that have a verify step (`/thrum:compact`, `/thrum:restart`) mint a `SNAPSHOT_PATH` and
`SNAPSHOT_NONCE` in their own Step 3 PREP block: write to exactly that path, end
the file with `<!-- snapshot-nonce: <nonce> -->`, and record both for the verify
block. The sleep variants have no verify block and need no nonce.

After writing, return control to your variant skill (`/thrum:restart` or `/thrum:sleep`) for the terminal action.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.