aops-core/skills/end_session/SKILL.md
Canonical session close — commit, push, PR, release_task, reflection blocks, handover. Use /dump for emergency bail (no commit/PR/reflection).
npx skillsauth add nicsuzor/academicops end_sessionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Close a session cleanly by committing/pushing changes, filing PRs, resolving tasks, and providing reflections. For mid-flight bails without task completion, use /dump instead.
release_task.Determine if session was Read-only (no mutating tools used, no tasks modified/created) or Full-form (modifying).
Output: none — read-only Q&A.Identify the active task:
$AOPS_TASK_ID environment variable (populated automatically in the session context — this is the authoritative source). If it is unset or empty, fall back to the git branch name, which encodes the task ID as the segment after the last / (e.g. polecat/aops-1f9ec7b0 → aops-1f9ec7b0). Do not read or synthesise a filesystem-state file.release_task will auto-create an ad-hoc task.Run TaskList() and reconcile mirrored tasks. For each native task marked completed carrying PKB <id> (excluding the bound parent task), if the PKB task is not terminal, call mcp__pkb__complete_task.
If files changed, commit, push, and open a PR against this repo's default working branch. For academicOps that branch is dev — gh pr create --fill --base dev (main is publish-only). For any other repo, target its own default branch (most use main) — do not copy academicOps's dev convention onto a repo that has no dev branch.
The PR body describes the change for its reviewer. Do not add merge-gate / do-not-merge / "awaiting Nic" banners — branch protection is the real gate, so a banner warns nobody who can act on it. Canonical rule: [[framework-conventions-summary#pr-body-conventions]].
Resolve the parent epic and project node from the bound task. Append to the project file's Active Epics section:
mcp__plugin_aops-core_pkb__append(
id="<project-id-or-permalink>",
section="Active Epics",
content="- [[<epic-id>]] — <epic title> (task [[<bound-task-id>]], PR <url-or-'none'>)"
)
Verify all child tasks are in terminal states (done, cancelled, superseded, archived) before closing the parent.
Call release_task:
mcp__plugin_aops-core_pkb__release_task(
id="<bound-task-id>",
status="merge_ready" | "review" | "done" | "blocked",
session_id="$AOPS_SESSION_ID",
pr_url="<pr-url>",
branch="<branch-name>",
issue_url="<issue-url>",
follow_up_tasks=["task-xxxx"],
release_summary="<concrete, result-oriented summary, <= 500 chars>"
)
release_summary must be result-oriented, self-contained, and name specific resources/issues (org/repo#NNN).Include these three markdown headers in your response before the handover block:
## Output
- [Artefact Link] (Description)
## Tasks worked
- <task-id> (< precis >) — <created | updated | completed | cancelled | referenced>
## Framework Reflection
**Outcome**: success | partial | failure
**Accomplishments**: <what you completed — comma list, or `-` bullets, or `none`>
**Friction points**: <issue/task URLs filed via /learn; no description prose — or `none`>
**Proposed changes**: <one concrete instruction or tool improvement — or `none`>
**Field**:). These four labels are the parse contract: the deterministic parser in transcript_parser.py buckets the reflection by matching them verbatim. Plain-bullet labels (- Friction points:), renamed labels (Proposed improvement:), or free-form prose match nothing — the whole body then falls through to the unstructured fallback and gets dumped into accomplishments, leaving friction_points empty. **Outcome**, **Accomplishments**, **Friction points**, and **Proposed changes** are the only labels the pipeline reads. The exact grammar is the SSoT in transcript-metadata-schema.md.task-acba1234 ( precis )).transcript-metadata-schema.md for the field/warning contract. ## Output must carry a real artefact link (PR/commit URL); if there genuinely is none, write Output: none — <reason>. No link and no explicit "none" → end-session does not pass.Emit exactly this markdown block:
### Session Handover
- **Session ID**: `$AOPS_SESSION_ID`
- **Primary Task**: `<task-id>` (<short title>)
- **PR**: <url>
- **Branch**: `<branch>`
- **Issue**: <url or "none">
- **Follow-ups**: `<task-id> (<short title>)` (or "none")
- **What you asked**: <original user instruction, including deliverables and constraints.>
- **Summary**: <release_summary value>
Omit lines for PR, Issue, and Follow-ups if they do not exist.
If leaving multiple distinct follow-up threads, append:
### Thread Pickup: what next?
- **Thread A**: <action for next session>
- **Thread B**: <action / dependency>
Terminate execution immediately after the handover or thread pickup blocks. Do not add trailing text.
tools
Streamlit implementation of the analyst presentation layer. Use when building or updating a Streamlit dashboard that displays pre-computed research data. This is the Streamlit-specific HOW for the tech-agnostic principles in the aops-tools analyst skill — display only, never transform.
tools
Python plotting and statistical-modelling libraries (matplotlib, seaborn, statsmodels) for the analyst presentation and statistical-methodology layers. Use when producing publication-quality figures or fitting statistical models in Python. Library-specific HOW for the tech-agnostic principles in the aops-tools analyst skill.
tools
dbt (data build tool) implementation of the analyst transformation layer. Use when a project has a dbt/ directory or you need to build, test, or document SQL transformations as version-controlled, reproducible dbt models. This is the dbt-specific HOW for the tech-agnostic principles in the aops-tools analyst skill.
development
Core academicOps skill — institutional memory, strategic coordination, workflow routing, and framework governance. Merges butler (chief-of-staff) with framework development conventions.