Overview
Session activity logger that builds a summary of what happened in the current session. Useful for handoff between developers, standup preparation, and session documentation.
When to Use
- Handing the work to another developer at the end of a session.
- Preparing standup notes from what the session actually changed.
- Recording what a long session did before the context is cleared.
For resumable working state, use /checkpoint save; for corrections that change how the assistant works, use /retro.
Invocation
| Invocation |
Action |
/session-log |
Display session summary in the conversation |
/session-log export |
Export session summary as a markdown file |
Steps
Gather git activity. Collect commits made during this session:
- Run
git log --oneline --since="<session start or today>" to find recent commits.
- If no commits exist since today, check the last 24 hours.
- For each commit: hash, message, files changed.
Gather file changes. Identify all files modified in the session:
- Run
git diff --name-status for uncommitted changes.
- Run
git diff --cached --name-status for staged changes.
- Categorize: added, modified, deleted, renamed.
Gather test activity. Check if tests were run during the session:
- Look for test output in the conversation history.
- Summarize: test suite name, pass/fail counts, coverage if reported.
Gather decisions. Scan the conversation for decisions made during the session:
- Architecture choices.
- Trade-offs discussed and resolved.
- Scope changes agreed upon.
- Rejected approaches with reasons.
Identify next steps. Based on the session context:
- What remains unfinished?
- What follow-up tasks were identified?
- What blockers exist?
Format the output. Compile into a structured summary.
Output
## Session Log
**Date:** <timestamp GMT>
**Duration:** <approximate>
**Branch:** <current branch>
### Commits
| Hash | Message |
|------|---------|
| <short hash> | <commit message> |
### Files Changed
| Status | File |
|--------|------|
| M | <path> |
| A | <path> |
| D | <path> |
### Tests
| Suite | Passed | Failed | Coverage |
|-------|--------|--------|----------|
| <name> | <count> | <count> | <percentage or N/A> |
### Decisions
1. <Decision made and rationale>
2. <Decision made and rationale>
### Next Steps
- [ ] <Remaining task>
- [ ] <Follow-up identified>
- [ ] <Blocker to resolve>
Export mode
When /session-log export is invoked:
Inside a git repository, write the output to session-log-<YYYY-MM-DD-HHMM>.md in the project workspace, per rules/project-workspace.md. Resolve the workspace root with hooks/_lib/project_workspace.py the same way /checkpoint does, never by guessing:
python3 -c 'import sys,pathlib; sys.path.insert(0, str(pathlib.Path.home()/".claude/hooks")); from _lib import project_workspace as pw; top = pw.toplevel(pathlib.Path.cwd()); print(top / pw.resolve_root(top))'
Outside a git repository, write it to the scratchpad directory.
The workspace is excluded through .git/info/exclude, so the export stays out of commits and the project's own files stay untouched.
Confirm the file path after writing.
Durable Facts
This skill runs only when the user invokes it. While building the log, route each finding by what it is:
| Finding |
Destination |
| Task state, open decisions, next steps |
The log itself. When the work resumes in a later session, offer to call the Skill tool with checkpoint and the argument save |
| A fact a future session needs, such as a gotcha with no trace in code or a decision with lasting effect |
Call the Skill tool with brain and the argument capture, once per fact, after the user approves the list |
| A correction to how the assistant works |
Name it in the log and suggest /retro, which routes it to a rule, a skill, or the vault |
Never write MEMORY.md or any memory file. The memory directory is compiled from the vault, per the Knowledge Single Source of Truth section of CLAUDE.md. When SECOND_BRAIN_VAULT does not resolve to a directory, list the durable facts under a Worth keeping heading in the log and tell the user that no vault is configured to hold them.
Rules
- All timestamps in GMT.
- Do not fabricate session activity. Only include what actually happened based on git history and conversation context.
- Decisions must reflect what was actually discussed, not inferred preferences.
- Keep each section concise. The reader needs a quick overview, not a transcript.
- If no activity exists in a section, state "None this session" instead of omitting the section.
Common Rationalizations
- "The tests probably ran, so list them as passing": a test row needs output from this conversation. With no output, the Tests section says "None this session".
- "The project root is the obvious place for the export": the root belongs to the project. The export goes to the resolved workspace, which git ignores locally.
- "This fact is worth remembering, so write it to memory": memory is compiled from the vault. Route the fact through
brain capture, or list it under Worth keeping when no vault exists.
- "The decision was implied, so record it": the Decisions section holds only what the conversation settled out loud.
Red Flags
- Stop and drop the row when a commit, test result, or decision has no source in
git log or the conversation.
- Stop and resolve the workspace with the helper when the export path you are about to write is the repository root or a tracked directory.
- Stop and ask for approval of the fact list before the first
brain capture call.
- Stop and convert to GMT when a timestamp carries a local offset.
Verification
- Every commit hash in the log appears in
git log output from this session.
- Every section is present, with "None this session" where it is empty.
- An export lands under the resolved workspace root or the scratchpad directory, and
git status --short does not list it.
- No file in the memory directory was written.
Related skills
/retro -- Deeper retrospective that persists learnings as config.
/checkpoint -- Save working state for cross-session resumption.
/morning -- Start-of-day sweep of pending work across every git account.
/ship commit -- Commit changes identified in the session log.
1---2name: session-log3description: Summarize the current session's files changed, tests run, commits, and decisions as handoff or standup notes.4disable-model-invocation: true5argument-hint: "/session-log | /session-log export"6allowed-tools: "Read, Bash, Write, Skill"7sensitive: true8metadata:9 source: https://skillmd.com/skills/gufranco/session-log10---1112## Overview1314Session activity logger that builds a summary of what happened in the current session. Useful for handoff between developers, standup preparation, and session documentation.1516## When to Use1718- Handing the work to another developer at the end of a session.19- Preparing standup notes from what the session actually changed.20- Recording what a long session did before the context is cleared.2122For resumable working state, use `/checkpoint save`; for corrections that change how the assistant works, use `/retro`.2324## Invocation2526| Invocation | Action |27|-----------|--------|28| `/session-log` | Display session summary in the conversation |29| `/session-log export` | Export session summary as a markdown file |3031---3233## Steps34351. **Gather git activity.** Collect commits made during this session:36 - Run `git log --oneline --since="<session start or today>"` to find recent commits.37 - If no commits exist since today, check the last 24 hours.38 - For each commit: hash, message, files changed.39402. **Gather file changes.** Identify all files modified in the session:41 - Run `git diff --name-status` for uncommitted changes.42 - Run `git diff --cached --name-status` for staged changes.43 - Categorize: added, modified, deleted, renamed.44453. **Gather test activity.** Check if tests were run during the session:46 - Look for test output in the conversation history.47 - Summarize: test suite name, pass/fail counts, coverage if reported.48494. **Gather decisions.** Scan the conversation for decisions made during the session:50 - Architecture choices.51 - Trade-offs discussed and resolved.52 - Scope changes agreed upon.53 - Rejected approaches with reasons.54555. **Identify next steps.** Based on the session context:56 - What remains unfinished?57 - What follow-up tasks were identified?58 - What blockers exist?59606. **Format the output.** Compile into a structured summary.6162### Output6364```65## Session Log6667**Date:** <timestamp GMT>68**Duration:** <approximate>69**Branch:** <current branch>7071### Commits72| Hash | Message |73|------|---------|74| <short hash> | <commit message> |7576### Files Changed77| Status | File |78|--------|------|79| M | <path> |80| A | <path> |81| D | <path> |8283### Tests84| Suite | Passed | Failed | Coverage |85|-------|--------|--------|----------|86| <name> | <count> | <count> | <percentage or N/A> |8788### Decisions891. <Decision made and rationale>902. <Decision made and rationale>9192### Next Steps93- [ ] <Remaining task>94- [ ] <Follow-up identified>95- [ ] <Blocker to resolve>96```9798### Export mode99100When `/session-log export` is invoked:101- Inside a git repository, write the output to `session-log-<YYYY-MM-DD-HHMM>.md` in the project workspace, per [`rules/project-workspace.md`](../../rules/project-workspace.md). Resolve the workspace root with [`hooks/_lib/project_workspace.py`](../../hooks/_lib/project_workspace.py) the same way [`/checkpoint`](../checkpoint/SKILL.md) does, never by guessing:102103 ```bash104 python3 -c 'import sys,pathlib; sys.path.insert(0, str(pathlib.Path.home()/".claude/hooks")); from _lib import project_workspace as pw; top = pw.toplevel(pathlib.Path.cwd()); print(top / pw.resolve_root(top))'105 ```106107- Outside a git repository, write it to the scratchpad directory.108- The workspace is excluded through `.git/info/exclude`, so the export stays out of commits and the project's own files stay untouched.109- Confirm the file path after writing.110111## Durable Facts112113This skill runs only when the user invokes it. While building the log, route each finding by what it is:114115| Finding | Destination |116|---------|-------------|117| Task state, open decisions, next steps | The log itself. When the work resumes in a later session, offer to call the Skill tool with `checkpoint` and the argument `save` |118| A fact a future session needs, such as a gotcha with no trace in code or a decision with lasting effect | Call the Skill tool with `brain` and the argument `capture`, once per fact, after the user approves the list |119| A correction to how the assistant works | Name it in the log and suggest `/retro`, which routes it to a rule, a skill, or the vault |120121Never write `MEMORY.md` or any memory file. The memory directory is compiled from the vault, per the Knowledge Single Source of Truth section of [`CLAUDE.md`](../../CLAUDE.md). When `SECOND_BRAIN_VAULT` does not resolve to a directory, list the durable facts under a `Worth keeping` heading in the log and tell the user that no vault is configured to hold them.122123## Rules124125- All timestamps in GMT.126- Do not fabricate session activity. Only include what actually happened based on git history and conversation context.127- Decisions must reflect what was actually discussed, not inferred preferences.128- Keep each section concise. The reader needs a quick overview, not a transcript.129- If no activity exists in a section, state "None this session" instead of omitting the section.130131## Common Rationalizations132133- "The tests probably ran, so list them as passing": a test row needs output from this conversation. With no output, the Tests section says "None this session".134- "The project root is the obvious place for the export": the root belongs to the project. The export goes to the resolved workspace, which git ignores locally.135- "This fact is worth remembering, so write it to memory": memory is compiled from the vault. Route the fact through `brain` capture, or list it under `Worth keeping` when no vault exists.136- "The decision was implied, so record it": the Decisions section holds only what the conversation settled out loud.137138## Red Flags139140- Stop and drop the row when a commit, test result, or decision has no source in `git log` or the conversation.141- Stop and resolve the workspace with the helper when the export path you are about to write is the repository root or a tracked directory.142- Stop and ask for approval of the fact list before the first `brain` capture call.143- Stop and convert to GMT when a timestamp carries a local offset.144145## Verification146147- Every commit hash in the log appears in `git log` output from this session.148- Every section is present, with "None this session" where it is empty.149- An export lands under the resolved workspace root or the scratchpad directory, and `git status --short` does not list it.150- No file in the memory directory was written.151152## Related skills153154- `/retro` -- Deeper retrospective that persists learnings as config.155- `/checkpoint` -- Save working state for cross-session resumption.156- [`/morning`](../morning/SKILL.md) -- Start-of-day sweep of pending work across every git account.157- `/ship commit` -- Commit changes identified in the session log.