/conclude-it — one door for every session close
/plan-it plans it, /build-it builds it, /review-it reviews it,
/conclude-it concludes it — whether "it" is a shipped epic or an ordinary
working session. Closing a long session without a ritual leaves debris: knowledge
that lived only in the conversation is lost, background jobs keep running,
unmerged work is stranded, finished subagents linger as RAM-holding zombies —
and, worst, features get filed as "done" that were never proven in prod. This
skill sequences the close so none of that survives it.
First run in a repo: a five-question setup interview (docs home, second
brain + scope, deploy skill, debrief skill) — answered once, saved inside the
repo, asked again only in a repo without the block. See the setup section
below.
One command, two legs. Step 0 triages mechanically; the user never chooses:
- Ship-shaped session (deploys ran, feature work at the merge boundary, a
Definition of Done met without prod verification, or the user said "ship it")
→ run the ship pipeline first, then the close core.
- Plain session (research, planning, Q&A, hygiene — the common case) → the
close core only.
- Ambiguous → ask ONE question ("conclude — ship to prod — or just close?").
Never deploy on a guess.
First run in a repo — the setup interview (once per repo)
Before the first close in a repo, resolve five facts. They are per-repo
memory, saved inside the repo — never global unless the user says so. Look
for the block ## conclude-it — project setup in CLAUDE.md → AGENTS.md →
.conclude-it/config.md; found (or derivable from existing agent
instructions) → use silently. Missing → detect first (candidate docs
folders, *deploy*/*debrief* skills, vault signals), then ask ONE batch of
five questions, each pre-filled with what detection found:
- Docs home — "Where is this project's documentation folder? Give me the path."
- Second brain — "Do you keep a second brain (Obsidian or similar)? Give me the path." (or: none)
- Second-brain scope — "Global across projects, or per-project? Explain
the layout — or just say the word and I'll inspect it and guess where
session knowledge should be filed." Record a guess AS a guess; propose it
for approval, never silently trust it.
- Deploy — "I use generic deploy steps by default. Create — or point me
to — a
<project>-deploy skill with this repo's exact instructions and
I'll follow it every ship." Record the skill, or none + the
recommendation; offer to scaffold it now.
- Debrief — "Create — or point me to — a
<project>-debrief skill that
explains how your documentation structure works and I'll follow those
guidelines." Record it; else the generic debrief flow.
Write the answers into the repo (the file it already uses — CLAUDE.md, else
AGENTS.md, else create CLAUDE.md):
## conclude-it — project setup
- docs_home: docs/
- second_brain: ~/Vault/MyBrain # or: none
- second_brain_scope: global # global | per-project | none
- second_brain_notes: session knowledge → wiki/projects/<slug>/ (guessed — confirm)
- deploy_skill: acme-deploy # or: none (recommended: create acme-deploy)
- debrief_skill: acme-debrief # or: generic
- configured: YYYY-MM-DD
If the user explicitly says "save this globally", ALSO write the answers as
user-level defaults; per-repo blocks always override. Consumers: the debrief
step runs debrief_skill against docs_home; the ledger card mirrors to the
second brain only when its scope says global; the ship pipeline deploys via
deploy_skill — none values degrade inline and the verdict repeats the
create-a-skill recommendation once.
The ship pipeline (ship-shaped sessions only)
Fail-closed, in order. (The Claude Code plugin carries an expanded version in
references/ship-pipeline.md, loaded only when triage says ship-shaped; this
file is self-contained — on any other agent, run the steps below as written.)
- S0 Scope + rename — name the epic in one line; rename the session
done-<name>.
- S1 Local gate — run the project's REAL test/e2e scripts (dead placeholder
scripts are never gate targets). RED → diagnose→fix→re-run via
/iterate
until green; a red local gate never proceeds to prod. No runnable suite? say
"unverified", don't manufacture a pass.
- S2 Merge + deploy — merge hygiene per repo (never strand unmerged work),
then the project's own deploy skill/path. Irreversible destructive steps
still need an explicit yes.
- S3 Prod gate — smoke/e2e against prod. RED → fix, re-deploy, re-verify.
No reachable prod target → close as "deployed-but-unverified", loudly.
- S4 Archive —
git mv the epic's plan docs to their home's 0-done/
sibling; fix links.
- S5 Backlog — write deferred follow-ups where the next session will look,
each note naming the originating session.
- S6 PM board — flip the epic's rows on the project's tracker, if one exists.
The session-close core (every session)
- Confirm intent — one line on what's about to happen.
- Debrief — run the project's session-debrief (a generic one is bundled) so
patterns/gotchas/decisions land in durable docs. Skip-if-done guard (check
artifacts, not memory). Require the supersession line: a session that
changed behaviour must show old docs updated or
status: deprecated — never
two "current" docs describing two versions of the same feature.
- Ledger card — a ≤40-line OKR-style card (objective, honest key results,
files touched, pointers, next) into
<repo>/.agents/history/ + INDEX row;
every session gets one, so "which session did X?" stays answerable for ~150
tokens instead of a transcript distillation.
- Mid-flight check — background tasks, unmerged/uncommitted work, live
server-side jobs, and sessions THIS session orchestrated (peers, headless
spawns): each must be terminal or handed to the user by name. Never exit an
orchestrator with a worker running unowned.
- Reap — stop finished subagents once their output is captured in files;
kill lingering headless processes by exact recorded PID only (never a
pattern-matched kill).
- Footprint sweep — remove what this session created and nothing
references: worktrees, landed branches, remote/pod files, scratch. Secrets
at rest are swept FIRST and verified absent. Clean only what you can prove
you created; report the rest. Keep config backups and anything a durable doc
cites.
- CONCLUDE_REPORT.html (ship sessions) — a local, deterministic HTML
double-check report (manifest + bundled
build-report.py + template:
light/dark toggle, badge cards, per-item "How to test" blocks, embedded
markdown reports). RED/UNVERIFIED items get their own badge — a report that
only shows the green half is a fake.
- Verdict — ✅ safe to exit (with what was cleaned, what was deliberately
left and why, and that no written credential is still at rest) or ⚠️ not yet
(the specific blocker + the choice). Then STOP — the user types the quit.
What it never does
- Advance past a red gate, skip a gate for a faster close, or report GREEN off a
mock/skipped suite/targetless prod check.
- Deploy on a guess, or run irreversible destructive prod steps without an
explicit yes.
- Re-run a debrief that already ran; skip the ledger card; glob-delete in shared
locations; delete what a durable doc cites.
- Quit the process itself — it prepares the exit, the user takes it.
Portability — graceful degradation outside Claude Code
This file is the complete, self-contained ritual: it runs on any
SKILL.md-compatible agent (Cursor, Codex CLI, Copilot, OpenCode, Windsurf,
Gemini CLI, and 70+ others via the Agent Skills standard). Some helpers it
names are Claude Code plugin pieces; when one is absent, degrade inline and
say so — never skip the step and never pretend the helper ran:
/iterate / /full-qa absent → run the diagnose→fix→re-test loop and
the e2e/smoke verification yourself, inline. The gates and their fail-closed
rules are unchanged.
- Report machinery absent (
build-report.py + template ship only in the
plugin) → write CONCLUDE_REPORT.md (markdown) with the identical structure:
gates scoreboard first, per-item sections with status + "How to test" steps,
RED/UNVERIFIED first-class.
- Bundled
session-debrief absent and the project has no debrief skill →
capture inline: dated session-log entry in the project's docs + the
promotion/supersession sweep from the debrief spec (update durable pages, bump
their verified-date, deprecate what the change replaced).
- No subagent/rename primitives on this harness → do the work in the main
loop and emit the rename line for the user; the sweeps and verdict still run.
Whatever ran inline gets named in the verdict ("debrief ran inline — no debrief
skill installed"), so the close is honest about its own machinery.
Install
Claude Code (plugin, recommended — full bundle: ship-pipeline reference, HTML
report machinery, bundled session-debrief):
/plugin marketplace add DevOtts/conclude-it
/plugin install conclude-it@devotts
Any SKILL.md-compatible agent (Cursor, Codex CLI, Copilot, OpenCode, Windsurf, …):
npx skills add DevOtts/conclude-it -a <agent> # peek first: npx skills add DevOtts/conclude-it --list
gh skill install DevOtts/conclude-it # GitHub CLI alternative
Getting started: at the end of any working session —
/conclude-it
Plain sessions get the close core (debrief → ledger card → verification → reap →
sweep → verdict). Sessions that shipped get the full ship pipeline first — gates,
deploy, prod verification, archive — and a local CONCLUDE_REPORT.html you open
in the browser to double-check everything with "How to test" steps per item.
Security considerations
- Secrets-at-rest sweep: the footprint step explicitly hunts credentials the
session wrote to disk, remote hosts, or pods — removes them and verifies
absence rather than trusting the delete.
- Exact-PID kills only: lingering processes are killed by the exact recorded
PID, never by pattern match — a grep-kill can take out another session's work.
- Proven ownership: the sweep deletes only what the session can show it
created; everything else is reported, never touched.
- Deploy authorization is scoped: invoking the ship path authorizes the
deploy sequence, but irreversible destructive actions (data-dropping
migrations, volume deletion) always require an explicit yes.
- No hosted publishing: the closeout report is a local file; nothing is
published to hosted surfaces uninvited.
Authored by DevOtts.
1---2name: conclude-it3description: The single front door for every Claude Code session close — and the ship stage of the *-it lifecycle (plan-it plans it, build-it builds it, review-it reviews it, conclude-it concludes it). A mechanical Step-0 triage detects ship-shaped sessions (deploys run, feature work merged, DoD met without prod verification) and runs the ship pipeline first: local test gate → merge+deploy → prod gate → archive plan docs → backlog → PM board. Then the session-close core every session gets: knowledge debrief with a supersession sweep (old docs get updated or deprecated, never left "current"), session-history ledger card, mid-flight + controlled-sessions verification, idle-subagent reaping, own-footprint sweep including secrets at rest, a local CONCLUDE_REPORT.html double-check report, and an honest safe-to-exit verdict. Fail-closed gates, no fake greens. First run in a repo: a five-question setup interview (docs home, second brain + scope, deploy skill, debrief skill) saved INSIDE the repo — once per repo, global only on e4license: MIT5---67# /conclude-it — one door for every session close89`/plan-it` plans it, `/build-it` builds it, `/review-it` reviews it,10**`/conclude-it` concludes it** — whether "it" is a shipped epic or an ordinary11working session. Closing a long session without a ritual leaves debris: knowledge12that lived only in the conversation is lost, background jobs keep running,13unmerged work is stranded, finished subagents linger as RAM-holding zombies —14and, worst, features get filed as "done" that were never proven in prod. This15skill sequences the close so none of that survives it.1617**First run in a repo:** a five-question setup interview (docs home, second18brain + scope, deploy skill, debrief skill) — answered once, saved **inside the19repo**, asked again only in a repo without the block. See the setup section20below.2122**One command, two legs.** Step 0 triages mechanically; the user never chooses:2324- **Ship-shaped session** (deploys ran, feature work at the merge boundary, a25 Definition of Done met without prod verification, or the user said "ship it")26 → run the **ship pipeline** first, then the close core.27- **Plain session** (research, planning, Q&A, hygiene — the common case) → the28 **close core** only.29- **Ambiguous** → ask ONE question ("conclude — ship to prod — or just close?").30 Never deploy on a guess.3132## First run in a repo — the setup interview (once per repo)3334Before the first close in a repo, resolve five facts. They are **per-repo35memory, saved inside the repo** — never global unless the user says so. Look36for the block `## conclude-it — project setup` in `CLAUDE.md` → `AGENTS.md` →37`.conclude-it/config.md`; found (or derivable from existing agent38instructions) → use silently. Missing → **detect first** (candidate docs39folders, `*deploy*`/`*debrief*` skills, vault signals), then ask ONE batch of40five questions, each pre-filled with what detection found:41421. **Docs home** — "Where is this project's documentation folder? Give me the path."432. **Second brain** — "Do you keep a second brain (Obsidian or similar)? Give me the path." (or: none)443. **Second-brain scope** — "Global across projects, or per-project? Explain45 the layout — or just say the word and I'll inspect it and guess where46 session knowledge should be filed." Record a guess AS a guess; propose it47 for approval, never silently trust it.484. **Deploy** — "I use generic deploy steps by default. Create — or point me49 to — a `<project>-deploy` skill with this repo's exact instructions and50 I'll follow it every ship." Record the skill, or `none` + the51 recommendation; offer to scaffold it now.525. **Debrief** — "Create — or point me to — a `<project>-debrief` skill that53 explains how your documentation structure works and I'll follow those54 guidelines." Record it; else the generic debrief flow.5556Write the answers into the repo (the file it already uses — `CLAUDE.md`, else57`AGENTS.md`, else create `CLAUDE.md`):5859```markdown60## conclude-it — project setup61- docs_home: docs/62- second_brain: ~/Vault/MyBrain # or: none63- second_brain_scope: global # global | per-project | none64- second_brain_notes: session knowledge → wiki/projects/<slug>/ (guessed — confirm)65- deploy_skill: acme-deploy # or: none (recommended: create acme-deploy)66- debrief_skill: acme-debrief # or: generic67- configured: YYYY-MM-DD68```6970If the user explicitly says "save this globally", ALSO write the answers as71user-level defaults; per-repo blocks always override. Consumers: the debrief72step runs `debrief_skill` against `docs_home`; the ledger card mirrors to the73second brain only when its scope says global; the ship pipeline deploys via74`deploy_skill` — `none` values degrade inline and the verdict repeats the75create-a-skill recommendation once.7677## The ship pipeline (ship-shaped sessions only)7879Fail-closed, in order. (The Claude Code plugin carries an expanded version in80`references/ship-pipeline.md`, loaded only when triage says ship-shaped; **this81file is self-contained** — on any other agent, run the steps below as written.)82831. **S0 Scope + rename** — name the epic in one line; rename the session84 `done-<name>`.852. **S1 Local gate** — run the project's REAL test/e2e scripts (dead placeholder86 scripts are never gate targets). RED → diagnose→fix→re-run via `/iterate`87 until green; a red local gate never proceeds to prod. No runnable suite? say88 "unverified", don't manufacture a pass.893. **S2 Merge + deploy** — merge hygiene per repo (never strand unmerged work),90 then the project's own deploy skill/path. Irreversible destructive steps91 still need an explicit yes.924. **S3 Prod gate** — smoke/e2e against prod. RED → fix, re-deploy, re-verify.93 No reachable prod target → close as "deployed-but-unverified", loudly.945. **S4 Archive** — `git mv` the epic's plan docs to their home's `0-done/`95 sibling; fix links.966. **S5 Backlog** — write deferred follow-ups where the next session will look,97 each note naming the originating session.987. **S6 PM board** — flip the epic's rows on the project's tracker, if one exists.99100## The session-close core (every session)1011021. **Confirm intent** — one line on what's about to happen.1032. **Debrief** — run the project's session-debrief (a generic one is bundled) so104 patterns/gotchas/decisions land in durable docs. Skip-if-done guard (check105 artifacts, not memory). **Require the supersession line**: a session that106 changed behaviour must show old docs updated or `status: deprecated` — never107 two "current" docs describing two versions of the same feature.1083. **Ledger card** — a ≤40-line OKR-style card (objective, honest key results,109 files touched, pointers, next) into `<repo>/.agents/history/` + INDEX row;110 every session gets one, so "which session did X?" stays answerable for ~150111 tokens instead of a transcript distillation.1124. **Mid-flight check** — background tasks, unmerged/uncommitted work, live113 server-side jobs, and sessions THIS session orchestrated (peers, headless114 spawns): each must be terminal or handed to the user by name. Never exit an115 orchestrator with a worker running unowned.1165. **Reap** — stop finished subagents once their output is captured in files;117 kill lingering headless processes by exact recorded PID only (never a118 pattern-matched kill).1196. **Footprint sweep** — remove what this session created and nothing120 references: worktrees, landed branches, remote/pod files, scratch. **Secrets121 at rest are swept FIRST and verified absent.** Clean only what you can prove122 you created; report the rest. Keep config backups and anything a durable doc123 cites.1247. **CONCLUDE_REPORT.html** (ship sessions) — a local, deterministic HTML125 double-check report (manifest + bundled `build-report.py` + template:126 light/dark toggle, badge cards, per-item "How to test" blocks, embedded127 markdown reports). RED/UNVERIFIED items get their own badge — a report that128 only shows the green half is a fake.1298. **Verdict** — ✅ safe to exit (with what was cleaned, what was deliberately130 left and why, and that no written credential is still at rest) or ⚠️ not yet131 (the specific blocker + the choice). Then STOP — the user types the quit.132133## What it never does134135- Advance past a red gate, skip a gate for a faster close, or report GREEN off a136 mock/skipped suite/targetless prod check.137- Deploy on a guess, or run irreversible destructive prod steps without an138 explicit yes.139- Re-run a debrief that already ran; skip the ledger card; glob-delete in shared140 locations; delete what a durable doc cites.141- Quit the process itself — it prepares the exit, the user takes it.142143## Portability — graceful degradation outside Claude Code144145This file is the complete, self-contained ritual: it runs on any146SKILL.md-compatible agent (Cursor, Codex CLI, Copilot, OpenCode, Windsurf,147Gemini CLI, and 70+ others via the Agent Skills standard). Some helpers it148names are Claude Code plugin pieces; when one is absent, degrade **inline and149say so** — never skip the step and never pretend the helper ran:150151- **`/iterate` / `/full-qa` absent** → run the diagnose→fix→re-test loop and152 the e2e/smoke verification yourself, inline. The gates and their fail-closed153 rules are unchanged.154- **Report machinery absent** (`build-report.py` + template ship only in the155 plugin) → write `CONCLUDE_REPORT.md` (markdown) with the identical structure:156 gates scoreboard first, per-item sections with status + "How to test" steps,157 RED/UNVERIFIED first-class.158- **Bundled `session-debrief` absent and the project has no debrief skill** →159 capture inline: dated session-log entry in the project's docs + the160 promotion/supersession sweep from the debrief spec (update durable pages, bump161 their verified-date, deprecate what the change replaced).162- **No subagent/rename primitives on this harness** → do the work in the main163 loop and emit the rename line for the user; the sweeps and verdict still run.164165Whatever ran inline gets named in the verdict ("debrief ran inline — no debrief166skill installed"), so the close is honest about its own machinery.167168## Install169170**Claude Code (plugin, recommended — full bundle: ship-pipeline reference, HTML171report machinery, bundled session-debrief):**172173```174/plugin marketplace add DevOtts/conclude-it175/plugin install conclude-it@devotts176```177178**Any SKILL.md-compatible agent (Cursor, Codex CLI, Copilot, OpenCode, Windsurf, …):**179180```181npx skills add DevOtts/conclude-it -a <agent> # peek first: npx skills add DevOtts/conclude-it --list182gh skill install DevOtts/conclude-it # GitHub CLI alternative183```184185**Getting started:** at the end of any working session —186187```188/conclude-it189```190191Plain sessions get the close core (debrief → ledger card → verification → reap →192sweep → verdict). Sessions that shipped get the full ship pipeline first — gates,193deploy, prod verification, archive — and a local `CONCLUDE_REPORT.html` you open194in the browser to double-check everything with "How to test" steps per item.195196## Security considerations197198- **Secrets-at-rest sweep**: the footprint step explicitly hunts credentials the199 session wrote to disk, remote hosts, or pods — removes them and verifies200 absence rather than trusting the delete.201- **Exact-PID kills only**: lingering processes are killed by the exact recorded202 PID, never by pattern match — a grep-kill can take out another session's work.203- **Proven ownership**: the sweep deletes only what the session can show it204 created; everything else is reported, never touched.205- **Deploy authorization is scoped**: invoking the ship path authorizes the206 deploy sequence, but irreversible destructive actions (data-dropping207 migrations, volume deletion) always require an explicit yes.208- **No hosted publishing**: the closeout report is a local file; nothing is209 published to hosted surfaces uninvited.210211---212_Authored by [DevOtts](https://github.com/DevOtts)._