Skip to content

Book-theme parity cutover — tracking #147

Description

@mmcky

Repository: QuantEcon/quantecon-theme.mystmd
Revised: 2026-09-11 (eighteenth revision) — main @ d7ec6cd (v2.7.0 plus #200 and #202, no behaviour change); latest release v2.7.0 (2026-09-11); open PRs #195 (#114) off the gate; gate = the gaps found by the 2026-09-11 parity validation study, listed as native sub-issues; maintainer review complete: work the open sub-issues in list order; #183 and #181 wait on the designer
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.

Next session — resume here

Every item on the original gate is merged and released. v2.7.0 (2026-09-11) carried #182 (pinned, scroll-tracking outline, #196), Phase 6 (#92, #197), the declared site options (#173, #194), the 1280–1327px layout correction (#198) and the bundle-manifest change (#191). Both consumers moved the same day: QuantEcon/lecture-wasm#77 is merged and live on v2.7.0, and lecture-python-programming#363 pins it on jb2.

Before closing, a validation study checked parity end to end (section below). It found 8 theme gaps that would visibly break or degrade lecture sites at cutover, or leave the parity record wrong, and they are now this issue's open sub-issues; content-migration dependencies in the QuantEcon mystmd fork are referenced under Sequencing. Work them in sub-issue list order, skipping #183 and #181 until the designer answers: the list is the plan.

Maintainer review of the gate items (complete on 2026-09-11, apart from the designer's two).

Item Review state Outcome
#203 licence footer ✅ decided (decision) A theme default: when a site sets no site.parts.footer, the theme renders the CC BY-SA 4.0 notice and "A theme by QuantEcon", hard-coded, with the badge as an inline SVG. A site's footer.md replaces the whole default. lecture-python-programming's jb2 footer.md is to be removed
#204 notebook header {raw} blocks ✅ decided; body revised in place (revision) The fix leaves the theme, and the sources become mystmd-native. At cutover a rewrite script removes every {raw} block: the 549 notebook headers are deleted, 2 iframes become {iframe}, and 3 tables become HTML in the Markdown. lecture-wasm and the jb2 branch take it now, and this repo's PR preview runs it. The notebook header moves to a project setting (QuantEcon/mystmd#108). Open: where the rewrite script lives
#209 migration checklist ✏️ revised in place to carry #203 and #204 (revision) Nine checklist items. The footer needs no step; the notebook header setting and the {raw} source rewrite are added
#205 Launch control ✅ decided, one part deferred; body revised in place (decision) Launch becomes opt-in and explicit: it renders only when launch_notebook_repo is set and launch_colab is true, and no repository name is guessed. The options are flat for now (launch_notebook_repo, launch_notebook_branch, launch_notebook_dir, launch_notebook_source_dir, launch_colab), named as the nested paths they become once mystmd supports structured template options (QuantEcon/mystmd#112). Deferred: whether and where to check that a notebook exists before showing Launch. Current thinking is an in-page failsafe that shows it only when the notebook is found
#206 output plot alignment ✅ decided; plan unchanged (decision) One CSS rule centres images in cell outputs, both static and under live compute, with a fixture image test. Tables and text outputs stay left-aligned, as on the Sphinx sites. No upstream-registry entry: this is a QuantEcon style, not an upstream feature
#207 canonical link and favicon ✅ decided; body revised in place (decision) Canonical links come from site_url (the home page points at the site root, the trailing-slash form is used, and nothing is emitted without site_url), and og:url is built by the same function. The scope is widened to every head link that assumes the domain root: the favicon, /myst-theme.css and a full-URL og:image. #209 gains a site_url row. Redirects from the old URLs at cutover are filed as QuantEcon/mystmd#113
#208 outline h4 entries ✅ decided; plan unchanged (decision) List h2 to h4 in a tree that supports any depth. Expand the current entry's sub-list and its ancestors, as the Sphinx panel does, marking only the current entry. contents_autoexpand: false stays out of scope. The h4 indent needs no up-front design sign-off. If this lands first, #215's criteria widen to h2 to h4
#183, #181 ⏸ waiting on @DrDrij Follow-up questions posted 2026-09-11: #183 (byline colour, size, element, translator line, underline split) and #181 (period separator, <ol>, part titles, self-listing)
#210 parity record ✅ closed 2026-09-11 and split (closing comment) PLAN.md gets a closing note instead of a rewrite (#218). The docs lines no issue owns go to a final docs review (#217), the no-counterpart notes to #209, the drawer overlap and font-size reset to #219 and #220, and the dark palette to a design question on #187
#217 docs review 🆕 final task Review README, docs/ and CONTRIBUTING.md against what shipped, before the PLAN.md close-out
#218 PLAN.md close-out 🆕 last task Move the architecture, upstream-first and PR-preview guidance into CONTRIBUTING.md, then add a closing note to PLAN.md

Spun out of the review so far:

Before working this plan, re-verify it. The facts below were measured at the revision stamp; anything since is unaudited.

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-11)

Phases 0–6 are complete and released in v2.7.0. The gate now holds the gaps found by the 2026-09-11 validation study, filed as sub-issues. The maintainer review is complete: every item is decided except #183 and #181, which wait on the designer, and #210 was closed and split into two final tasks (#217, #218). None is implemented yet.

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 (2026-09-11) 🔄 Gap items from the study, plus #183 and #181 moved from #187. Review complete: #203, #204, #205, #206, #207 and #208 decided (#205's notebook-existence check deferred); #209 revised; #210 closed and split into #217 and #218; #183 and #181 wait on the designer; none implemented
Per-lecture live-compute enablement ➖ off the gate (#114); built as PR #195
Live-compute toggle design review ➖ off the gate (#128), 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. Membership and order are the sub-issue list's; this table carries only what each phase is for and when it is finished.

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; byline and translator links pass WCAG AA; landing-page listings match the Sphinx enumerators and part captions
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. The close-out phase waits on the others: the docs review (#217) first, then the PLAN.md close-out (#218). #183 and #181 wait on the designer. Everything else can start now.

Sequencing

Phases 0–6 are done and in consumers' hands (v2.3.1 through v2.7.0; lecture-wasm and lecture-python-programming#363 pin v2.7.0). What remains is the study's gap list, worked in sub-issue order: decisions, content correctness, navigation, migration readiness, then the close-out: the docs review (#217) and the PLAN.md close-out (#218). When the list is empty: cut a release, bump both consumers, and the gate is green.

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

Applied. The gate items from the study are on the book-theme parity milestone. The milestone and this tracking issue describe the same gate — the milestone for label-level filtering, this issue for native sub-issue progress and sequencing.

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