Skip to content

Book-theme parity cutover — tracking #147

Description

@mmcky

Repository: QuantEcon/quantecon-theme.mystmd
Revised: 2026-09-14 (nineteenth revision, final) — main @ 2ca0288 (v3.0.0); latest release v3.0.0 (2026-09-12); open PRs #195 (#114) off the gate; gate complete: every sub-issue is closed, v3.0.0 carries the work, and both consumers have taken it. #183 and #181 moved back to the design review #187
Scope: everything that must land before the all-at-once migration of the QuantEcon lecture series to MyST / Jupyter Book ≥2 on this theme.
Sources: PLAN.md on main; the book-theme parity milestone; the #93 maintainer resolutions (2026-08-24, recorded in #145); the 2026-09-04 scope change on #143; the 2026-09-11 parity validation study (quantecon-book-theme @ 649cc376, this theme @ 5260864, 103 features assessed and adversarially verified, headline claims re-checked against live sites).

This is a long-lived tracker, not a period plan: it is the single source of truth for cutover-gate state, revised in place against live state rather than accumulating narrative, and it is resumed and updated but never session-closed. Revision history is in the comments.

Outcome — gate complete

Every gate item is closed, released and in consumers' hands. The validation study's gaps were implemented one issue per PR on 2026-09-12 and released together in v3.0.0 (2026-09-12), a major release because #205 makes Launch opt-in. Both consumers moved to it the same day: QuantEcon/lecture-wasm#78 is merged on main, and QuantEcon/lecture-python-programming#629 is merged into jb2, the branch behind the experimental build PR QuantEcon/lecture-python-programming#363.

#183 and #181 moved back to #187 on 2026-09-14, by maintainer decision: both are style questions for @DrDrij's design review, not parity defects the cutover waits on. That leaves this issue with no open sub-issues, and the book-theme parity milestone at 0 open and 21 closed.

What still gates the cutover is outside this theme: QuantEcon/mystmd#113 (redirects for the old Sphinx URLs) blocks it, and the source rewrite is coordinated in QuantEcon/workspace-lectures#64. Both are under Sequencing.

Item Decision Landed
#203 licence footer decision: a theme default, with a site's footer.md replacing it whole #221, v3.0.0
#204 notebook header {raw} blocks revision: the sources become mystmd-native through a rewrite script, and the header moves to a project setting (QuantEcon/mystmd#108) #222 (scripts/rewrite-raw-blocks.mjs, run by the PR preview), v3.0.0
#205 Launch control decision: opt-in and explicit, through flat launch_* options, and no repository name is guessed #224, v3.0.0 (breaking). The notebook-existence check is deferred to #223
#206 output plot alignment decision: images in cell outputs are centred, while tables and text stay left-aligned #225, v3.0.0
#207 canonical link and favicon decision: canonical and og:url come from site_url, and every head link is aware of the base URL #227, v3.0.0
#208 outline h4 entries decision: h2 to h4 in a tree of any depth, expanding as the Sphinx panel does #228, v3.0.0
#209 migration checklist revision: a checklist page, with the no-counterpart table #226 (docs/migrating.md), v3.0.0
#210 parity record closed and split into #217 and #218 ➖ not planned
#217 docs review Review README, docs/ and CONTRIBUTING.md against what shipped #229, plus the README's pinned v3.0.0 URLs in #236
#218 PLAN.md close-out Move the lasting guidance to CONTRIBUTING.md and add a closing note to PLAN.md #230
#183, #181 Style questions that wait on @DrDrij (#183, #181) ↩️ moved back to #187 on 2026-09-14

Spun out of the review:

Background

