handoff — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited handoff (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Two commands for seamless session continuity:
/handoff save — End of session: generate a compact JSON handoff/handoff save --dry-run — Preview the handoff without saving/handoff load — Start of session: resume from handoff/execution-handoff.json/handoff load path/to/handoff.json — Load from a custom pathCreate a strict execution handoff as valid JSON. The goal is a compact, high-signal document that lets a fresh Claude Code session continue this work with minimal token waste and zero re-exploration.
Before writing anything, gather the actual state. Run these in parallel:
# Git state
git branch --show-current
git status --short
git stash list
git log --oneline -10
git diff --stat HEADThis data feeds directly into the handoff — the next session needs to know what branch it's on, whether there are uncommitted changes, and what the recent history looks like.
Scan the current conversation for:
Separate signal from noise. Brainstorming ideas that were rejected, repeated attempts at the same fix, exploratory reads that led nowhere — these are noise. Only keep what the next session needs to execute correctly.
Use exactly this schema:
{
"handoff_metadata": {
"created_at": "ISO 8601 timestamp",
"branch": "current git branch",
"uncommitted_changes": ["list of files with uncommitted changes"],
"last_commit": "short hash + message of last commit"
},
"objective": "string — the real end goal in one sentence",
"summary": "string — short high-signal summary of current situation, 2-3 sentences max",
"current_state": {
"done": ["string — completed items, be specific about what was done and where"],
"partial": ["string — in-progress items with clear description of what remains"],
"not_started": ["string — items that still need to be done"]
},
"modified_files": [
{
"file": "relative/path/to/file.py",
"changes": "brief description of what changed"
}
],
"architecture_decisions": [
{
"decision": "string — what was decided",
"reason": "string — why this approach was chosen",
"must_preserve": true
}
],
"important_context": [
"string — only context needed for correct execution, not general knowledge"
],
"similar_bugs_or_earlier_fixes": [
{
"issue": "string — what went wrong",
"fix_or_learning": "string — how it was resolved or what was learned"
}
],
"ordered_execution_plan": [
{
"step_id": 1,
"title": "string — short action title",
"goal": "string — what this step achieves",
"depends_on": [],
"files": ["list of files this step touches"],
"notes": "string — implementation hints, gotchas, or constraints"
}
],
"risks": [
{
"risk": "string — what could go wrong",
"impact": "string — consequences",
"prevention": "string — how to avoid it"
}
],
"progress_log": [
{
"status": "done | partial | pending",
"item": "string — what was done",
"notes": "string — relevant details"
}
],
"next_session_rules": [
"string — execution rules for the next session"
],
"starter_prompt": "string — one concise prompt for the next session that tells Claude exactly how to continue"
}Before saving, verify:
python -c "import json; json.load(open('...'))" after savingordered_execution_plan should be directly executable, not analyticalmodified_files actually existCreate the handoff directory if needed and save:
mkdir -p handoffSave to handoff/execution-handoff.json.
Validate after saving:
python -c "import json; data=json.load(open('handoff/execution-handoff.json')); print(f'Valid JSON: {len(data[\"ordered_execution_plan\"])} steps, {len(data[\"current_state\"][\"done\"])} done, {len(data[\"current_state\"][\"not_started\"])} remaining')"starter_prompt is the most important field. Spend extra effort making it precise and complete.After saving, report to the user:
Handoff saved to handoff/execution-handoff.json
- Objective: [one-line objective]
- Done: N items | Partial: N items | Remaining: N items
- Execution plan: N steps
- Branch: [branch name] | Uncommitted: [count] files
Next session: paste the starter_prompt or use /handoff loadResume work from a previous session's handoff. Read the execution handoff, verify the environment matches, and start executing immediately.
Read handoff/execution-handoff.json (or the provided path). If the file doesn't exist or is invalid JSON, stop and tell the user — don't guess or improvise.
Validate the handoff has the required fields:
objective, summary, current_state, ordered_execution_planIf handoff_metadata exists (newer format), use it to verify environment:
# Compare current branch with handoff branch
git branch --show-current
# Check for unexpected changes since handoff
git log --oneline -5
# Verify uncommitted changes haven't been lost
git status --shortBranch mismatch warning: If the current branch differs from handoff_metadata.branch, warn the user before proceeding. The handoff may reference work on a different branch.
Staleness check: If handoff_metadata.created_at is more than 48 hours old, warn: "This handoff is N days old. The codebase may have changed since then. Shall I verify the state before executing, or proceed as-is?"
Briefly restate (2-4 lines total, not a wall of text):
This serves as a sanity check — the user can correct course here before execution begins.
Before touching any code, verify the handoff's assumptions still hold. This prevents the most common handoff failure: the codebase changed between sessions.
For each file listed in modified_files (if present) or referenced in ordered_execution_plan:
For items marked as done in current_state:
If something doesn't match, flag it immediately rather than discovering it mid-execution.
Follow ordered_execution_plan sequentially:
progress_log — if a step is marked "done" there and verification confirms it, skip it.depends_on lists step IDs, verify those steps are actually complete before starting.files (or the files you'll modify) before making changes. The handoff captures intent, but the code is the source of truth.must_preserve: true is a hard constraint. Don't change the approach even if you think of something "better" — the previous session made that choice for a reason documented in the reason field.At meaningful milestones (after completing each step or hitting a blocker), update the handoff file to reflect current state:
# Update progress in the handoff
import json
with open('handoff/execution-handoff.json', 'r') as f:
handoff = json.load(f)
# Move items between states as work progresses
# Update progress_log with new entries
# Mark completed steps
with open('handoff/execution-handoff.json', 'w') as f:
json.dump(handoff, f, indent=2)This ensures that if this session also gets interrupted, the next /handoff load will have accurate state.
If you hit a blocker that can't be resolved from the handoff or codebase:
Do NOT restart broad brainstorming. Do NOT re-explore the codebase from scratch. The handoff exists precisely to avoid this.
After loading, report:
Handoff loaded from [path]
- Objective: [one-line objective]
- Branch: [current] (handoff expects: [expected])
- Done: N | Partial: N | Remaining: N
- First step: [title of first executable step]
- Constraints: [count] architecture decisions, [count] session rules
Proceeding with step [N]: [title]Then begin execution immediately.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.