src/osprey/templates/claude_code/claude/skills/session-report/SKILL.md
Generate a polished HTML session report based on the current session's work
npx skillsauth add als-apg/osprey session-reportInstall 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.
Generate a polished, self-contained HTML report based on this session's work. The workflow adapts to what the operator needs rather than forcing a fixed section structure.
Follow these four phases in order. Do not skip phases.
Ask the operator what kind of report they need. Present ONE AskUserQuestion with a single-select of report intents:
| Intent | Description | |--------|-------------| | Session Log | Chronological record of what happened — channels read, values observed, tools used. Minimal interpretation. | | Analysis Report | Technical deep-dive with charts, data tables, and narrative observations about patterns and anomalies. | | Executive Briefing | High-level summary for management — KPIs, status cards, key observations in non-technical language. | | (Other) | Operator describes a custom report structure. |
Do NOT ask follow-up questions after this unless the operator response is ambigious.
session_summaryUse the session_summary MCP tool to get a compact inventory of all data context entries and artifacts in the workspace. This tells you exactly what data is available.
Based on the operator's intent and the inventory, draft a report structure. There is no fixed section list — the structure should be driven by what data exists and what the intent calls for.
Guidance (not constraints) on block types that work well:
archiver_downsample to get chart-ready data (never embed raw timeseries).timeline diagram type renders events organized by time periods with grouping, making complex sequences easier to scan than a flat list. Prefer this over the CSS timeline when there are 5+ events or natural phase groupings.stateDiagram-v2 renders state machines with transitions and guards. Only include when actual state changes were observed — never fabricate state models.Keep it proportional: A 10-minute session with 2 channel reads doesn't need 8 sections. A 2-hour investigation with archiver data, plots, and multiple analyses might warrant a rich structure. Match the report's complexity to the session's complexity.
If the structure includes charts and the inventory shows timeseries data, call archiver_downsample for each relevant data context entry now. This gives you chart-ready payloads (labels + datasets) that fit inline.
Spawn a Task subagent to generate the report. Pass it:
session_summary outputarchiver_downsample results (if applicable)The subagent should:
.claude/skills/session-report/reference.md for CSS/JS patternsartifact_save, session_log, archiver_downsample) as neededartifact_saveCRITICAL — Observation-only reporting
This report documents what was observed during the session. It must NEVER generate recommendations, prescriptive advice, or action items.
- ALLOWED: "Beam current was observed at 302.1 mA" / "A downward trend was noted between 14:00–15:00" / "The value exceeded the nominal range"
- FORBIDDEN: "Investigate the corrector magnets" / "Consider adjusting the RF frequency" / "It is recommended to..."
Exception: If the operator explicitly stated an action item during the session (e.g., "I need to check the vacuum pump tomorrow"), it may be included as an attributed quote: "Operator noted: 'Need to check vacuum pump tomorrow'".
<!DOCTYPE html> file — all CSS in <style>, all JS before </body>prefers-color-scheme media queryfadeUp and fadeScale animations with prefers-reduced-motion respectdisplay=swapAfter the subagent returns:
artifact_focus so it appears in the galleryopen <artifact_path>Do NOT:
archiver_downsample for chartsprefers-reduced-motion media querydata-ai
List, inspect, and switch the simulated machine scenarios that drive the mock control system and mock archiver. Use when the user asks which scenarios are available, which scenario is active, or wants to switch the simulated machine into a different state (e.g. a fault demo or back to nominal).
development
Interactive interview to create a custom OSPREY build profile for a new accelerator, detector, or beamline application. Use when someone says "interview me", "create a build profile", "set up my agent", "configure my detector", "onboard me", or needs to create an OSPREY project tailored to their specific control system. Also handles migration from existing OSPREY projects (including LangGraph-era projects) — trigger on "migrate my project", "I have an existing project", "upgrade from old OSPREY", "upgrade from langgraph", "legacy migration", "bring my project forward", "convert my project", "extract profile from existing project", "reverse-engineer build profile". Also use for /osprey-build-interview feedback to collect post-use feedback. Also trigger when onboarding a new colleague or when anyone needs help figuring out what their OSPREY agent should look like.
testing
Guides a maintainer through cutting an OSPREY release on the GitHub Flow workflow: open a version-bump PR, merge it to main, tag the merge commit, push the tag, verify the automated PyPI publish. Use when someone says "create a release", "bump the version", "cut v2026.X.Y", "publish to PyPI", "tag a release", or asks about the release process. Composes with `osprey-contribute` for the bump PR. Versions follow CalVer (vYYYY.M.P) and the source of truth is `src/osprey/__init__.py` — Hatch derives the pyproject.toml version dynamically.
development
Validates code before committing using OSPREY's three-tier check scripts. Runs linting, formatting, and tests to catch issues early. Use when ready to commit, before pushing, before opening a PR, or when the user asks to run checks, validate, or verify their changes. For the full contribution journey (branching, commits, push, PR, merge), use `osprey-contribute` instead — this skill is the focused validation step.