From project-init
This skill should be used when the user says "session-end", "end session", "wrap session", "save handoff", "/session-end", "we're done", "sign off", or any request to wrap up a Cowork session and persist what was done plus what's next for the following session. It scans the conversation for what landed, what's still open, what's uncommitted, then writes a canonical-named handoff document to the project's `00 – Project Hub/cowork-session-handoff.md`. Step 5c keeps each writable GitHub repo's README.md current against the canonical 16-section structure. The companion `/session-start` skill reads the handoff file to brief next-session Claude.
How this skill is triggered — by the user, by Claude, or both
Slash command
/project-init:session-endThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Wrap a Cowork session by extracting what was done plus what's queued for next time, and persisting it to a canonical-named handoff document. The companion `/session-start` skill reads that exact file to brief next-session Claude in one step.
Wrap a Cowork session by extracting what was done plus what's queued for next time, and persisting it to a canonical-named handoff document. The companion /session-start skill reads that exact file to brief next-session Claude in one step.
Trigger when the user is wrapping a Cowork session and wants the work persisted in a way the next session can pick up. Common triggers:
/session-end [project-name]The skill assumes the project has been initialized via /init-project and has a saved cowork-project-instructions.md in its 00 – Project Hub/. If not, route the user to /init-project first.
The canonical path is [project]/00 – Project Hub/cowork-session-handoff.md. Single file. Overwritten each session-end. Drive versioning preserves history.
This filename is fixed. /session-start reads exactly this path. Don't add date suffixes, don't write to a different location, don't split into multiple files. Free-form continuation prompts can still live in 06 – Engineering/ or wherever for project-specific use, but the canonical handoff is at this fixed path.
If the user wants an explicit dated archive in addition to the canonical file, the --archive flag writes a copy to 00 – Project Hub/Session Handoffs/handoff-YYYY-MM-DD-HHMM.md. The canonical file is still written; the archive is an additional copy.
If the user passed a project name with the slash command (e.g. /session-end Nexus), use it directly. Otherwise, in order:
a. Check the currently-mounted folders. If exactly one Taskade subfolder is mounted (e.g. Taskade/Nexus), assume that's the project. Confirm via a single AskUserQuestion before proceeding.
b. If none is obviously mounted, scan Taskade/ and MoxyWolf Vault/Projects/ for subfolders that contain 00 – Project Hub/cowork-project-instructions.md. Sort by recency of modification of the saved instructions file. Present the top ~6 candidates via AskUserQuestion.
c. If the user passes a name that doesn't match any folder, list available project folders and ask them to pick (don't create new ones — that's /init-project's job).
Read Taskade/[PROJECT_NAME]/00 – Project Hub/cowork-project-instructions.md (or MoxyWolf Vault/Projects/[PROJECT_NAME]/00 – Project Hub/cowork-project-instructions.md for vault-only projects).
This gives you:
You'll cite specific repo names in the handoff's "Uncommitted code" section so next-session Claude knows where to look.
Review the full Cowork conversation. Identify items in each of the canonical handoff sections:
One short paragraph (3–6 sentences) summarizing what shipped, what state changed in production data, and what production rows / counts moved. Concrete numbers where possible. No lists in this section — it's the elevator-pitch context.
Examples:
A numbered list. Each item gets:
Items should be ordered by what next-session Claude should do first. Push uncommitted code typically goes first because most other work depends on it.
For every set of changes sitting in a working tree without a commit, write a full commit block: file list, summary line (under ~72 chars, imperative mood), description body in fenced code blocks. The point is that next-session Claude can paste these directly into GitHub Desktop without re-deriving them.
Per the operating norm norm-commit-messages-always-supplied-2026-05-08.md: every commit prompt must include both summary and description ready to paste.
If there's no uncommitted code, write _(none — working tree clean as of session end)_ and skip the section.
A bulleted list of cross-session memory references and project-specific gotchas. Pull from:
feedback_* and reference_* memories that apply)Don't repeat universal rules (the cowork-project-instructions.md covers those). Capture the project-specific gotchas next-session Claude wouldn't otherwise know.
A short quoted paragraph the user can paste into a fresh Cowork chat as the first message. Should orient next-session Claude in 1–3 sentences: what state we're in, what to do first.
Always end this paragraph with a final sentence pointing to the full handoff file's path, so next-Cowork knows where to read the full detail rather than working from the opening-line alone. Use the path relative to the mounted Cowork roots:
Taskade/[PROJECT_NAME]/00 – Project Hub/cowork-session-handoff.mdMoxyWolf Vault/Projects/[PROJECT_NAME]/00 – Project Hub/cowork-session-handoff.mdThe pointer sentence should be formatted exactly as: "The full handoff is at Taskade/[PROJECT_NAME]/00 – Project Hub/cowork-session-handoff.md." (backticks around the path). This wording is what /session-start looks for — keep it predictable.
Example: "Picking up after the multi-axis classifier landed. Two commits to push (Bloom's importer + term-def backfill), then run the term-def backfill, then we can spec variant morphology. The full handoff is at Taskade/Nexus/00 – Project Hub/cowork-session-handoff.md."
Use this exact structure. The frontmatter format is fixed so /session-start can parse it.
---
title: "Session Handoff — [Project Name]"
date: YYYY-MM-DD
session_ended: YYYY-MM-DDTHH:MM:SS-08:00
project: [Project Name]
type: session-handoff
status: active
---
# Session Handoff — [Project Name]
**Session ended:** YYYY-MM-DD HH:MM PT
## What landed this session
[paragraph]
## Open work, in priority order
### 1. [Task title]
[description + commands]
### 2. [Task title]
[description + commands]
[...]
## Uncommitted code
### Commit A — [short title]
Files:
- `path/to/file1.ext`
- `path/to/file2.ext`
**Summary:**
\`\`\`
[commit summary line]
\`\`\`
**Description:**
\`\`\`
[commit description body]
\`\`\`
[repeat per commit, or write _(none — working tree clean as of session end)_]
## Procedural reminders for next-Claude
- **[Reminder title]:** [body]. (Memory: `feedback_xxx`. Operating Norm: `path/to/norm.md`.)
- ...
## Suggested opening line
> *"[one- to three-sentence orientation paragraph]. The full handoff is at `Taskade/[PROJECT_NAME]/00 – Project Hub/cowork-session-handoff.md`."*
(For vault-only projects, substitute MoxyWolf Vault/Projects/[PROJECT_NAME]/00 – Project Hub/cowork-session-handoff.md for the path.)
Use the Write tool to write the composed document to:
[project's Taskade subfolder]/00 – Project Hub/cowork-session-handoff.md
For vault-only projects: MoxyWolf Vault/Projects/[PROJECT_NAME]/00 – Project Hub/cowork-session-handoff.md.
Always overwrite. Drive versioning preserves the previous version. Don't ask the user to confirm overwrite — the canonical file is meant to be replaced each session.
If the user passed --archive (e.g. /session-end Nexus --archive), also write a copy to:
[project's Taskade subfolder]/00 – Project Hub/Session Handoffs/handoff-YYYY-MM-DD-HHMM.md
Create the Session Handoffs/ subfolder if it doesn't exist. Use the user's local time for the filename timestamp.
The archive copy has identical content to the canonical file; it's just a dated record for cases where Drive versioning isn't trusted.
For every GitHub repo flagged READ/WRITE in the project's saved cowork-project-instructions.md, keep that repo's README.md as a living document. The point: never have to remember to update a repo's GitHub landing page by hand. Each session-end pass scans for changes that should propagate to README, drafts the edits, writes the file, and surfaces the change as a separate commit block in the handoff.
Read-only repos are skipped entirely, even if the session referenced their code.
Propose a README diff when the session touched any of:
npm run … commands, renamed scripts, removed scriptssupabase/migrations/, prisma/migrations/, or equivalent; new/dropped tables, columns, enums.env.*.example, new required env in code, renamed env varsdependencies / devDependencies (lockfile-only changes don't count); new internal workspace packagespackage.json version field changed, or a workspace package's version changedapp/**/page.tsx (or framework equivalent), or removed routesIf the session is purely bug fixes, test additions, comment edits, or no-op cleanups, skip Step 5c. Don't fabricate a README diff to fill space.
When updating (or initializing) a repo's README, it must carry these 16 sections in this order. The structure is canonical; the content within each section is repo-specific.
npm run / make target), local-dev runbook.text-fenced tree of top-level directories with one-line purpose each. Don't enumerate every file — show the shape.Optional 17th section if the repo has unusual contributor conventions: Contributing & Commit Workflow (direct-to-main vs PRs, push step, commit-message rules, npm-scope rules).
README.md in the writable repo.In the handoff's ## Uncommitted code section, add a separate commit block for the README change. Per operating norm feedback_commit_messages_always, every commit prompt includes both summary and description in fenced code blocks. Example:
### Commit B — Update README for v0.2 dedup migration
Files:
- `README.md`
**Summary:**
```
docs: surface dedup migration + dedup:nouns scripts in README
```
**Description:**
```
- Add migration 20260511180000_lexicon_noun_lemma_key_unique.sql to the
migrations table
- Add lexicon_dedup_review_queue to Database Schema
- Add migrate-noun-dedup.ts to Data Initialization with dry-run and
production npm scripts
- Note the partial-unique index posture on lexicon_nouns.lemma_key
```
Order the README commit after the substantive code commits (the README documents the code, so code lands first).
If a writable repo has no README (or just a create-next-app boilerplate), and the session involved substantive changes, treat that as a signal to author a fresh README using the 16-section canonical structure. Don't fabricate content — pull from the repo's actual code, package.json, schema, env files, and the project's cowork-project-instructions.md. If the session didn't produce enough material to fill the structure responsibly, flag "Author initial README" as a follow-up task in the handoff's Open work section and continue.
If the session produced significant new context that future Claude sessions should know without reading the handoff (operating norms, durable architecture decisions, gotchas that apply across all projects), update the Cowork session-memory layer:
feedback_*.md for behavioral rules surfaced this sessionproject_*.md for project-state changesreference_*.md for durable referencesMEMORY.md indexThis step is optional — only do it if the handoff alone won't carry the weight. Most session-end runs don't need a memory update.
/obsidian-update to persist cross-project knowledge to the vaultAfter the handoff is written, always invoke the /obsidian-update:obsidian-update skill to capture the session's durable knowledge into the MoxyWolf Obsidian vault.
Invocation: call the Skill tool with skill: "obsidian-update:obsidian-update". The skill scans the current conversation for decisions made, research findings, meeting discussions, cross-project insights, action items, and new contacts, then writes properly formatted, cross-linked Markdown notes into the vault.
This is the layer above the project-scoped handoff:
00 – Project Hub/ and tells next-session Claude how to resume this project specifically.MoxyWolf Vault/_Shared Knowledge/, daily notes, project notes, and people notes. Surfaces cross-project patterns and durable institutional knowledge that /session-start won't necessarily look at but humans and search will.All three layers run together at session-end so the wrap-up is one command, not three.
If /obsidian-update finds nothing extractable (quick clarification session, casual chat), it will say so honestly and produce no notes — that's fine. Pass it through; don't suppress.
If the obsidian-update skill is unavailable in this Cowork install (rare — both plugins ship in the MoxyWolf marketplace), log a one-line warning in the final report and continue. Don't abort the session-end wrap-up because the vault update step is unavailable.
Output a short summary in chat:
## Session handoff saved
✅ [project]/00 – Project Hub/cowork-session-handoff.md
Top of stack for next session:
1. [first open-work item title]
2. [second open-work item title]
3. [third open-work item title, if applicable]
[N] uncommitted commits drafted in the handoff.
[N] procedural reminders captured.
[If Step 5c wrote README updates:]
README updates written:
- [repo-name]/README.md — [one-line summary of what changed]
(Commits drafted in the handoff; push via GitHub Desktop next session.)
[If --archive was used:]
Archive: [project]/00 – Project Hub/Session Handoffs/handoff-YYYY-MM-DD-HHMM.md
## Vault updated via /obsidian-update
[Summary that /obsidian-update returned: N decision notes, N research notes, N daily-journal entries, N people notes, etc. — or "nothing extractable" if that's what came back.]
Run `/session-start [project]` next time to pick up.
Keep it factual. Dorian can open the file in Obsidian to review the full handoff if he wants the detail.
/init-project first. Don't write a handoff for a project that doesn't have a config.cowork-session-handoff.md from a previous session. Overwrite. Drive versioning preserves the prior version. The canonical file is meant to reflect "the most recent handoff," not an append-only log.mcp__cowork__request_cowork_directory with the explicit path to mount it, then write./obsidian-update mid-session, then runs /session-end. Fine. /session-end invokes /obsidian-update again at Step 7. The second run is idempotent on already-captured content — it'll find less to extract since the mid-session run already wrote the bulk of it. No deduplication needed; obsidian-update handles "I've already seen this" itself./obsidian-update skill unavailable in this Cowork install. Skip Step 7 with a one-line warning in the final report ("Vault update skipped: obsidian-update skill not available"). Don't abort — the handoff (Step 5) is the load-bearing artifact.cowork-session-handoff.md — /session-start reads exactly this path. If we let session-end pick filenames freely, session-start can't find the handoff reliably. One canonical file, always at the same path, is the contract between the two skills.00 – Project Hub/ — the same folder that holds cowork-project-instructions.md (the stable project config). Handoffs sit next to instructions; both are project-level metadata./session-start parses this structure to surface "Open work" and "Suggested opening line" in its briefing. Deviating from the section names breaks that parse.--archive) are available when you want a dated file in the filesystem; they're not the default./session-start (read the handoff next time) and bundles /obsidian-update (extract durable knowledge to the vault) as a final step. One wrap-up command writes the project-scoped handoff AND captures cross-project knowledge in the vault — no need to remember to run two commands./obsidian-update, which now runs automatically at Step 7.npx claudepluginhub moxywolfllc/moxywolf-plugins --plugin project-initFetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Applies a firm's KYC/AML rules grid to parsed onboarding records: assigns risk rating, checks required documents, outputs rule outcomes with citations, and routes for escalation.
Generates daily or weekly digests of activity from connected sources (chat, email, docs, tasks, CRM), highlighting action items, decisions, mentions, and project updates.