You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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).
How it ran: each open sub-issue was reviewed one at a time, in list order, before any implementation.
Where decisions go: each is stamped on its issue as a comment. An issue whose plan changes is revised in place.
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
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
✅ 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
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
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
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
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
Source migration: QuantEcon/workspace-lectures#64, the jb1 → jb2 source-migration project. It inventories every construct mystmd does not render across 20 lecture repos, and plans the cutover rewrite as one PR per repo; its tooling is QuantEcon/workspace-lectures#65.
New constructs: that inventory found four no issue had covered: capitalised {prf:Theorem} (live Unknown Directive callouts on lecture-wasm), {any}, {todo} and {fas}.
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.
🔄 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
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.
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.
The study's remaining partial rows (cosmetic and behavioural differences such as font-size persistence, the dark-mode palette and the header site title) are recorded in the study report and are not gate items.
✅ 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.
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).
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 jb2footer.mdis to be removed{raw}blocks{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{raw}source rewrite are addedlaunch_notebook_repois set andlaunch_colabis 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 foundsite_url(the home page points at the site root, the trailing-slash form is used, and nothing is emitted withoutsite_url), andog:urlis built by the same function. The scope is widened to every head link that assumes the domain root: the favicon,/myst-theme.cssand a full-URLog:image. #209 gains asite_urlrow. Redirects from the old URLs at cutover are filed as QuantEcon/mystmd#113contents_autoexpand: falsestays 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<ol>, part titles, self-listing)docs/and CONTRIBUTING.md against what shipped, before the PLAN.md close-outSpun out of the review so far:
{iframe}undermarkdown: commonmark) and ipynb export drops every raw node, including {raw} text and {raw} latex content, and logs an error that --strict does not count mystmd#111 (rawnodes).{prf:Theorem}(live Unknown Directive callouts on lecture-wasm),{any},{todo}and{fas}.languagesandtranslators, can become nested settings.nb_repository_urlvalues that name missing notebooks repositories.about_py.htmlbecomesabout-py/) and the fork cannot redirect, so redirect pages are to be written at build time.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.mystmdas 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.
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} jupyterand{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.
{raw}source rewrite, and language and analytics settings. Under #203 the licence footer needs no stepGates. 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:
settings.myst_to_ipynb.headerproject setting, so the notebook logo header comes from configuration instead of copies in lecture files.{iframe}undermarkdown: commonmark) and ipynb export drops every raw node, including {raw} text and {raw} latex content, and logs an error that --strict does not count mystmd#111 (rawnodes).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)
server:backend, incl. localhost) #154 (Thebe server/localhost compute) — demand-driven launch/compute enhancements beyond the book-theme feature set as the lecture repos actually configure it; none gates the cutover. Deliberately kept off the milestone. The study confirmed no lecture repo setsjupyterhub_url.thebe: false; built as PR feat(compute): per-lecture live compute via an enable_live_compute site option #195 on its own merits.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.