upstream-release-docs
Systematically verifies upstream release notes against source code to update project documentation.
Install
mkdir -p .claude/skills/upstream-release-docs && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/13209" && unzip -o skill.zip -d .claude/skills/upstream-release-docs && rm skill.zipInstalls to .claude/skills/upstream-release-docs
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Analyze an upstream project's new release, verify changes against source code, and update documentation. Covers discovery, deep-dive into PRs/issues, docs audit, source-verified implementation, and review feedback handling.Key capabilities
- →Analyze a new release of an upstream project
- →Verify changes against source code at the release tag
- →Update documentation to reflect verified changes
- →Expand bare GitHub issue/PR references in release notes
- →Derive feature rationale from PR bodies and linked issues in unattended mode
How it works
The skill analyzes an upstream project's release by verifying all claims against the source code at the release tag. It then updates documentation based on these verified changes.
Inputs & outputs
When to use upstream-release-docs
- →Updating docs for a new upstream release
- →Verifying features in a new version
- →Auditing gaps in release documentation
About this skill
Upstream Release Documentation
Analyze a new release of an upstream project and update the documentation site to reflect verified changes.
Core Principle
Verify everything against source code at the release tag. Never trust release notes, PR descriptions, PR review comments, or issue descriptions at face value. Always check the actual source code.
How you reach that source depends on what the caller gave you:
-
A local clone at the tag (an automated caller usually provides one, and names its path in the invocation): read it with the Read, Grep, and Glob tools. Prefer this; it costs no API quota. See Reading the upstream clone for the constraints.
-
No clone: fetch individual files from the API, and decode the base64 response.
gh api repos/<OWNER>/<REPO>/contents/<PATH>?ref=<TAG>
Claims from any human-written source (release notes, PR bodies, review comments) may be inaccurate, outdated, or aspirational. The source code at the tag is the single source of truth.
Input
Parse the argument to extract:
<OWNER>/<REPO>: the upstream repository (e.g.,stacklok/toolhive-registry-server)<TAG>(optional): the release tag (e.g.,v0.6.3). If omitted, fetch the latest release.
Output conventions
Any output that may be rendered as a GitHub comment, PR body, or Markdown file in the docs-website repo (progress narration, SUMMARY.md, GAPS.md, commit messages, PR descriptions) must fully qualify references to the upstream repo. GitHub auto-links bare #NNN relative to the repo the text lives in, so a bare #777 in a docs-website comment links to docs-website PR #777, not the upstream PR.
- Refer to upstream PRs and issues as
<OWNER>/<REPO>#NNN(e.g.,stacklok/toolhive#777), never bare#NNN. - When the release notes body contains bare
#NNN, expand them to<OWNER>/<REPO>#NNNbefore echoing them back. - Full PR/issue URLs are also fine.
Execution modes
This skill runs in one of two modes. The caller signals the mode; absent an explicit unattended signal, assume interactive. Never infer unattended mode from surrounding context.
Interactive (default): a human is present. At decision points that need product context you cannot derive from source (Phase 2 step 4), ask the user. Never write the GAPS.md, SUMMARY.md, NO_CHANGES.md, or REVIEWERS.json artifacts described below in interactive mode; surface that information conversationally instead. Those files are machine-readable handoff artifacts for an automated caller, and writing them during a local run just litters the repo root.
Unattended: no interactive user, for example a CI workflow that invokes /upstream-release-docs ... in unattended mode. Never ask clarifying questions; proceed best-effort at every decision point, and route anything genuinely unresolvable into the artifacts below.
Unattended decision-point behavior
When Phase 2 step 4 would normally ask the user for a major feature's "why", instead:
- Fetch the PR body and author with
gh pr view <NUMBER> --repo <OWNER>/<REPO> --json title,body,author. The PR body usually carries the "why" the author wrote at open time: motivation, intended consumers, design decisions. - If the PR body references linked issues ("Closes #N", "Fixes #N", "Refs #N"), fetch the likely-context-bearing ones with
gh issue view <N> --repo <OWNER>/<REPO>. - Write the "why"/consumer narrative directly into the relevant page using what you learned, translated into reader-facing language rather than the PR's engineering shorthand. This is best-effort; reviewers refine it later.
- Defer to
GAPS.mdonly when the rationale demonstrably cannot be derived from available sources: the PR points to an internal design doc you cannot access, multiple plausible consumer narratives exist and choosing one would mislead readers, or a release timeline or commitment needs product-team confirmation.
Reading the upstream clone
When a caller provides a local clone of the upstream repo at the release tag, read it with the Read, Grep, and Glob tools. Prefer it over gh api contents?ref=<tag>: it is already at the tag and costs no API quota.
Do not reach for Bash to explore it. An automated caller typically clones to a scratch directory outside the session's working directory, so ls, find, and grep run through Bash are refused there, and git -C <path> is refused everywhere because it can execute untrusted hooks from the target repo. Read, Grep, and Glob have no such restriction and are the right tools regardless.
Two consequences worth internalizing, because working around them by retrying Bash variants wastes turns and never succeeds:
- Don't try to run
git logon the clone. When the caller supplies.release-meta.json, itscommitsarray is the release range's commit list. Otherwise derive the range from the release notes andgh api. - Don't append
2>&1or chain with&&on any Bash call. That splits the command into parts that no longer match the caller's tool allowlist, so the call is denied even when the underlying command is permitted.
Artifacts (unattended mode only, written at repo root)
These files are read by the automated caller and spliced into the PR body. The filenames and the repo-root location are a contract with the caller; do not rename or relocate them.
GAPS.md - only if you genuinely need to defer (see above). An empty GAPS.md is worse than none; do not create it if every feature's "why" was resolvable from available sources.
-
Include only content gaps a human reviewer must fill. Exclude environment or sandbox limitations (for example, "couldn't run
npm build"); the PR's CI handles those. Exclude "documented for clarity, not a gap" commentary. -
Each entry must @-mention the PR author, skipping bot authors (
renovate[bot],github-actions[bot],stacklokbot). -
Each entry must include a paste-ready "Helper prompt for local Claude" referencing the specific file(s), the PR number for context, and the narrow piece of information the human must supply or confirm.
Entry format:
### <Feature name> (PR <OWNER>/<REPO>#123 by @alice) <One paragraph: what's missing and why it couldn't be resolved from available sources.> **File(s):** path/to/file.mdx **Helper prompt for local Claude:** > <Self-contained, paste-ready prompt referencing the file(s), PR number, and the narrow piece of info needed.>
REVIEWERS.json - written whenever .release-meta.json exists at the repo root and lists contributors. This one is JSON, not markdown, because the workflow parses it with jq to decide who gets a review request.
Read .release-meta.json first (the caller writes it before invoking you):
{
"repo": "stacklok/toolhive",
"prev_tag": "v0.42.0",
"new_tag": "v0.43.0",
"owner": "jerm-dro",
"owner_source": "merged release PR stacklok/toolhive#6333",
"contributors": ["alice", "bob", "carol"],
"commits": [
{
"sha": "8343851e9f06c0d67e315eb6aa4e9371d6ef76cf",
"subject": "Push skills unsigned until keyless signing lands (#6334)",
"author": "alice"
}
]
}
commits is the commit list for the release range: use it instead of trying to run git log against the upstream clone, which is refused (see Reading the upstream clone). It is also what tells you which commits belong to which contributor for the classification below.
When commits_truncated is true, the range exceeded what the caller could fetch in one request, so both commits and contributors are partial. Treat the release notes as the authoritative list of changes for that run, and say in SUMMARY.md that the commit list was truncated so a reviewer knows the classification may have missed someone.
Classify every login in contributors as docs-facing or not, and write REVIEWERS.json at the repo root:
{
"contributors": [
{
"login": "alice",
"docs_facing": true,
"docs_facing_shas": ["8343851e9f06c0d67e315eb6aa4e9371d6ef76cf"],
"note": "Confirm the ai-plugin timeout flag section matches what you shipped."
},
{
"login": "bob",
"docs_facing": false,
"reason": "CI workflow and test-fixture changes only"
}
]
}
docs_facing: truemeans at least one of this person's commits in the release range changed something a reader of the docs can observe: a CLI flag or subcommand, a CRD or config field, an API route, a default, an error message, a user-visible behavior, or anything you documented or corrected in this run. When you are unsure, classify astrue. A needless review request is a minor annoyance; a missing one means a wrong page ships.docs_facing_shas(docs-facing only): every full commit SHA fromcommitsthat made the contributor docs-facing. If GitHub cannot request the contributor as a reviewer, the workflow uses all of these SHAs to find the human mergers of the relevant upstream PRs. Include only commits you verified as reader-visible; do not list an unrelated commit merely because the same contributor authored it.docs_facing: falseis for changes with no reader-visible surface: CI and build plumbing, dependency bumps, tests and fixtures, internal refactors, lint fixes, comment-only edits. Base this on the actual diff you read in Phase 2, not on the commit message. A commit titled "refactor" that changes a default value is docs-facing.note(docs-facing only): one short sentence naming the specific thing that person should check, in their terms. Not a summary of the release, and not a restatement of their PR title. Skip the note rather than pad it.reason(non-docs-facing only): a short phrase naming what their changes actually were. This keeps the classification auditable when the run artifact is inspected; the workflow counts these contributors without rendering
Content truncated.
When not to use it
- →When documentation updates are based on unverified human-written sources
- →When the goal is to document hidden, experimental, or internal features
- →When the rationale for a major feature cannot be derived from available sources
Limitations
- →Cannot infer unattended mode from surrounding context; it must be explicitly signaled
- →Cannot write GAPS.md, SUMMARY.md, or NO_CHANGES.md in interactive mode
- →Cannot access internal design documents for feature rationale
How it compares
This workflow prioritizes source code verification over human-written release notes, ensuring documentation accuracy by directly checking the code at the release tag.
Compared to similar skills
upstream-release-docs side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| upstream-release-docs (this skill) | 0 | 3mo | Review | Intermediate |
| ml-paper-writing | 48 | 8mo | Review | Advanced |
| content-research-writer | 15 | 11mo | No flags | Beginner |
| research-grants | 6 | 9mo | Review | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by stacklok
View all by stacklok →You might also like
ml-paper-writing
davila7
Write publication-ready ML/AI papers for NeurIPS, ICML, ICLR, ACL, AAAI, COLM. Use when drafting papers from research repos, structuring arguments, verifying citations, or preparing camera-ready submissions. Includes LaTeX templates, reviewer guidelines, and citation verification workflows.
content-research-writer
ComposioHQ
Assists in writing high-quality content by conducting research, adding citations, improving hooks, iterating on outlines, and providing real-time feedback on each section. Transforms your writing process from solo effort to collaborative partnership.
research-grants
davila7
Write competitive research proposals for NSF, NIH, DOE, and DARPA. Agency-specific formatting, review criteria, budget preparation, broader impacts, significance statements, innovation narratives, and compliance with submission requirements.
nsfc-research-content-writer
huangwb8
为 NSFC 正文"(二)研究内容"写作/重构,并同步编排"特色与创新"和"三年年度研究计划",输出可直接落到 LaTeX 模板的三个 extraTex 文件。适用于用户要写/改"研究内容、研究目标、关键科学问题、技术路线、创新点、三年计划/里程碑"等场景。
clinical-reports
davila7
Write comprehensive clinical reports including case reports (CARE guidelines), diagnostic reports (radiology/pathology/lab), clinical trial reports (ICH-E3, SAE, CSR), and patient documentation (SOAP, H&P, discharge summaries). Full support with templates, regulatory compliance (HIPAA, FDA, ICH-GCP), and validation tools.
business-knowledge-workflow
TencentBlueKing
业务知识获取与 Skill 文档编写工作流。当用户需要熟悉新业务模块、从 iWiki 获取文档、结合代码分析生成架构文档、或将业务知识沉淀为 Skill 时使用。