The parity project brings this theme to feature parity with quantecon-book-theme (Sphinx, JB<2) ahead of migrating the lecture series. Phases 0–2 (release infrastructure, git-history headers, launch parity with Colab + in-page JupyterLite/Thebe) shipped in v2.3.0 (2026-08-20); lecture-wasm is live on it and has tracked every release since (v2.7.0 as of QuantEcon/lecture-wasm#77, 2026-09-11). The #93 maintainer decisions (closed 2026-08-24) settled the remaining strategy: features are built local-first with upstreaming deferred to a registry (UPSTREAM-CANDIDATES.yml), and — most consequentially — the migration is all-or-nothing: every lecture series moves at once, onto a single common publishing base, when parity is complete. That decision converts the remaining parity backlog from nice-to-have into a hard cutover gate, and this issue is the single tracker for that gate.

One #93 resolution has since been superseded: the git-metadata plugin was to live permanently in this repo, but decision D8 of the report-theme design review (2026-09-02) created QuantEcon/quantecon-plugins.mystmd as the plugin family's home. The move is QuantEcon/quantecon-plugins.mystmd#11, this repo's side of it is #157, and the living-document corrections are #159. It does not gate the cutover.

Where we stand (verified 2026-09-14)

The gate is complete. Phases 0–6 were released by v2.7.0, and the gaps found by the 2026-09-11 validation study by v3.0.0.

Area State
Phases 0–2 (release infra, git history, launch/live compute) ✅ shipped v2.3.0
Live compute correctness on shipped surface (#117) ✅ fixed (#137), released in v2.3.1
Static builds of the self-hosted stylesheets (#138) ✅ fixed (#139), released in v2.3.1
Residual static-build defect in route stylesheets (#150) ✅ fixed (#151), released in v2.4.0
Private JupyterHub launch option (#87) ✅ removed (#152), released in v2.5.0
Phase 3 — code highlighting + colour schemes (#89) ✅ merged (#171), released in v2.6.0 — defaults only, switches deferred; contrast decision open in #172
Phases 4+5 — i18n + RTL (#90, #91) ✅ merged (#174), released in v2.6.0 — no translated edition builds on it yet
Translator attribution (#143) ✅ merged (#174), released in v2.6.0, on the book-theme v0.22.0 placement
Back navigation on static builds (#186) ✅ merged (#192), released in v2.6.1
Pinned, scroll-tracking "On this page" outline (#182) ✅ merged (#196), released in v2.7.0
Phase 6 — Meta/SEO + collapsible stderr + parity docs (#92) ✅ merged (#197), released in v2.7.0
Parity validation study gaps (#203#209, #217, #218) ✅ merged (#221, #222, #224#230), released in v3.0.0; #210 closed and split; #183 and #181 moved back to #187
Consumers on v3.0.0 QuantEcon/lecture-wasm#78 merged; QuantEcon/lecture-python-programming#629 merged into jb2
Per-lecture live-compute enablement ➖ off the gate (#114); built as PR #195
Live-compute toggle design review ➖ off the gate (#128), in #187
Byline contrast, landing-page listing (#183, #181) ➖ off the gate 2026-09-14, back in #187

Parity work that landed outside this item list. v2.4.0 (2026-09-04) and v2.5.0 (2026-09-05) carried a run of visual-parity changes that were never phased in PLAN.md: content typography matched to the existing builds (#155), the Sphinx lecture heading typography restored (#166), content links coloured QuantEcon blue (#167), the icon-only search trigger (#165), the contents drawer rebuilt on the Popover API (#144) and the first-paint fixes (#168, #169). v2.7.0 added the 1280–1327px layout correction (#198). They narrow the visible gap to the Sphinx sites but were not gate items; they are recorded here so the tracker does not understate what has shipped.

Parity validation study (2026-09-11)

The study inventoried quantecon-book-theme in eight independent sweeps (config surface, template, scripts, styles, user docs, changelog and tests, the fixtures corpus, and which options the lecture repos actually set across 29 repos), consolidated 100 features, assessed each against this theme with an adversarial reviewer and adjudication of disputes, and added 3 features a completeness critic found. Result: 28 implemented, 50 partial, 13 missing and untracked, 1 missing and tracked, 6 dropped by earlier decision, 5 not applicable. The headline claims were then re-checked against the live lecture-wasm site, the lecture-python-programming preview and the lecture sources; one was corrected and then re-corrected: both forms of the notebook header ({raw} jupyter and {raw} html) render as literal markup under the page title; the study's scale was essentially right (about 456 lecture files across the lecture repos; the #204 review later counted 549 header blocks across 18 lecture repos).

The gate items it produced, by phase. Every phase has met its exit criterion.

Phase Intent Exit criterion
Decisions Settle the question a fix depends on The licence-footer default is decided
Content correctness Remove defects a reader sees on lecture pages at cutover No literal notebook-header markup; Launch shows no dead links and can be switched off; plots centred; canonical emitted and the favicon resolves on sub-path sites. The byline contrast (#183) and the landing-page listing (#181) left this criterion when they moved back to #187
Navigation Match the Sphinx outline depth h4 sections appear in "On this page" and expand under an active h3
Migration readiness Make the theme configuration move cleanly A migration checklist page names every step the Sphinx build did implicitly: maths macros, git-metadata history depth, notebook repo naming, the notebook header setting, the {raw} source rewrite, and language and analytics settings. Under #203 the licence footer needs no step
Close-out Close on an accurate record The docs describe what shipped (#217), and PLAN.md carries a closing note, with its lasting guidance moved to CONTRIBUTING.md (#218)

Gates. None remain. The close-out ran last, as planned: the docs review (#217), then the PLAN.md close-out (#218).

Sequencing

The gate is green. Phases 0–6 shipped in v2.3.1 through v2.7.0, and the study's gap list in v3.0.0. Both consumers pin v3.0.0.

The cutover itself — repointing every lecture repo and running the migration — belongs to the lecture migration project and is deliberately not a sub-issue here; this gate is an input to its migration-route decision.

Migration dependencies outside the theme. The study found lecture-source constructs the QuantEcon mystmd fork does not yet handle: {nb-exec-table} (QuantEcon/mystmd#76), {only}, {glue:figure} and {youtube} render as error callouts until supported or rewritten, and the scroll-output cell tags are silently ignored, so long outputs render at full length. They are filed as QuantEcon/mystmd#104 ({only}), QuantEcon/mystmd#105 ({glue:figure}), QuantEcon/mystmd#106 (scroll-output tags) and QuantEcon/mystmd#107 (the {youtube} decision). They are filed in QuantEcon/mystmd without a parent: they gate the content migration (they surface when the lecture sources build on the fork), not this theme's parity, so they are referenced here rather than tracked.

Added by the #204 review:

All four are filed without a parent. The lecture-source side is coordinated in QuantEcon/workspace-lectures#64: the inventory, the rewrite rules and the one-PR-per-repo rollout at cutover. That issue also tracks the constructs its inventory found that no other issue covers: {prf:Theorem}, {any}, {todo} and {fas}.

Added by the #207 review: QuantEcon/mystmd#113, redirect pages written at build time for the old Sphinx page URLs and the existing redirect maps. Without it every inbound link to the lecture sites breaks, so unlike the other dependencies it blocks the cutover. Each repository's redirect map is recorded on QuantEcon/workspace-lectures#64.

Not in scope (and why)

Tracker hygiene

In sync. The book-theme parity milestone and this issue describe the same gate: 0 open and 21 closed. #183 and #181 left the milestone when they moved back to #187, whose items carry no milestone.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions