Repository navigation
go-live 8/9: post-swap docs, labels, boards, and integration hygiene #1821
Description
Phase 8 of 9 in the v2 go-live runbook — see #1804 (§10). Depends on phase 4. Reversible.
Everything that silently inverts when main becomes v2.
Current state of the branch model
Established and now documented in AGENTS.md / README.md / CONTRIBUTORS.md (#1866):
| Branch | Role | PRs target it? | Publishes |
|---|---|---|---|
v2/main |
Develop — all active v2 work | yes, every v2 PR | — (reaches npm via main) |
main |
Release — default branch, latest released v2 | no — milestone merges from v2/main only |
latest |
v1/main |
Maintenance — deprecated, fixes only | yes, every v1 PR, directly | v1-latest, straight from the branch |
Verified on npm: v1-latest: 1.0.1, latest: 2.0.0.
Correction, recorded here so it stops propagating. Several earlier PR and issue descriptions (#1851, #1864, #1865) claimed
mainandv2/mainshare no common git ancestor and that the tree swap created unrelated histories. That is wrong. It came from runninggit merge-basein a shallow clone, which truncates history so the base isn't reachable. The branches share merge base4d30d1cd, established by the go-live merge (#1830). Aftergit fetch --unshallowit resolves normally. No graft or stitch commit is needed, and--allow-unrelated-historiesmust never be used here.
Merged
All eight PRs are merged to v2/main, in this order, each squash-merged after a Copilot review loop reached a clean round:
| Order | PR | Landed as |
|---|---|---|
| 1 | #1866 — branch model, PR policy, milestone rule, Copilot instructions | 3ac34e40 |
| 2 | #1880 — converge README's Test-servers section | 2c24b82e |
| 3 | #1884 — rename CONTRIBUTORS.md → CONTRIBUTING.md |
379a8a0a |
| 4 | #1879 — unpin the branch-pinned links in the PR template | 7cc3c127 |
| 5 | #1867 — SECURITY.md |
ff995473 |
| 6 | #1869 — claude.yml + .mcp.json |
ee707db5 |
| 7 | #1871 — dependabot, issue template, .gitattributes, CoC |
13e981e9 |
| 8 | #1881 — rc-series dependency bumps (@hono/node-server 2.x, vite 8.1.5) |
694d013f |
Their issues (#1873, #1877, #1874, #1883, #1813, #1864, #1850, #1870, #1875) are closed and their cards are Done.
One conflict actually materialized, on #1884: GitHub flagged CONFLICTING for the rename/modify pair once #1866 landed (it renames CONTRIBUTORS.md while #1866 edited that file's contents), even though local git resolved it cleanly via rename detection. Resolved by merging v2/main into the branch — #1866's edits applied to the renamed file, CONTRIBUTORS.md gone, CONTRIBUTING.md carrying the new content. Worth remembering: GitHub's mergeability check is more conservative than git merge for rename/modify.
This phase is complete — all nine sub-issues are closed and their PRs merged.
The v2/main → main milestone merge is not part of this phase. It is tracked separately in #1876 as the last issue of the v2.1.0 milestone, because it ships everything in that milestone rather than only this phase's work. The merges above unblock it, and because #1880 landed it should now be conflict-free rather than needing the one-hunk README fallback.
Activity
[-]go-live 7/9: restrict PRs to collaborators; CONTRIBUTORS.md + SECURITY.md[/-][+]go-live 8/9: post-swap docs, labels, boards, and integration hygiene[/+]cliffhall commentedon Jul 28, 2026
Two items for this phase, found during phases 1–4
1. Branch protection requires a reviewer the project does not have
Both default-branch rulesets (
2749948,3187937, each targeting~DEFAULT_BRANCH) require:and there is no CODEOWNERS file anywhere in the repo (
CODEOWNERS,.github/CODEOWNERS,docs/CODEOWNERSall absent). The same shape was cloned ontov1/mainin phase 1 (19858989).The consequence is that every merge goes through
--adminbypass: #1827, #1828, #1829 onv1/mainand #1830, #1831, #1832 onmainall did. A required check that nothing can satisfy is worse than no check — it reads as protection while making bypass the routine path.required_approving_review_count: 1is unsatisfiable regardless of who the code owner is — naming yourself in CODEOWNERS changes nothing, and droppingrequire_code_owner_reviewalone still leaves the count. The options are:buildcheck plus admin discipline. Honest, but weaker.Deliberately not changed during phases 1–4: editing rulesets immediately before an irreversible npm publish adds risk without removing the need to bypass. Recording it here so it is resolved as a considered choice.
2. Dependabot backlog — deferred, with reasoning
72 open alerts as of 2026-07-28:
Why they do not block the 2.0.0 release (#1818): 2.0.0 ships the same dependency tree
v2/mainhas carried all along. The swap changed nothing about it —mainsimply began reporting alerts it had never scanned before. Nothing regressed; visibility changed.On the three criticals: all are
@vitest/browser, development scope. The publishedfilesallowlist isclients/*/build+clients/web/dist+scripts/install-clients.mjs, so dev dependencies are never in the tarball. They are not user-facing.One was investigated properly rather than triaged by severity — GHSA-frvp-7c67-39w9 (
@hono/node-server, path traversal inserve-static), because the Inspector calls that exact function in its prod web server. Result: the advisory blocks..escapes, so it only reaches files inside the static root by bypassing prefix-mounted middleware; here that root is the public SPA bundle and the only prefix middleware (/api/*) is a separate route, not a subdirectory. No auth bypass, no arbitrary read, Windows-only. Upgraded anyway in #1832 since it proved free.The plan:
npm install. Current runtime offenders:fast-uri(12),hono(15),@hono/node-server(fixed),qs,ip-address,yaml,body-parser,postcss.The general lesson worth keeping: severity alone was a poor triage signal here. The three criticals were unshippable dev tooling; the one alert genuinely worth reading in full was a medium.
cliffhall commentedon Jul 31, 2026
Task 1 — "Merges from v2/main into main enabled for milestone release workflow"
Worked up against the real SHAs. Correction first: no graft/stitch commit is needed. The two branches already share history — I earlier concluded they didn't, but that was an artifact of a shallow local clone (
git rev-parse --is-shallow-repository→true), which truncates history sogit merge-basefinds nothing. Aftergit fetch --unshallowit resolves.Actual state
4d30d1cd— "docs: restore the missing docs/ targets and split the catalog-seeding wording (#1811) (#1812)"25106dcc— "Merge pull request #1830 from modelcontextprotocol/chore/v2-golive", which mergedv2/mainintomain(the tree swapec5d8e13was part of that branch)maintipfb1b0cb4— "docs: restore SECURITY.md, lost in the v2 tree swap (#1843)"v2/maintip5d91d4ac— "fix(core): mirror SEP-2243 x-mcp-header args to Mcp-Param-* on tools/call (#1847)"mainahead by 223 (all v1 history + the 2.0.0 release commits), behind by 1The v1 history is reachable from
mainbut not fromv2/main, which is why the compare shows 223 — it is not 223 commits of pending work, and it does not affect the merge, because the 3-way merge compares trees against the base at4d30d1cd.Verified by dry run
Merging
origin/v2/mainintoorigin/mainin a scratch worktree:--allow-unrelated-histories, no graft.README.md(the "Serving the modern protocol era" section —maincarries a restructured version from go-live,v2/mainextended the original prose). Every other file auto-merges: 13 files, +719/−33.SECURITY.mdsurvives the merge (added onmainafter the base, untouched onv2/main, so 3-way keeps it).The milestone merge sequence
Why step 4 matters
v2/mainis missingSECURITY.mdtoday, and the version bump commits land onmainonly. Without the back-merge each milestone leavesv2/maina little further behind on release-only files, and thepackage.jsonversion diverges — which is the one file most likely to conflict on every subsequent merge. The back-merge keeps the trees converged so each milestone merge stays as small as this one.Remaining checks before the first real run
main— confirm the ruleset permits a merge commit from a maintainer (or that the merge goes through a PR, ifmainrequires one). This is the only thing that can block the sequence above; everything else is verified.v2/main→main, reviewable, matches the "no direct pushes" posture) or a direct maintainer merge. A PR is the better default; note the PR body'sCloses #Nwill not auto-close sincemainis the default branch — closing keywords work there, so it actually will. Worth confirming which issue such a release PR should reference.README.mdconflict once by bringingmain's restructured section ontov2/mainahead of the merge, so the first milestone merge is conflict-free.cliffhall commentedon Jul 31, 2026
Folded the task-1 analysis from my earlier comment into the issue description, along with the full ordered sequence, so the plan lives in one place rather than scattered across comments. That comment is now superseded — the description supersedes it wherever they differ (notably: it recommended a back-merge, which was built as #1868 and rejected).
docs: point the AGENTS.md policy link at CONTRIBUTING.md
docs: post-swap branch model, PR policy, milestone rule, and Copilot …