View release notes instantly — type to detect the list of versions to choose & read. Read-only viewer, does not cut releases (that is
/ship).
WHAT
Purpose and context
- Purpose: for the user to VIEW release notes (framework overstack by default, or the current project) instantly, read-only.
- Trigger (when to use):
- User wants to VIEW release history: "release notes", "changelog", "the versions released", "what's in the latest version", "/ovs-notes".
- Non-goals: NOT used to cut/push releases — that is
/ship. Does not infer source from CWD.
Mental model
nguồn (framework mặc định · --here project · --repo khác) → danh sách vX.Y.Z newest-first có nhãn nguồn → user chọn bản → in đầy đủ.
The name ovs- = the promise "belonging to overstack" → by default view the FRAMEWORK changelog (Rheinmir/setup, via gh), no matter which project you are in — does NOT infer source from CWD (anti-impersonation: framework release mistaken for the project's). Every print always labels the source in the header (council-advisory 030726).
Input and output contract
| Field | Required? | Meaning | |
|---|---|---|---|
| In | version | latest |
no | none → print the list then ask to choose |
| In | --here / --repo owner/name |
no | release of the current project (local git tag, offline-ok) / another GitHub repo |
| Out | list of vX.Y.Z <ngày> <tiêu đề> or the content of one version |
yes | always has a source label in the header |
| Out | exit≠0 + "cannot confirm" | when gh is absent/offline | does not fake empty |
Rules and capabilities
- RULE-01 (MUST): Absolutely read-only — NEVER create/edit tags, releases, or files. Cutting releases is the job of
/ship. - RULE-02 (MUST): Mandatory source label — every output states clearly whether it is viewing the framework or which project (anti-impersonation — Taleb).
- RULE-03 (MUST): Fail loudly, do not fake empty — gh absent/offline → say "cannot confirm" + exit≠0, do not print an empty list as if there were no versions.
- RULE-04 (MUST): Compose, do not spawn again: all logic in
harness/scripts/ovs-notes.py(self-contained stdlib, travel downstream) — the skill only orchestrates calls. - Capabilities: read releases of a remote repo (via an authenticated GitHub tool) or local git tags; write nothing.
Failure boundaries
ghabsent/offline/not logged in → blocked: print clearly "cannot confirm — empty does NOT mean there are no versions", exit≠0.- User hasn't specified a version → clarify: show the list then ask to choose.
- User actually wants to cut a release → switch to
/ship, not done here.
HOW
Main workflow
| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | deterministic | source | List: run python3 harness/scripts/ovs-notes.py (+ --here if project) |
changelog newest-first with source labels | gh absent → blocked, exit≠0 |
| W02 | judgment | user's words | Choose version: user specifies → run with `<version | latest>`; not specified → ask | version content |
| W03 | deterministic | output | Only PRINT for the user to read | user can read | — |
Details of each step (source of truth for W01–W03):
- List (default): run
python3 harness/scripts/ovs-notes.py→ framework changelog newest-first (vX.Y.Z <ngày> <tiêu đề>), with source labels. User wants project release → add--here. - Choose to read: user specifies a version ("v1.0.5"/"latest") →
python3 harness/scripts/ovs-notes.py <version|latest>(+--hereif it's a project). Not specified → show the list then ask the user to choose. - Only PRINT for the user to read. No edits, no tag, no push.
Source: framework by default, project via --here (council-advisory 030726)
--here→ release of the CURRENT PROJECT (local git tag, offline-ok).--repo owner/name→ another GitHub repo.ghabsent/offline/not logged in → print clearly "cannot confirm — empty does NOT mean there is no version", exit≠0 (don't fake empty).
Zero-model: runs directly, costs no tokens
All LOGIC is in harness/scripts/ovs-notes.py (lives in harness/scripts so TRAVEL down to every project that installs overstack — paths don't break downstream). To be exactly like /release-notes client-side of Claude CLI (instant, 0 tokens), type directly with the bang-prefix:
!python3 harness/scripts/ovs-notes.py # changelog framework (list)
!python3 harness/scripts/ovs-notes.py latest # bản framework mới nhất
!python3 harness/scripts/ovs-notes.py --here # release project hiện tại
This skill is the NATURAL-LANGUAGE entry point (when the user says "view release notes") — it DOES go through the model for one beat to call the script; for 0 tokens use ! above.
Branches
| ID | Kind | Guard | Behavior | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | user_optional | user wants the CURRENT PROJECT's release | add --here (local git tag, offline-ok) |
— | W02 |
| B02 | user_optional | user specifies another GitHub repo | add --repo owner/name |
gh absent → blocked | W02 |
| B03 | user_optional | user wants 0 tokens | type directly !python3 harness/scripts/ovs-notes.py … |
— | ends (without going through the model) |
Validation and stopping
Content is ovs-notes.py printed (deterministic); the model only passes it to the user. Stop after printing; there is no write step.
Examples
- Positive: "what's in the latest version" →
python3 harness/scripts/ovs-notes.py latest→ print the full notes of the latest framework version, header states the sourceRheinmir/setup. - Boundary/failure: machine not yet
gh auth login→ script prints "cannot confirm — empty does NOT mean there is no version", exit≠0; do not print an empty list.