Skip to content

Commit 6051046

Browse files
authored
Merge pull request #5409 from modelcontextprotocol/v2/docs/5343-release-ledger-layout
docs(release): document the ledger's title, layout and required sections
2 parents f18f7c8 + f2d3477 commit 6051046

1 file changed

Lines changed: 49 additions & 5 deletions

File tree

‎.claude/skills/release/SKILL.md‎

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -469,12 +469,35 @@ gh issue list --repo modelcontextprotocol/servers --milestone "$MILESTONE" \
469469
before and after.
470470
471471
**4d. The ledger.** Write the results up as a published artifact (a private
472-
page, shared with the maintainers) and link it from the merge PR's body. It
473-
holds:
472+
page, shared with the maintainers) and link it from the merge PR's body.
473+
474+
**Title it `Servers vX.Y.Z Release Ledger`**, the milestone's version, in both
475+
the page's `<title>` and its `<h1>`.
476+
477+
**Start from the previous release's ledger**, so every ledger reads as one
478+
series. It is linked from the latest published Release's notes, on the
479+
`Release ledger:` line (5a):
480+
481+
```sh
482+
gh release view --repo modelcontextprotocol/servers --json tagName,body \
483+
--jq '.tagName, (.body | split("\n")[] | select(startswith("Release ledger:")))'
484+
```
485+
486+
Read that page (the artifact tool's read action), and build the new one on its
487+
stylesheet and section structure, changing the content only. This skill
488+
deliberately names no ledger URL: the latest Release always points at the
489+
current one, and a URL written here would go stale with the next release.
490+
491+
It holds, in this order:
474492
475493
- **Masthead**: repository, the merge PR and its commit, the milestone, the
476494
date, and a line saying what tree was tested and that its hash matches
477-
`origin/v2/main`.
495+
`origin/v2/main`. Two more lines:
496+
- **SDKs**: the MCP SDK versions the lockfiles hold (each
497+
`@modelcontextprotocol/*` SDK package, and Python `mcp`).
498+
- **Toolchain**: the versions used to verify: Node (with OS and
499+
architecture), uv, the Inspector CLI and web UI, Playwright, Docker and
500+
Claude Code.
478501
- **Verdict**: `local:gate` and `pack:verify` results, milestone issues
479502
verified as `N / N`, findings.
480503
- **The gate**: one cell per stage, with its numbers.
@@ -485,13 +508,34 @@ holds:
485508
(`node scripts/npm-publish-guard.mjs src/<server>` for npm; for PyPI,
486509
`curl -s -o /dev/null -w '%{http_code}' https://pypi.org/pypi/<name>/<version>/json`,
487510
where 404 means it will publish).
488-
- **One table per theme**: *Issue · What was driven · Observed · Status*. One
489-
row per closed issue, linked, with the actual output in the Observed cell.
511+
- **One table per theme** (a server, a group of servers, or the tooling),
512+
with the columns *Issue · Title · What was driven · Observed · Status*. One
513+
row per closed issue. The Issue cell links it and is tagged with how it was
514+
exercised: `client` (the Inspector CLI or an SDK client), `web UI` (the
515+
Inspector web UI through Playwright) or `probe`. The Observed cell holds the
516+
actual output. Status is a pill: `PASS`, or a named exception.
517+
- **Preparation PRs**: the audit PR (or, when the audit forced no fix, its
518+
report), Version Packages and Prepare Python Release, each with what was
519+
checked on it.
520+
- **Tool schemas against the previous release**: each TypeScript server's
521+
`tools/list` (input and output schemas, annotations and descriptions)
522+
compared with the version the previous release published, in both eras.
523+
- **LLM client**: one headless Claude Code run (`--strict-mcp-config`)
524+
calling one tool on each of the seven release-candidate builds, with what
525+
each returned (`/client-smoke`).
526+
- **Also shipping: advisory fixes**: each fix that shipped through a security
527+
advisory rather than a milestone issue.
490528
- **Findings**: anything that is a caveat rather than a pass, stated on its
491529
own.
492530

493531
A row that says "verified" without saying what was run is not a ledger entry.
494532

533+
**A second merge PR.** When a fix lands after the first merge PR merged (4e;
534+
in v2.2.0, #5342 followed #5338 for a `certifi` lockfile bump), the masthead
535+
names both merge PRs with their heads, and the page says which checks ran on
536+
which head and what differs between the two trees
537+
(`git diff --stat <first head> <second head>`).
538+
495539
**4e. When verification finds something, the fix goes on `v2/main`, never on
496540
the merge branch.** File the issue (`/issue-create`), fix it through an
497541
ordinary PR, then fast-forward the merge branch to the new `origin/v2/main`,

0 commit comments

Comments
 (0)