Includes the minimax-mesh switch to M3.1-Flash-Preview at effort low, README/reflection-state refresh, and removal of two old session logs.
14 KiB
name, description, allowed-tools
| name | description | allowed-tools |
|---|---|---|
| end-session | End-of-session wrap-up. Captures a session log; for planner-backed projects writes a session status doc to the work-items store (the authoritative state source); updates CONTEXT.md as a thin cache for planner projects or fully for non-planner projects; refreshes project docs (README, CLAUDE.md, FUTURE.md) with anything that changed this session. Just run /end-session when you're done working. | Read, Edit, Write, Grep, Glob, Bash(git log *), Bash(git diff *), Bash(date *), Bash(ls *), Bash(cat *), Bash(find *), Bash(rm *), Bash(mkdir *), Bash(sed *), Bash(python3 -m lib.cp_cli *) |
End-of-Session Skill
You are wrapping up a session. This skill captures a session log, updates CONTEXT.md for resumption, and refreshes project documentation with changes from this session.
Pre-gathered context
Current date and session timestamp
!date +%Y-%m-%d
!date +%Y%m%d-%H%M%S
Git log (last 30 commits)
!git log --oneline -30 2>/dev/null || echo "Not a git repo"
Git status
!git status --short 2>/dev/null || echo "Not a git repo"
Current MEMORY.md
!cat MEMORY.md 2>/dev/null || echo "No MEMORY.md found"
Current CONTEXT.md
!cat CONTEXT.md 2>/dev/null || echo "No CONTEXT.md found"
Current FUTURE.md
!cat FUTURE.md 2>/dev/null || echo "No FUTURE.md found"
Current README.md (scripts section)
!sed -n '/## Scripts/,/^## /p' README.md 2>/dev/null | head -60 || echo "No Scripts section found"
Current README.md (milestone table)
!sed -n '/## Milestones/,/^## /p' README.md 2>/dev/null | head -40 || echo "No Milestones section found"
Available scripts
!ls -1 scripts/ 2>/dev/null || echo "No scripts directory"
Existing log files
!ls -1 memory/log/ 2>/dev/null || echo "No log directory yet"
Reflection state
!cat .reflection-state.json 2>/dev/null || echo "No reflection state yet"
Settings
(Read ~/dev/claude/projects/claude-foundations/settings.yaml using the Read tool. If not found, use defaults: retention_days=7, warn_unreflected_days=14)
Phase 1: Session Log
Step 1.1: Create the log directory if needed
If memory/log/ does not exist, create it with mkdir -p memory/log/.
Step 1.2: Write the log file
Review the full conversation history and extract key points worth preserving. If the session was trivial (a typo fix, a quick question), note that and write a minimal log.
Generate the filename as memory/log/YYYY-MM-DD.<HHMMSS>.md using the pre-gathered date and timestamp values.
Write the file using this format:
# Session Log -- YYYY-MM-DD
## Summary
<!-- 1-2 sentence overview of what was accomplished -->
## Decisions
<!-- Omit section if none -->
- Decision: <what> -- Rationale: <why>
## Gotchas Discovered
<!-- Omit section if none -->
- **[topic]** Symptom: <what happened> -- Fix: <what resolved it>
## Open Questions
<!-- Omit section if none -->
- <question>
## Key Context
<!-- Omit section if none -->
- <fact>
## Process Notes
<!-- Omit section if none -->
- <note>
Guidelines:
- Omit empty sections entirely
[topic]tags on gotchas should match existing memory topic names where possible- Keep entries concise -- raw material for
/reflect-logs
Step 1.3: Prune old logs
- Read
retention_daysandwarn_unreflected_daysfrom settings (defaults: 7 and 14) - Read
.reflection-state.jsonto know which logs have been reflected on - For each file in
memory/log/:- Parse the date from the filename (first 10 characters:
YYYY-MM-DD) - If older than
retention_daysAND present in.reflection-state.json-- delete it - If older than
warn_unreflected_daysAND NOT in.reflection-state.json-- warn:WARNING: <filename> is N days old and has NOT been reflected on. Run /reflect-logs. - Otherwise -- leave it alone
- Parse the date from the filename (first 10 characters:
Phase 2: Update state — planning store (primary) or CONTEXT.md (fallback)
Detect whether the project has a planner: look for cp-cli planner in the project's
CLAUDE.md. If found, the project has a live planner and Step 2.1 applies. Otherwise go
to Step 2.2 (CONTEXT.md-only flow).
Long-term goal: for planner-backed projects, CONTEXT.md is being retired in favour of
scripts/get_contextas the authoritative live state source. Until it is removed, keep the CONTEXT.md "Current State" header updated as a thin cache — one line per major change — but do NOT write new narrative detail there. All narrative goes to work-items.
Step 2.1: Planning-store write-back (projects WITH a planner)
The session is not finished until delivered work is written back to the planner.
scripts/get_context is what future sessions and agents see — stale items mislead them.
-
Assess what this session delivered or advanced: milestones progressed/completed, bugs fixed, features shipped, specs updated, pipelines deployed.
-
Write a session status document (
session-YYYY-MM-DD-<slug>.md) capturing:- What was done and the key commits
- Root causes / decisions / gotchas discovered
- Current cluster/deployment state (image version, what's live)
- What's next
Write to
/tmp/<name>.md, then upload to the most relevant item(s) with:python3 -m lib.cp_cli planner items documents put <item-uuid> <name>.md --file /tmp/<name>.mdUpload to whichever item(s) the work actually belongs to (milestone, epic, bug, etc.). If the work spans multiple items, one doc is enough — upload it to the primary one.
-
Update item flow states for anything that completed this session:
python3 -m lib.cp_cli planner items update <uuid> --flow-state completed- If the planner doesn't support direct state updates, note it in the doc and skip.
-
Check roll-up documents for contradictions: any epic overview or delivery map that summarises affected milestones must not contradict reality after this session's changes. Fix what you have ground truth for; flag the rest.
-
Update CONTEXT.md as a thin cache only — find the "Current State" section and update just the cluster image version and a one-liner about what changed. Do NOT add new narrative sections. Resist the urge to expand CONTEXT.md; that information belongs in work-items. If CONTEXT.md doesn't exist yet, do not create it.
-
If nothing this session touched milestone/epic-level state, still write a brief session doc to the most relevant item so
scripts/get_context --show-rcacaptures it.
Step 2.2: CONTEXT.md update (projects WITHOUT a planner)
For projects with no planner, CONTEXT.md is still the primary handoff mechanism.
Based on the full conversation, determine:
- What work is actively in progress (not yet complete)?
- What was completed this session that changes the project's focus?
- What should the next session pick up first?
- Are there blockers, pending decisions, or things to verify?
Follow the thin-index pattern:
- Remove completed entries from CONTEXT.md that are no longer active.
- Add or update entries for active work streams, linking to detail files in
context/. - Create or update
context/<topic>.mdfiles with enough detail for a fresh session to resume without re-reading the full conversation:- What's the current state?
- What was the last thing done?
- What should be done next?
- Any gotchas, blockers, or decisions pending?
- Key file paths, commands, or references needed to continue.
- If
context/directory doesn't exist and there are active work streams, create it.
Principles:
- Write for a Claude session with zero conversation history.
- Be specific: file paths, branch names, error messages, command sequences.
- Don't duplicate what's in CLAUDE.md or MEMORY.md — reference those instead.
- If there's nothing active:
No active work streams. Project is at a clean stopping point.
Step 2.3: RCA document write-back
If this session root-caused a real incident — a bug, outage, or regression with a clear
symptom, root cause, and fix, not just routine debugging — and the project's planning store
supports an incident item type (check the store's DATA_VALUES.md/CLAUDE.md for an
incident type and an rca-<date>-<slug>.md naming convention; most projects will not have
this, in which case skip this step entirely):
- Find or create the
incidentitem. Search the planning store for an existingtype: incidentitem covering this incident before creating a new one. - Write the full postmortem as
rca-<date>-<slug>.md, where<date>is the date the incident occurred (not today, if determinable from git history/logs) and<slug>is a short kebab-case description. Cover symptom, root cause, fix, and impact — this is the durable narrative; the item'sCONTEXT.mdbody stays a short summary. - Upload it to the
incidentitem:- CP reachable:
python3 -m lib.cp_cli planner items documents put <incident-item-uuid> rca-<date>-<slug>.md --file <path> - CP unreachable but the store has a local git checkout: write the file directly under
by-uuid/<incident-item-uuid>/rca-<date>-<slug>.mdthere and note in CONTEXT.md that it needs a commit/push. - Neither: stage it in the project's offline staging dir (e.g.
local-planning/) and record the pending upload in CONTEXT.md.
- CP reachable:
- Link every affected item to the incident via the
impacted/impacted_byrelationship verb (or whatever the store'sDATA_VALUES.mdnames it) — one document on theincidentitem, one relationship edge per affected item, not copies of the document. - If nothing this session rises to postmortem-worthy, skip this step and say so.
Skip this step entirely when the project has no external planning store.
Step 2.4: RCA document write-back
If this session root-caused a real incident — a bug, outage, or regression with a clear
symptom, root cause, and fix, not just routine debugging — and the project's planning store
supports an incident item type (check the store's DATA_VALUES.md/CLAUDE.md for an
incident type and an rca-<date>-<slug>.md naming convention; most projects will not have
this, in which case skip this step entirely):
- Find or create the
incidentitem. Search the planning store for an existingtype: incidentitem covering this incident before creating a new one. - Write the full postmortem as
rca-<date>-<slug>.md, where<date>is the date the incident occurred (not today, if determinable from git history/logs) and<slug>is a short kebab-case description. Cover symptom, root cause, fix, and impact — this is the durable narrative; the item'sCONTEXT.mdbody stays a short summary. - Upload it to the
incidentitem:- CP reachable:
python3 -m lib.cp_cli planner items documents put <incident-item-uuid> rca-<date>-<slug>.md --file <path> - CP unreachable but the store has a local git checkout: write the file directly under
by-uuid/<incident-item-uuid>/rca-<date>-<slug>.mdthere and note in CONTEXT.md that it needs a commit/push. - Neither: stage it in the project's offline staging dir (e.g.
local-planning/) and record the pending upload in CONTEXT.md.
- CP reachable:
- Link every affected item to the incident via the
impacted/impacted_byrelationship verb (or whatever the store'sDATA_VALUES.mdnames it) — one document on theincidentitem, one relationship edge per affected item, not copies of the document. - If nothing this session rises to postmortem-worthy, skip this step and say so.
Phase 3: Update Project Documentation
Review the conversation for changes that should be reflected in project docs. Only update files where this session actually changed something relevant -- don't touch files that are already accurate.
Step 3.1: FUTURE.md
If new improvement ideas, feature requests, or tech debt surfaced during this session, add them to FUTURE.md using the standard format:
- Problem: What's painful or manual today
- Idea: What the improvement looks like
- Open questions: Unknowns to research before starting
- Depends on: Other items or milestones that should come first
Skip this step if no new ideas emerged.
Step 3.2: README.md
Update if any of these changed this session:
- Milestone table -- update status if a milestone progressed or completed
- Scripts section -- add any new scripts created this session (with purpose and usage)
- Setup instructions -- if new dependencies, environment changes, or setup steps were introduced
Skip this step if README.md is already accurate.
Step 3.3: CLAUDE.md (and claude/ detail files)
Update if any of these changed this session:
- Repo structure -- new directories, moved files, renamed components
- Conventions -- new patterns or rules discovered during implementation
- Environment details -- new URLs, IPs, service endpoints, credentials references
- Common operations -- new how-to recipes worth preserving
If the project follows the thin-index pattern (a claude/ directory with per-topic detail
files referenced from CLAUDE.md), put per-subsystem changes in the appropriate
claude/<topic>.md file rather than the root CLAUDE.md. Only edit the root CLAUDE.md for
always-applies guardrails, the architecture overview, or the pointer table itself (e.g.,
adding a row for a new detail file).
Skip this step if CLAUDE.md and the relevant detail file are already accurate.
Phase 4: Summary
Print a concise summary:
Session log:
- Log file path created
- Number of entries by section
- Any files pruned or warnings issued
State update:
- (planner project) Which items got a session doc uploaded; any flow-state changes; CONTEXT.md current-state one-liner
- (no-planner project) What CONTEXT.md now points to; what the next session should pick up
Doc updates:
- Which files were updated (FUTURE.md, README.md, CLAUDE.md) and what changed
- Or "No doc updates needed" if everything was already accurate
Quality Checks
- Gotchas include symptom AND fix, not just "X was tricky"
- Process lessons are phrased as rules ("Always X before Y")
- (planner) Session status doc is uploaded to the correct item; CONTEXT.md current-state is updated to one line
- (no-planner) CONTEXT.md entries are specific enough to resume from without conversation history; detail files include file paths, branch names, and next steps
- Future items have all four fields (Problem/Idea/Open questions/Depends on)
- Doc updates are minimal and accurate -- only touch what actually changed this session
- README scripts section lists every script with purpose and usage