chore(release): prepare v2.7.0 - #199
Conversation
|
There was a problem hiding this comment.
🟢 Approval recommended
The changes are a mechanical version bump and changelog reorganization that fully and consistently follow the documented release process, with no code or logic changes.
Pull request overview
This PR prepares the v2.7.0 minor release following the documented flow in CONTRIBUTING.md. It is a purely mechanical release-cut: it stamps the new version, reorganizes the changelog, and bumps the pinned release URLs in the README. The release bundles previously-merged work (declared site options #194, pinned scroll-tracking outline #196, OpenGraph/Twitter SEO + docs #197, viewport overflow fix #198, and the bundle-manifest Node floor / npm ci change #191).
Changes:
- Bump the theme version from
2.6.1to2.7.0inpackage.jsonandpackage-lock.json. - Move the
## [Unreleased]CHANGELOG entries under a new## [2.7.0] - 2026-09-11heading, add the[2.7.0]compare link, re-point[Unreleased]to compare fromv2.7.0, and add the missing#191PR link. - Re-point the two pinned
vX.Y.ZURLs inREADME.md(thesite.templateexample and the git-metadata plugin) tov2.7.0.
File summaries
| File | Description |
|---|---|
package.json |
Bumps the theme version to 2.7.0 (release version source of truth). |
package-lock.json |
Mirrors the 2.7.0 bump in both version fields to keep the lockfile in sync. |
CHANGELOG.md |
Cuts the 2.7.0 section from Unreleased, adds compare links, and adds the #191 PR link. |
README.md |
Updates the two pinned release/plugin URLs so consumer examples point at v2.7.0. |
I verified: version consistency across all files (no stale v2.6.1 theme references remain — the leftover 2.6.1 hits are unrelated node-fetch deps); the CHANGELOG structure and compare links match the CONTRIBUTING.md release steps; template.yml is correctly left unbumped since release.yml stamps it from package.json; and the workflow's release-notes extraction keys on ## [2.7.0], so the empty ## [Unreleased] section above it is harmless and the tag/version guard is satisfied. The 2026-09-11 release date is one day ahead of UTC but is the intended publish date and correct in the project's AEST timezone, so I did not flag it. No issues found.
Review details
- Files reviewed: 3/4 changed files
- Comments generated: 0
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
🎭 Visual regression resultsDetails
Skipped testsmobile-chrome › theme.spec.ts › QuantEcon theme — visual regression › without JavaScript › drawer-opens-without-javascript |
Reverts the CHANGELOG half of b8b8101, keeping the app/seo.ts og:type comment it also carried. I added the entry on a Copilot review flag citing CONTRIBUTING's "add your change to `## [Unreleased]`" rule, without checking whether this PR had already taken a position. It had: the description says no entry, because like #175 -- which corrected the FOUC comments and touched no CHANGELOG -- this changes nothing a consumer of the theme can see. Verified that 1aae2c8 (#175) indeed has no CHANGELOG entry, so the cited precedent holds. The author's call stands. It was also the sole cause of the merge conflict against main: #199 released v2.7.0, moving the `## [Unreleased]` entries this added to into `## [2.7.0]`. With the entry gone the PR no longer touches CHANGELOG.md at all. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QAy8brFG9x8fXet3AV9dJE
Brings in the v2.7.0 release (#199). No conflicts once the CHANGELOG entry reverted above is gone -- this branch no longer touches that file.
* chore(comments): code comments explain the code, not its history Comments across app/, styles/, tests/, the workflows and config named project phases, tracker issues and PLAN.md items, and justified values by pointing at the Sphinx build. Rewrite them to state the reason itself: the measurement, the contrast ratio, the constraint. A link stays only where its thread holds detail a comment cannot give in a line (a fork feature the code reads, a guarded regression, measured timings), and ported code keeps one provenance line. Add a "Code comments" section to CONTRIBUTING.md with the rule. Comment-only: every changed code file is identical once comments are stripped (TypeScript printer for TS/JS, postcss for CSS, parsed YAML and JSON). The one data change drops an issue tag from the stderr output text in the no-thebe fixture notebook. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore(tests): name test suites by behaviour, not by issue number Drop the issue numbers from four describe titles, the Sphinx framing from an seo unit-test title, and the tracker link from the FOUC guard's CI step name. Screenshot baselines are named explicitly in each toHaveScreenshot call, so no snapshot moves. Also restate the tailwind.config.js grid-track comment and a FOUC-suite note in the present tense. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore(comments): correct comment facts found in an accuracy review An adversarial review of the rewritten comments (reviewers over every changed file, a whole-codebase sweep for missed framing, and a three-lens panel per finding) confirmed factual errors and leftover history framing. Each was re-checked before applying: - contrast: the stderr label is 5.5:1 and the link 5.08:1, six light code colours miss AA, and dark-mode ratios are restated for the #222 content panel the text actually sits on - sizes: the UNITS root under the toolbar font-size control, and figure and paragraph spacing quoted in px for what is em - comments contradicting the code: the seo and route meta tags, the first-paint font, the dark-bg keep-in-sync pointer, the static-build claims in playwright.config.ts and preview.yml, the relative-css directory note, and the template.yml README pointer - history framing the first pass missed: Makefile, .npmrc, serve.sh, mpl-widget.css, Document.tsx, the launch-urls tests, PageHeaderHistory.tsx and a release.yml step comment - CONTRIBUTING: git log -L rather than git blame, and measurements as a reason to keep a link Still comment-only: every changed file is identical to main once comments are stripped from both sides. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore(comments): say why Colab is the only launch target Restore the design decision the rewrite dropped from the launch-colab test comment: Binder and JupyterHub are deliberately not offered. And reword the code-palette note so it no longer explains the missing toggle by an option this theme never had. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore(comments): keep the reason when the reason is another system Follow-up to the code-comments rewrite, from an accuracy review of #200. The rewrite read "matches the Sphinx build" as project framing and removed it everywhere: Sphinx mentions in source fell from 95 across 15 files to 1. For this theme that phrase is the specification rather than history -- the theme reproduces the deployed lecture sites -- so where it was the only justification for a value, the replacement restated the declaration instead of giving a reason. CONTRIBUTING.md: state the section's scope (code comments, including YAML, shell and fixture comments; prose docs keep their history), fold the overlapping first two bullets into one ban plus one exception, and say that a constraint from another system is a reason, with a worked example and a note to record deliberate divergences. styles/quantecon.css: restore the derivation for the four values whose only reason was removed -- the footer's 0.9rem and 0.7 opacity, the 5px rule's 18px gap, and the back-to-top 15.3px, whose comment had come to contradict itself by deriving a deliberately unpinned size from `.article`. Restore the two deleted notes: the known divergences on link underlines and `:visited`, and that self-hosting Source Code Pro is separate work. Add a header note so a reader knows what the measurements are measurements of. List all six AA-failing code colours rather than counting them, and record that the palette is inherited from quantecon-book-theme, so changing it is a decision for both themes (see #172). static.spec.ts: the provider `Link` would resolve against the un-slashed SSR pathname; the code does not use it, so the present tense contradicted the same explanation in Outline.tsx. Fixture frontmatter comments: drop the issue labels the rule bans, matching the myst.yml.in files beside them. The labels in features.md, lists.md and the lists.md fancy-list line are rendered page text feeding features.png and lists.png, so they are left for a run of update-snapshots.yml. Reflow the comment lines that were edited in place and left short. Comment-only, verified mechanically against 200c4d1 with a comment stripper for TS/TSX/JS and CSS: no code token changes. tests/unit is unchanged at 17 passing; the 2 failures are missing node_modules in this environment and are identical before and after. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QAy8brFG9x8fXet3AV9dJE * docs(contributing): record the match-except-for-WCAG rule The theme already diverges from the lecture builds in four places and every one is an accessibility fix -- the outline's undimmed resting entries, its non-colour-only active state, the dark footer link, and the flat rem-rooted content size. That rule was only discoverable by reading four scattered comments, so state it: match the lecture builds, except where matching them fails WCAG, and say so with the measurement where you diverge. Changing an inherited value for any other reason stays a two-theme decision (#172 for the code palette, #201 for the footer). Note that a contrast ratio must be computed on the composited colour, since an `opacity` on the element is what the reader actually sees. That is the step the footer missed: the dark footer link was corrected for it and the light one never was. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QAy8brFG9x8fXet3AV9dJE * docs(changelog): record the comment rewrite, and say why og:type is "website" CONTRIBUTING.md requires every change to land an `## [Unreleased]` entry; this PR had none. Added under `### Changed`, with the scope, the comment-only property and the seven string edits it rests on. app/seo.ts: `og:type "website"` was left without a reason when the Sphinx reference came off, and "article" is the choice a future reader would reach for on a page with a byline. Records why it is not: the lectures carry none of the `article:*` metadata that choice commits to, and the deployed sites declare "website" throughout (which is what the comment on `main` said). Both raised in review on this PR -- the CHANGELOG entry by the Copilot reviewer, the og:type reason by quantecon-services. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QAy8brFG9x8fXet3AV9dJE * Revert "docs(changelog): record the comment rewrite" Reverts the CHANGELOG half of b8b8101, keeping the app/seo.ts og:type comment it also carried. I added the entry on a Copilot review flag citing CONTRIBUTING's "add your change to `## [Unreleased]`" rule, without checking whether this PR had already taken a position. It had: the description says no entry, because like #175 -- which corrected the FOUC comments and touched no CHANGELOG -- this changes nothing a consumer of the theme can see. Verified that 1aae2c8 (#175) indeed has no CHANGELOG entry, so the cited precedent holds. The author's call stands. It was also the sole cause of the merge conflict against main: #199 released v2.7.0, moving the `## [Unreleased]` entries this added to into `## [2.7.0]`. With the entry gone the PR no longer touches CHANGELOG.md at all. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QAy8brFG9x8fXet3AV9dJE --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Release prep for v2.7.0, per the flow in CONTRIBUTING.md. A minor release: it adds new site options (
site_url,og_logo_url,twitter_logo_url) and thedocs/feature reference, and it closes out the last two items on the #147 cutover gate.Included
template.yml, so it reaches the theme; thefaviconoption works; the page-levelgit_metadataoverride is a declared optiondocs/feature reference (Phase 6)>=20and installs the shipped lockfile withnpm ci#195 (per-lecture live compute, #114) is not included: it is conflicting with
mainand was taken off the gate on 2026-09-10.#191 is a consumer-install change that only a real release install exercises, so the consumer bumps after this release are its first real test.
What this PR changes
CHANGELOG.md: the Unreleased entries move under## [2.7.0] - 2026-09-11, the fix(bundle): declare Node >=20 and install the shipped lockfile with npm ci #191 entry gains its PR link, the[2.7.0]compare link is added, and the Unreleased link now compares fromv2.7.0.package.json/package-lock.json: version 2.7.0.template.ymlis stamped by the release workflow.README.md: the two pinned URLs (thesite.templateexample and the git-metadata plugin) move to v2.7.0.After merge
Tag the merge commit and push the tag;
release.ymlbuilds the bundle and publishes the GitHub Release with this changelog section as the notes:Then bump
site.templatein lecture-wasm and on lecture-python-programming#363 (jb2) to the v2.7.0 asset.🤖 Generated with Claude Code