@@ -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
493531A 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
496540the merge branch.** File the issue (` /issue-create` ), fix it through an
497541ordinary PR, then fast-forward the merge branch to the new ` origin/v2/main` ,
0 commit comments