Checkpoint a body of work: a reviewer subagent actively VERIFIES the work read-only (runs gates to confirm 'done' claims), checks it's ON-DIRECTION with the ticket's intent, and finds LEFTOVERS. Then, on your confirm, the orchestrator COMMITS the work scoped (only the reviewed files, gated on green) and posts a substantive status update to the ticket: a thorough comment, a status transition, and (only on material drift) an evergreen description rewrite with append-only Change history — and, on a closing snapshot (Done transition or session wrap-up), attaches the session debrief as the ticket's permanent record. Commit + comment + status + description all land under one batch confirm; nothing auto-posts. A building block: it verifies + commits the checkpoint + reports, never fixes code or files followups. Triggers: "snapshot this", "checkpoint the work", "commit and update the ticket", "snapshot progress", "post a ticket update", "update the ticket", "status update", "report progress to the ticket", "update ti
Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.
Quelldateien prüfen
Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Ein direkter Befehl überspringt den Prüf-Prompt. Prüfen Sie die Quelle, bevor Sie ihn ausführen.
Checkpoint a body of work: a reviewer subagent actively VERIFIES the work read-only (runs gates to confirm 'done' claims), checks it's ON-DIRECTION with the ticket's intent, and finds LEFTOVERS. Then, on your confirm, the orchestrator COMMITS the work scoped (only the reviewed files, gated on green) and posts a substantive status update to the ticket: a thorough comment, a status transition, and (only on material drift) an evergreen description rewrite with append-only Change history — and, on a closing snapshot (Done transition or session wrap-up), attaches the session debrief as the ticket's permanent record. Commit + comment + status + description all land under one batch confirm; nothing auto-posts. A building block: it verifies + commits the checkpoint + reports, never fixes code or files followups. Triggers: "snapshot this", "checkpoint the work", "commit and update the ticket", "snapshot progress", "post a ticket update", "update the ticket", "status update", "report progress to the ticket", "update ticket status/description".
version
1
tier
lightweight
args
[<work to snapshot / scope>] [-- <target ticket key, e.g. <PREFIX>-NNNN>]
Checkpoint a body of work. A reviewer subagent actively verifies the work read-only (running relevant gates to prove that what is claimed "done" is actually done), checks that it follows the ticket's direction, and catalogs leftovers. Once you confirm, the orchestrator commits the reviewed work (scoped, gated on green) and posts a status update to the ticket. This update includes a thorough comment, a proposed status transition, and—only when the premise has materially drifted—an evergreen description edit; on a closing snapshot it also attaches the session debrief as the ticket's permanent record. It is a menu, not a monolith: the batch confirm lets you decline any action — a commit-only checkpoint, a comment-only update, or the full commit + comment + status + description are all valid; you pick what lands at the confirm. Sessionless and lightweight: it runs within the active session—review → propose → one confirm → commit + post, then stop.
This is not /scrutinize: it does not hunt for code bugs or fix anything. Its job is to follow the direction, verify the claims, find the leftovers, and then stamp a checkpoint. It commits the reviewed slice and reports it outward to the ticket so a later human or reviewer-agent can trust the status without re-deriving it. It consumes the artifacts of /build and /scrutinize (_BUILD.md, _CRITIQUE.md, _FIX.md) to understand what happened. Multiple /snapshot checkpoints eventually roll up into a single /pr (which operates at the branch level, not the chunk level). As a building block, it verifies, commits, reports, and updates; it never repairs code or files followups (leftovers are merely guidance in the comment).
Related — /summarize: The §2 reviewer drafts its own comment body, but that "distill this work into a status" logic is exactly what /summarize does read-only. When a rich inward digest already exists (or you want one), /snapshot MAY generate its comment via /summarize and post that. /summarize is the report engine; /snapshot adds the verify + commit + outward post. This is optional wiring; the default self-contained draft path still stands.
Tracker note: This project uses Linear via the linear-server MCP — the tracker + its tools are constant; only the issue-key prefix and team vary per project and come from CLAUDE.md § Tracker (resolve them in §1, inject into the subagent prompt; keys are <PREFIX>-NNNN — FIN for finch). Tools: get_issue (read the ticket's intent/description/state/team/canonical branch), list_issue_statuses (resolve a target state), save_comment (post the comment), save_issue (move state and/or replace the description). Load schemas on demand (ToolSearch linear). No Linear MCP → The commit still happens (it needs no MCP), but the ticket half degrades. The direction reference falls back to args/conversation (state explicitly that On-direction is lower-confidence), the description proposal is SUPPRESSED (Part 3 → "skipped — cannot read current body to preserve history"), and only the comment + a suggested status are handed to the user to paste manually. Note that posting was skipped.
/snapshot Protocol
1. Scope & target ticket
Establish two things: the work under review and the ticket it reports to.
Resolve the tracker config (do this first): Read CLAUDE.md's ## Tracker block (the orchestrator sees CLAUDE.md; the reviewer subagent does NOT — resolve here, inject in §2). Resolve the issue-key prefix (<PREFIX> uppercase for keys <PREFIX>-NNNN / its lowercase for branches <prefix>-NNNN-…) and the team. Finch: prefix FIN, team Finchclaims. Fallback — no ## Tracker block (unconfigured): keep today's behavior — detect a FIN-style key (uppercase-alpha prefix + -NNNN) from the slug/branch/conversation at lower confidence. The config is never a hard requirement; absent it, degrade to detection, don't error.
Work under review: Resolve from args, else the active session (log / plan / build reports / critiques / IMPLEMENTATION_LOG), else the working-tree diff, else the conversation. This is what the checkpoint is about—and it defines the exact file set that gets committed (§3).
Target ticket: The <PREFIX>-NNNN key (prefix from § Tracker) from the session slug (finch example, prefix=FIN: 2026_07_02_FIN_2737_… → FIN-2737), the git branch (lowercase prefix: <prefix>-2712-… → <PREFIX>-2712), or the conversation (text after -- overrides). get_issue it now to read its title, description (the intent/premise + any acceptance criteria), current state, team, and canonical branch name. This is the direction reference the review checks against, and its snapshot is the base for the description read-before-write (§3). If detection is low-confidence (e.g., branch-key ≠ slug-key) or ambiguous, confirm the ticket via one AskUserQuestion before reviewing.
Wrong-ticket cross-check: Compare get_issue's returned canonical branch name against the actual current git branch (git branch --show-current). On mismatch, surface the wrong-ticket mismatch prominently in the §3 confirm header even if no slug/branch-key conflict was flagged. A reused-branch key can silently point at the wrong issue. (The canonical branch name is also what §3 step [1] uses to branch off dev/main.)
Resolve the trail: <trailDir> = <sessionDir>/builds/. Pick a <slug> once (kebab-case of the work). Before minting a fresh slug, ls <trailDir>—if an existing <slug>_*.md clearly matches this work (same chunk / ticket / topic), REUSE that slug so the trail clusters under one name. Only mint a new one for genuinely new work. Ledger/log appends (§3) use engine log.
Echo back one line: Snapshotting <PREFIX>-NNNN "<title>" (state: <current>, branch: <branch>) from <work>; trail: <trailDir>/<slug>_SNAPSHOT.md.
2. Review — spawn the reviewer subagent (active verify, read-only)
When to skip the subagent: If there is no target ticket (commit-only checkpoint) and no runnable gate for the work (e.g., docs / markdown / config with nothing to tsc/test/build), the reviewer is a near no-op. There's nothing to verify and no comment to draft. In that case, skip the spawn and do the commit scoping inline (identify the exact file set, classify CLEAN/MIXED via git diff -- <path>, propose the message), then go straight to §3. Otherwise, spawn the reviewer.
Backgroundable & parallelizable. This sub-agent dispatch is a composable building block: it can run in the background (run_in_background: true) so the orchestrator keeps working while it runs, and when the work splits into independent chunks, several such sub-agents can be fanned out in parallel and reconciled.
Before dispatching — §CMD_LOG_SKILL_INVOCATION: log this dispatch to the session log (why + context-pack pointer + one-line re-tread) so a restarted session can re-tread it. Fire it as the last step before the Task/Agent handoff.
Spawn one subagent (a general-purpose/analyzer) to review the work, verify it, identify the exact commit file set, and draft the update. It does the verification + framing; it never touches the tree. You (the orchestrator) keep the thread and perform the commit + posts in §3. Build its prompt self-contained:
You are drafting a historical CHECKPOINT for a ticket. Write it for a future engineer debugging a production outage caused by THIS exact code six months from now. Be dense, precise, and brutally honest about fragility. A tautological "aligned with intent, realizes the ticket as written" line is worthless padding. You VERIFY, FOLLOW THE DIRECTION, and FIND LEFTOVERS. You do NOT hunt for code bugs (that's a different skill) and you do NOT fix anything.
Tracker config (resolved from CLAUDE.md § Tracker — the orchestrator fills these; you cannot read CLAUDE.md): Linear (linear-server MCP) · issue-key prefix <PREFIX> (keys <PREFIX>-NNNN, branches <prefix>-NNNN) · team <team>. Use this prefix for the ticket key and in the commit message; do NOT assume FIN.
Target ticket (the direction reference):<PREFIX>-NNNN — intent/premise: <from get_issue description>; acceptance: <if stated>; current state: <state>.
Work under review:<scope + concrete pointers: session artifacts / git diff cmd / build+critique reports / conversation digest>.
READ THE FULL ARTIFACT TRAIL FIRST — not just the diff, but SCOPED to this work's <slug>. Before judging, read the COMPLETE trail for THIS work. It carries the decisions, critiques, verdicts, and rationale a diff can't show, and grounds the On-direction / Verified / Leftovers / Decisions&rationale / Risks review in everything that happened:
In <trailDir> (<sessionDir>/builds/) read THIS work's <slug>_*.md — its _BUILD.md, _CONTEXT_PACK.md, _CRITIQUE.md, _FIX.md, _EXPERIMENT.md, _TICKETS.md — PLUS the session artifacts (*_LOG.md, the plan, DIALOGUE.md) and LESSONS.md. A <slug>_TICKETS.md (written by /ticket) means a leftover was already captured as a filed followup — don't re-list it under Leftovers. In a long session, builds/ holds many unrelated slugs; only SKIM other-slug artifacts if directly relevant — never read the whole dir indiscriminately.
Full context IN → a tight distilled status OUT (the comment stays tight, TL;DR on top — the trail makes the status far richer than the diff alone; it does not bloat the comment).
Background is available (run_in_background: true) and relaying the summary when it lands still applies — but this step commonly runs foreground, since §3's confirm needs the reviewer's draft in hand right after. Run foreground when you need the result inline for the next step.
3. Calibrate, commit & post (single batch confirm)
HARD RULE — NO GIT GYMNASTICS (top-line safety constraint). The orchestrator NEVER stashes, git checkout/git restores, reverts, or temporarily removes ANY change (its own or a parallel agent's) to "clean up" a commit with intent to restore it later. That unroll-then-restore dance is HIGH-RISK and can silently lose a parallel agent's uncommitted work. It NEVER git add -p / patch-stages / surgically splits hunks. The only working-tree/index operation it may perform is git add -- <clean path>. If the reviewed work cannot be committed by whole-file staging of CLEAN files alone, the orchestrator SURFACES the situation and lets the USER decide — it does not manipulate the tree or index to force a clean commit.
Relay the draft: the proposed commit (message + file list with each file's CLEAN/MIXED classification + branch), the TL;DR, the proposed state change, and whether a description edit is proposed. Render the comment body in chat (or a tight digest + the trail link if very long).
Batch confirm (AskUserQuestion, MANDATORY — this both mutates the tree and posts outward). The header renders the ticket title + current state — and, on a §1 wrong-ticket cross-check mismatch, a prominent wrong-ticket warning (not just the number): "Post to <PREFIX>-NNNN '' (In Progress)?". Present ALL proposed actions together, up to four. Each is BEST-EFFORT and independent (step 3):
[1] Commit — the proposed message + the staged file set (each file shown CLEAN = will stage, or MIXED = also carries churn outside the work) + the target branch. The commit action offers, regardless of gate color: commit as proposed / edit message / edit the staged file set / skip the commit (post update only).
MIXED files are never auto-split, stashed, or unrolled. Per mixed file, the user chooses: commit the whole file as-is (churn included — explicitly flagged here) / skip that file (checkpoint only the clean files) / defer the whole commit. Default suggestion: skip the mixed file, commit the clean ones — the user can override.
Green gate: If the §2 verify gates were red or unrun, the confirm SAYS SO. "Skip the commit (post update only)" is a first-class choice at any gate color; committing red work is an explicit opt-in.
[2] Comment — the rendered body, plus any ready evidence to attach (screenshots/artifacts the agent already has in hand — see step 3 [2b]; "none" if there are none), and — on a closing snapshot (Done transition or session wrap-up) — + session debrief attached (see step 3 [2c]; shown as "no debrief yet — skipped" when none exists).
[3] Status move — <current> → <suggested>, or "none".
[4] Description edit — the single full body incl. ## Change history, or "no drift".
→ Post all / Edit one first / Cancel. On "Edit one first", ask which (commit / comment / status / description), loop to it, and re-present the confirm.
Constraints
HARD RULE — no git gymnastics. The orchestrator NEVER stashes, git checkout/restores, reverts, patch-stages (git add -p), or temporarily removes any change to force a clean commit. That unroll-then-restore dance can silently lose a parallel agent's uncommitted work. The ONLY working-tree/index op is git add -- <clean path>. If the clean files alone can't form the commit, SURFACE it and let the USER decide; never manipulate the tree/index to force it.
Not /scrutinize. It verifies the direction, the claims, and the leftovers — it does not hunt for code bugs or fix anything. A bug it happens to notice is a leftover/risk line in the comment, not a repair.
Verify, don't assert. "Done" claims are confirmed by RUNNING the gates and cross-checking the diff — never taken on faith. A gate that couldn't run (or is destructive) is stated as such, not reported green.
Read-only verify subagent. The reviewer runs only non-mutating gates and NEVER touches the working tree (no git add/commit/stash; no db:reset/migrate/seed; no e2e/live-service suites). The commit is strictly an orchestrator action after the confirm.
Scoped commit, clean vs mixed, gated on green. Stage ONLY the CLEAN reviewed files with git add -- <path> — never git add -u/-A/.. MIXED files (carrying churn outside the work) are SURFACED to the user per file (commit whole as-is / skip / defer), never auto-split. Before committing, review git diff --cached so the user approves actual staged content, and re-check the narrowest gate (TOCTOU). Branch-first on dev/main using the canonical branch name (abort the commit if that fails). Message type(scope): <PREFIX>-NNNN … + the Co-Authored-By trailer. Only checkpoint green work by default; "skip the commit (post update only)" is always a first-class choice. No push unless asked.
Notify siblings after a ticket update. Once the ticket-facing actions land, fire engine ticket notify <PREFIX>-NNNN "<decision-grade note>" so other local sessions subscribed to the ticket wake — a local dirty-flag, not an outward post, so it needs no confirm and is best-effort. This operationalizes §"Notify when you post a ticket comment" at the exact operative step: the general directive states the rule; a linear skill run reads its numbered steps and would otherwise skip a free-standing directive, so the notify is embedded here where the miss happened. Skip when running solo (no siblings) or when nothing landed.
READ-ONLY VERIFICATION — this is a hard fence. Run ONLY non-mutating gates (tsc --noEmit, unit tests, build/lint — e.g., cd packages/X && npx tsc --noEmit, yarn workspace @finch/X test). NEVER run db:reset/db:migrate/db:seed, e2e/integration suites needing live services, or anything hitting a real/prod DB or network mutation. NEVER git add/commit/push/stash/checkout or otherwise touch the working tree — it is expected to be dirty; leave it exactly as found. Delete any coverage/artifact you generate. If the only gate is destructive, DON'T run it — report "not verified (gate is destructive)". Report exact commands → exact results; never assert a green you didn't see.
Check ON-DIRECTION: Is the work aligned with the ticket's intent/acceptance? On track / drifted (say how + why) / re-scoped. This is the core judgment.
Detect LEFTOVERS & followups: What is unfinished, deferred, or open (plan/acceptance items not done, skipped tests, critique findings not yet addressed, TODOs)? Distinguish real leftovers from intended non-goals. These are guidance, not work to do.
Identify the COMMIT file set, classify each file CLEAN vs MIXED, + propose a message (you do NOT commit). From the work under review, list the exact files that belong to this checkpoint (relative paths). The tree is dirty with parallel-agent churn, so name only this work's files, never a wildcard. Classify each with git diff -- <path>:
CLEAN = the file carries ONLY this work's changes.
MIXED = the file also carries hunks outside this work (unrelated parallel churn).
This matters because git add -- <path> stages the WHOLE file. A MIXED file would drag its churn into the commit. The orchestrator whole-file-stages CLEAN files and SURFACES MIXED files to the user for a per-file decision. It NEVER patch-stages, stashes, or unrolls to split a file. Propose a conventional commit message type(scope): <PREFIX>-NNNN <summary> matching the repo's git log style. The ORCHESTRATOR stages and commits after the user confirms — you never touch git.
Draft the status comment using the section palette below. Keep a tight Status + TL;DR always on top (with a Covers: line for the window this update spans), then add as much detail as the work warrants. Headers + bullets keep a big comment scannable; big is fine, padding is not. Include-if-present: skip a section rather than write "none".
ALWAYS-ON:Status / TL;DR (+ Covers: window) · On-direction (aligned / drifted-because) · Verified (what you ran → result) · Confidence & fragility (where it will break first) · Leftovers & followups (guidance for the next person/agent).
Commit SHA sentinel: Anywhere you reference the checkpoint commit (TL;DR "Committed …", Verified "Checkpointed as …", Links "commit …"), write the literal sentinel {{COMMIT_SHA}} — never invent a SHA. The orchestrator substitutes the real short SHA after committing, or STRIPS the whole commit claim if no commit lands (§3 scrub).
Propose a status transition if the work implies one (<current> → <suggested>, e.g., In Progress → In Review / Blocked / Done) with a one-line reason. If it doesn't, say "no state change."
Assess DESCRIPTION drift: Has the ticket's premise / scope / acceptance MATERIALLY changed (not just progressed)? If NO → no description edit. If YES → draft the single complete final description body: the evergreen rewritten text PLUS a ## Change history section containing every prior entry copied verbatim + one new appended line - <YYYY-MM-DD>: <what changed> (<why>). The description is a full-field replace — a body missing any prior entry erases history, so carry them all. Never rewrite for routine progress.
Return contract: WRITE the draft to <trailDir>/<slug>_SNAPSHOT.md using the template (in THIS skill's assets/TEMPLATE_SNAPSHOT.md — the orchestrator gives you its base dir; do not hardcode ~/.claude): the commit proposal (message + staged file list with each file classified CLEAN/MIXED + branch), the comment (rendered Markdown, using the {{COMMIT_SHA}} sentinel for any commit reference), the status proposal, and the description proposal (single full body, or "no drift"). Then return a 4–6 line summary: the proposed commit message + file count, the proposed state change, whether a description edit is proposed, and the headline status.
Do NOT: fix code, file tickets, commit, push, or move the ticket yourself — you draft; the orchestrator commits + posts after the user confirms.
On Post all, execute the four actions in order — commit FIRST, then comment → status → description, then a final [5] notify of local siblings — so a landed commit SHA can be embedded in the comment and summarized in the notify. The four actions are BEST-EFFORT and non-atomic: attempt each; a failure or skip in ONE does NOT abort the others. Never CLAIM an action that didn't happen — do what lands, report honestly (step 4).
[1] Commit (orchestrator only — the subagent never commits):
Skip entirely if the user chose skip-the-commit, or if all reviewed files were mixed→skipped. A skipped or failed commit routes through the commit-claim scrub (below) but the other three actions still run.
Branch safety: If on the default branch (dev or main), create the feature branch FIRST using the canonical branch name from get_issue (§1), falling back to <prefix>-<ticket>-<slug> only if absent; then commit. If branch creation FAILS → ABORT the commit and report — NEVER commit onto dev/main. Off the default branch, commit on the current branch (surfaced in the confirm).
Stage ONLY the CLEAN reviewed files — git add -- <exact path> <exact path> … (plus any MIXED file the user explicitly approved whole). NEVER git add -u / -A / ., and per the HARD RULE never git add -p / stash / checkout / restore / revert — this repo's tree is always dirty with parallel-agent churn (CLAUDE.md rule).
Inspect the staged CONTENT before committing: Run git diff --cached (or --stat + hunk count) and render it in the relay/confirm so the user approves the actual STAGED CONTENT, not just a file list. Eyeball it — if anything unexpected is staged, STOP and re-surface (do not silently commit).
Green re-check (TOCTOU): After staging, before commit, re-run the NARROWEST relevant §2 gate on the workspace when cheap (e.g., cd packages/X && npx tsc --noEmit — re-running a gate is read-only, allowed, and NOT git gymnastics). If not feasible, stamp the verify time in the confirm ("green as-of ; files may have changed since").
Commit with the approved message type(scope): <PREFIX>-NNNN <summary> (see git log --oneline -5 for style), ending with the environment's required commit trailer — the Co-Authored-By: line the harness/repo prescribes (do NOT hardcode a model name/version; use whatever the current environment specifies). Do NOT push (unless the user asked).
Capture the short SHA: git rev-parse --short HEAD. Substitute it for the {{COMMIT_SHA}} sentinel in the comment's TL;DR / Verified / Links slots before posting.
Commit-claim scrub — when the commit is SKIPPED or FAILS: Before posting the comment, STRIP every commit claim from the body. Remove the TL;DR "Committed …" clause, the Verified "Checkpointed as …" line, and the Links commit entry (or replace it with "commit: not committed"). Guard: NEVER post a comment body still containing an unresolved {{COMMIT_SHA}} sentinel — if one remains, STOP.
[2] Comment → Post the reviewer-rendered comment body VERBATIM (from <trailDir>/<slug>_SNAPSHOT.md / the §2 relay) through §CMD_POST_TICKET_COMMENT — the canonical subscribe-check → save_comment({ issueId: "<PREFIX>-NNNN", body }) → notify atom (its step 3 IS the [5] notify below, so the sibling-notify rides with the post). The orchestrator does NOT re-render or rewrite the body. The ONLY mutations allowed are substituting the {{COMMIT_SHA}} sentinel with the real short SHA, or scrubbing the commit-claims when no commit landed (per the scrub rule above).
[2b] Attach ready evidence (rides with the comment, if approved) → If — and ONLY if — the agent already has supporting evidence in hand from this run, attach it to the issue after the comment posts. Qualifying: screenshots / images the agent captured (UI screenshots, overlay or diagram images, a chart) and well-made standalone artifacts that back the checkpoint (an evidence doc, an important report, or a writeup — e.g. from /writeup or /analyze). Do NOT attach internal process artifacts — the *_LOG.md, DIALOGUE.md, the plan, or the build-trail reports (*_BUILD.md/*_CRITIQUE.md/*_SNAPSHOT.md etc.; those already ride as Links in the comment) — and never fabricate a screenshot; attach only what genuinely already exists. (The session debrief is the ONE deliberate exception, and only on a closing snapshot — see [2c]; everywhere else it stays a process artifact and is not attached.) Attach to issueId: "<PREFIX>-NNNN" via the Linear attachment flow (prepare_attachment_upload → upload the bytes → create_attachment_from_upload for a local file; or create_attachment for a URL — load schemas via ToolSearch linear). Best-effort like the other actions — an attach failure is reported, it never aborts the commit/comment/status/description.
[2c] Attach the session debrief — closing snapshot only (rides with the comment, if approved) → On a closing checkpoint — EITHER the [3] status move is into a terminal / Done (closed) state, OR this snapshot is the session's wrap-up (a closing update, signaled by an existing session debrief = the session has synthesized) — attach the session debrief to the issue as its permanent record. Resolve the debrief: the #needs-review-tagged synthesis artifact in <sessionDir> (IMPLEMENTATION.md / DO.md / ANALYSIS.md / FIX.md / the active skill's debrief) — NOT a *_LOG.md, DIALOGUE.md, or the plan. No debrief present (snapshot ran mid-work, before synthesis) → SKIP with a one-line note ("no debrief yet — attach skipped"); never fabricate one or substitute the raw log. Not a closing snapshot (routine in-progress checkpoint) → skip silently — mid-work updates stay comment-only. Attach to issueId: "<PREFIX>-NNNN" via the same Linear local-file flow (prepare_attachment_upload → upload the bytes → create_attachment_from_upload; load schemas via ToolSearch linear). Best-effort like every other action — an attach failure is reported, it never aborts the commit/comment/status/description. This is the deliberate exception to [2b]'s no-process-artifacts rule: on a close, the debrief IS the evidence.
[3] Status (if approved) → save_issue({ id: "<PREFIX>-NNNN", state: "<name-or-type>" }) — id is REQUIRED; a save_issue with no id CREATES a new issue. Resolve the state via list_issue_statuses (needs team from §1) if needed.
[4] Description (if approved) → Re-get_issue immediately before posting (TOCTOU) and re-read the CURRENT description (not the §1 snapshot). Copy its ## Change history block unchanged, append the single new line, and assemble the full body. If the current description differs from the §1 snapshot the draft was built on → STOP and re-surface, don't clobber. If the assembled body does not contain every prior ## Change history entry → STOP, do not post. Then save_issue({ id: "<PREFIX>-NNNN", description: <full assembled body> }) — a full-field replace.
[5] Notify local siblings → This is step 3 of §CMD_POST_TICKET_COMMENT — when [2] posted a comment through the atom, the notify already rode with it; this step just ensures it fires ONCE whenever anything landed (a commit/status/description with no comment still warrants a wake). Fire engine ticket notify <PREFIX>-NNNN "<decision-grade note>" to wake every other local session subscribed to the ticket (per ~/.claude/.directives/AGENTS.md §"Notify when you post a ticket comment"). notify auto-excludes this session (pass --from <this-session> to make it explicit). On wake a sibling drains ONLY this note — no Linear fetch — so make it decision-grade: the real short SHA from [1] if a commit landed (the actual SHA, NEVER the {{COMMIT_SHA}} sentinel), the one-phrase what-changed, and an affects-you verdict (no action / rebase onto <sha> / your files untouched / needs your reply). Finch example (prefix=FIN): engine ticket notify FIN-2833 "2db0ecea6: entities/ scaffold committed; scope.ts left for FIN-2737 — no action for you". Fire whenever a target ticket exists AND anything landed (commit and/or comment/status/description). Skip when there is no target ticket, when nothing landed, or when running solo (no sibling sessions to wake). It is a local dirty-flag, not an outward post — so it needs no separate confirm and is best-effort: a notify failure is reported, never aborts anything.
Capture the commit SHA (if any), the comment URL + the issue URL.
Report + trail. Stamp the draft's Outcome with EXACTLY what landed per action — each of committed <sha> on <branch> | comment <url> | status moved | description updated marked done / skipped / failed — and hand back any un-posted artifact for manual retry. Never stamp an action that didn't land. Link it (§CMD_LINK_FILE). Append one terse bullet to <trailDir>/LESSONS.md: what was checkpointed + the state change (e.g., "<PREFIX>-NNNN → In Review; committed <sha> (4 files) [or: commit skipped]; verified suite green; 2 leftovers noted"). Then stop — pushing, filing followups, or fixing leftovers is your call, via git push / /ticket / /fix, not this skill's.
~/.claude/.directives/AGENTS.md
Four best-effort actions, honest outcome. Commit + comment + status + description are attempted independently under one confirm; a failure or skip in one NEVER aborts the others. A skipped/failed commit is scrubbed from the comment (no "Committed …", no unresolved {{COMMIT_SHA}}) and the rest still post. The Outcome stamps exactly what landed per action (done / skipped / failed) — never claim an action that didn't happen.
Attach ready evidence, not process artifacts. When the agent already has supporting screenshots/images or a well-made standalone artifact (evidence doc, important report, writeup) in hand, attach it to the ticket alongside the comment (under the batch confirm, best-effort). NEVER attach the session log/plan or build-trail files, and never fabricate a screenshot to fill the slot.
Attach the session debrief on a closing snapshot. On a closing checkpoint — a status move into a terminal/Done state, or a session wrap-up (an existing #needs-review debrief means the session synthesized) — attach the session debrief (the synthesis artifact, e.g. IMPLEMENTATION.md/DO.md/ANALYSIS.md, NOT a *_LOG.md) as the ticket's permanent record, under the same batch confirm, best-effort. No debrief present → skip with a note (never fabricate or substitute the log). Routine in-progress checkpoints stay comment-only. This is the sole, deliberate exception to the "no process artifacts" rule above.
Building block. It reports + commits the checkpoint + updates the ticket; it never fixes code or files followups. Leftovers are guidance.
Description edits only on material drift, single full body carrying every prior ## Change history entry verbatim + one new line, with the current description re-read immediately before the full-field replace (never clobbered, never partial). Routine progress → comment only.
save_issue always carries id. A missing id creates a duplicate ticket — pin save_issue({ id: "<PREFIX>-NNNN", … }) and save_comment({ issueId: "<PREFIX>-NNNN", body }).
One batch confirm before any commit or outward post. Nothing auto-commits or auto-posts; the user sees all up-to-four actions (commit + comment + status + description) together and approves the set (or edits one).
Thorough, with a tight TL;DR on top. Big comments are welcome; a skimmer/reviewer-agent must still get the gist from the first lines. No padding; skip empty sections.
Lightweight + sessionless. Runs within the active session — review → confirm → commit + post, then stop.