Installs into .claude/skills of the current project.
Are you the author of In Finish?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/matthewsinclair-in-finish)
---
description: "Session finish (fold): update ST docs, wip.md, restart.md, commit cleanly. localfold = per-workstream before a compact; globalfold = project-wide before EOD"
chains_to: ["in-whiteboard", "in-verify"]
---
# Session Finish
End-of-session wrap-up. Ensure all state is captured so the next session can pick up cleanly.
## Fold scopes: localfold and globalfold
"Fold" is shorthand for this wrap-up (compact, tidy, snapshot). Two scopes, coined in the Lamplight project:
- **localfold** -- per-workstream tidy before a **compact** or context reset. Fold only THIS workstream's own Intent docs and whiteboard node: its ST/WP docs, its in-progress state, and (in a whiteboard project) its own-node `archive`. Scope is just you; you do not touch project-wide docs or other nodes. **IT DOES NOT `release`.** A compact is not the end of a session, so the node's `status` stays `active` -- `/in-whiteboard` invariant 6 says so and its red-flag table names setting `paused` here as the error. This line read `archive` + `release` until 2026-08-31, contradicting that invariant, and step 1 below contradicted it a second time; both are corrected. Release belongs to a session that is actually ending.
- **globalfold** -- project-wide tidy before **end of day**, when all workstreams close out. Fold the shared project tracking docs (`intent/wip.md`, `intent/restart.md`, `done.md`) into a coherent snapshot. In a multi-node setup this is typically the coordinating / validation workstream's job, not every node's.
When the human says "localfold", run the wrap below scoped to your own workstream; when they say "globalfold", run the project-wide version across the shared docs. A solo project has one workstream, so local and global coincide.
## Procedure
### 1. Release the whiteboard
If `intent/whiteboard/` exists in the project root **and this session is actually ending**, invoke `/in-whiteboard release`. This sets your node's board `status: paused` and refreshes its heartbeat before any doc updates are committed. **If you are folding before a `/compact` or a context reset, DO NOT release** -- run `/in-whiteboard touch` instead and leave `status: active`. The discriminator is whether the SESSION ends, never whether a fold happened. Before releasing, consider whether any entries in your node's `## Decisions` should be migrated into `wip.md` / `done.md` for permanent record -- the whiteboard is the live channel, `wip.md` / `done.md` are the snapshots. If the directory doesn't exist, skip silently.
### 2. Update steel thread docs
For each ST/WP worked on this session:
- Write the thread's objective and context through `intent set <ID> objective|context --from <file>` (or `intent st edit <ID>`)
- Update the attached companion documents the thread carries (`design.md`, `impl.md`, `tasks.md`) with as-built status; `intent st edit <ID> <name> --path` names each and refuses one the thread does not carry, and `intent st attach <ID> <name>.md --from <file>` adds one
- Closing a thread or WP? `intent st done` / `intent wp done` refuse while its `acceptance.md` contract is BLOCKED (the close-gate). Cover or satisfy the remaining ACs first; the ST-level sign-off AC is the verifier's. See `working-with-llms.md` (D11).
- **An AC you are not going to do has two honest exits, and neither is satisfying it.** If it moved to another thread, `intent ac descope <id> <AC> --to <ID>`; if it was dropped, `intent ac withdraw <id> <AC> --reason "..."`. Both are non-blocking and both stay on the record. Reach for them instead of the two alternatives that lose the truth: marking work done that was not, or deleting the line. `intent ac rescope` / `reinstate` undo them.
- **BLOCKED on an AT contract finding, not an unsatisfied AC?** The gate lints the AT rows too -- a row that fails the grammar, or a `green` AT citing a file that does not exist, is coverage that cannot be resolved. `intent at lint <id>` names each one; fix each row it names by hand with `intent at edit <id> <AT-id>`.
- `st done` / `wp done` close a unit whose `## Objective` is still `_(not yet written)_`, and warn when they do. A unit that closed with that warning closed without anyone having said what it was for -- write the sentence with `intent set <ID> objective --from <file>`, ideally before closing.
### 3. Update work-in-progress
Update `intent/wip.md` with:
- Current state of in-progress work
- What's next
**`wip.md` IS DOING AND TODO ONLY. DONE WORK IS ILLEGAL IN IT, AND THIS LIST USED TO ORDER THE OPPOSITE.** Its first bullet read _What was accomplished this session_ until 2026-09-08 -- so the skill every node runs at wrap-up instructed the precise thing the file's own name forbids, and a human then corrected it by hand, repeatedly, across projects. **A repeated correction is a document defect, not a discipline failure**: nodes were following the instruction they were given.
Finished work already has homes that outlive the session and cannot rot -- the commit, the closed issue, the satisfied AC, `done.md`. **Restating it in `wip.md` gives one fact a second home whose only distinguishing property is that nobody updates it**, which is the divergence this section's own history is about.
The test before you write a line here: **would this line still be true if the work were abandoned tomorrow?** DOING and TODO survive that question. _What was accomplished_ does not -- it is a claim about the past, and `wip.md` is not a log.
### 4. Update restart context
Update `intent/restart.md` with:
- Key context the next session needs
- Any decisions made or deferred
- Pointers to relevant files and STs
`.claude/restart.md` is the ENTRY POINT and holds NO STATE. It says where to start and points at the two files above; it does not carry WIP, TODO, focus, or a summary of current work. Leave it alone unless the entry procedure itself changed.
**This is a rule with a history.** These three files were three copies of one narrative, each opening with a banner declaring it superseded the others -- which is the tell that nobody was deleting, only prepending. They were folded back into one on 2026-08-24. **State written here is how that rebuilds**, because the same content then has three homes and three values, and nothing reports the divergence.
**If you find yourself writing a supersedes banner, delete what it supersedes instead.**
### 5. File quality checks
- No non-printing characters in any files (proper emojis and ASCII only)
- All markdown tables are column-aligned
- No Claude signature in commit messages
### 6. ONLY update .md doc files
Do NOT write new code during session finish. This step is documentation only. Commit the documentation updates.
## Skill Chain
Before finishing, consider:
- `/in-whiteboard release` -- pause this session's whiteboard node (step 1 runs it when `intent/whiteboard/` exists AND the session is actually ending; a fold before `/compact` runs `touch` instead)
- `/in-verify` -- verify any completion claims made this session
## Red Flags
| Rationalization | Reality |
| ---------------------------------------- | ------------------------------------------------------------ |
| "I'll update restart.md next session" | Next session won't have this context. Write it now. |
| "The code speaks for itself" | Code changes without docs are invisible to the next session. |
| "Just one more quick fix before wrap-up" | Finish means finish. No new code. |