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
Retire #173 as a hand-maintained checklist and reorganise the lecture review & modernisation program into a project-lecture-improvements coordination repository, with a machine-refreshed JSON catalog as the live status layer — following the pattern already established by project-translation + status-translations and project-style-guide.
The prompt for this is @jstac's observation: "it's easy for something like #173 to fall out of date — e.g. we decide against a conversion but fail to update that issue — and also fail to have sufficient context for RAs." That is exactly right, and it is now measurable. A checkbox list in an issue body has no way to record a decision (we looked and decided not to convert), no way to notice that the world moved underneath it, and nowhere to put the per-lecture context an RA needs before picking up work.
Audit of the #173 body against live GitHub state, run 2026-07-22. The list holds 129 lecture rows (79 intermediate, 50 advanced), of which 7 are ticked, 42 carry an @handle, 25 carry a PR link, and 87 have neither an owner nor a PR — i.e. two-thirds of the list has been inert since it was written in August 2025.
cake_eatingproblem, cake_eating_numerical, optgrowth, optgrowth_fast, coleman_policy_iter, egm_policy_iter, ifp, mccall_correlated — renamed in the os_* / ifp_* reorganisation
Lectures in the repo but absent from the list
~60
46 in lecture-python.myst, 14 in lecture-python-advanced.myst (excluding intro/status/troubleshooting/zreferences)
Ticked with no PR recorded
2
mccall_model_with_separation, mccall_fitted_vfi — no evidence trail
The five abandoned PRs are the failure mode @jstac named: work was attempted, a call was made, and the list still reads as "in progress, assigned". Whatever the reason was, it is not written down anywhere a new RA can find it — so the next person either redoes it or avoids it without knowing why.
Of the 28 PRs referenced in #173: 13 merged, 5 closed, 10 still open (9 open + 1 draft), the oldest open since 2025-08-30.
The proposal
1. project-lecture-improvements — the coordination home
A project-* repo under QEP-3: decides and records why; private; goal-scoped; no production code. It carries the narrative that an issue body cannot hold:
ROADMAP.md / PLAN.md — what the program is, phases, exit criteria, what "improved" means per pass (typos & mathos, style-guide compliance, JAX conversion, exercise coverage).
DECISIONS.md — the decision register, including decided against calls with a reason and a date. This is the single highest-value artefact and the direct answer to the drift above.
RA onboarding — the workflow currently buried in the Lecture Improvement Project #173 preamble (assign yourself, one PR per lecture, DRAFT first, tag reviewers, sync zh-cn), plus per-lecture briefs: what this lecture is, why it is a candidate, what "done" looks like, known traps.
manifest.yml + make sync — the QEP-3 minimal command bench over lecture-python.myst, lecture-python-advanced.myst, lecture-jax, lecture-python-intro.
status/ — the catalog below, incubating here until it earns its own repo.
Suggested access: private, with the lecture-review-modernization team granted write, so RAs read the same source the maintainers do.
2. The status layer — a JSON catalog, not a checklist
One row per lecture, keyed {repo}/{slug}, seeded from lectures/*.md so the corpus is complete by construction and renames surface as diffs rather than silently rotting. Modelled on status-translations' data/latest.json + data/history/ contract.
Field
Owner
Notes
repo, slug, series, chapter
derived
seeded from the repo tree; a slug that disappears is flagged, not lost
last commit to the lecture file; last time a human confirmed the row
notes
human
the RA context
Proposed states: candidate · assigned · in-review (PR open) · done (PR merged) · declined (looked at, decided against — reason required) · not-applicable (e.g. pure-prose lecture, no code to accelerate) · blocked (e.g. upstream fix pending, chapter under active authorship by Tom).
declined and not-applicable are first-class terminal states. A checkbox list has exactly two states and that is why it drifts.
3. Derived vs human — the anti-drift mechanism
A nightly collector recomputes everything in the derived column from public GitHub state, so PR/issue/rename churn can never make the catalog stale; humans only ever own the judgement fields. That split is what makes status-translations reliable, and it applies cleanly here. The dashboard then answers, per series: how much of the corpus has had a review pass, what is in flight and how long it has sat, what was declined and why, and where the JAX candidates actually remain.
Per QEP-3's boundary rule ("a dashboard may incubate as hand-maintained tables inside a project repo; once its numbers are collected automatically on a cadence it graduates to a status-* repo named for the domain it measures"), the catalog starts in project-lecture-improvements/status/ and graduates to status-lecture-improvements once the collector is on a cron. Keeping it separate from status-lectures preserves that repo's domain (build/environment configuration, #321); the alternative — an editorial-progress page inside status-lectures as the umbrella "how are the lectures doing" URL — is a reasonable call to make instead, and is listed as a decision below.
Onboarding inventory
What moves into, or gets indexed by, the new repo:
Related meta issues to cross-link (not absorb): #332 Projects as the PM/reporting layer · #321 environment & config reporting · #299 NumPy Generator sweep · #320 action-code-style · #341code-figure directive · #333/#334 repo renames (they will move slugs under the catalog) · #310 Custom Course Builder, which already cross-references #173.
Relationship to meta#332
No conflict, and no duplication: issues stay the source of truth in their home repos, GitHub Projects stays the portfolio view for humans, and the catalog is the corpus-complete view — one row per lecture, including the ~60 lectures nobody has opened an issue about. Projects cannot represent "this lecture exists and has never been looked at", which is most of the work. The Lectures workstream in #332 can pull its status update straight from the catalog.
Proposed sequence
Agree the repo name and the status-repo question (below)
Create project-lecture-improvements (private; lecture-review-modernization team → write)
Post an update to the lecture-review-modernization team pointing at the new workflow
Decisions needed
Repo name — project-lecture-improvements (plural, proposed) vs project-lecture-improvement. Cosmetic; picking one unblocks the rest.
Scope — intermediate + advanced only (the Lecture Improvement Project #173 scope), or include lecture-python-intro? Intro carries the single largest improvement backlog (32 issues labelled improve or reading-group-*) and is the same kind of work, so including it is the recommendation.
Status home — own status-lecture-improvements repo on graduation (recommended, keeps domains clean), or an editorial page inside status-lectures as a single lectures umbrella.
Visibility — private like the other project-* repos (recommended, QEP-3 default), noting that a public catalog would let outside contributors self-serve; the dashboard can be published publicly either way.
Success criteria
Every lecture in the covered series has a row, and no row can silently misrepresent PR or issue state.
Every declined conversion has a reason and a date attached to it.
An RA can pick a lecture, read its brief, and start work without asking anyone what the context is.
"How is lecture modernisation going?" is answerable from one URL, without anyone updating a checklist.
Audit figures in this issue were computed on 2026-07-22 from the #173 body and live GitHub API state; the reconciliation script is the seed for the catalog collector.
Summary
Retire #173 as a hand-maintained checklist and reorganise the lecture review & modernisation program into a
project-lecture-improvementscoordination repository, with a machine-refreshed JSON catalog as the live status layer — following the pattern already established by project-translation + status-translations and project-style-guide.The prompt for this is @jstac's observation: "it's easy for something like #173 to fall out of date — e.g. we decide against a conversion but fail to update that issue — and also fail to have sufficient context for RAs." That is exactly right, and it is now measurable. A checkbox list in an issue body has no way to record a decision (we looked and decided not to convert), no way to notice that the world moved underneath it, and nowhere to put the per-lecture context an RA needs before picking up work.
Why now — #173 has measurably drifted
Audit of the #173 body against live GitHub state, run 2026-07-22. The list holds 129 lecture rows (79 intermediate, 50 advanced), of which 7 are ticked, 42 carry an
@handle, 25 carry a PR link, and 87 have neither an owner nor a PR — i.e. two-thirds of the list has been inert since it was written in August 2025.ar1_turningpts,mix_model,kesten_processes,mccall_correlated,mle,arellano,lucas_modelar1_bayes,kalman,career,jv,markov_assetcake_eatingproblem,cake_eating_numerical,optgrowth,optgrowth_fast,coleman_policy_iter,egm_policy_iter,ifp,mccall_correlated— renamed in theos_*/ifp_*reorganisationlecture-python.myst, 14 inlecture-python-advanced.myst(excludingintro/status/troubleshooting/zreferences)mccall_model_with_separation,mccall_fitted_vfi— no evidence trailThe five abandoned PRs are the failure mode @jstac named: work was attempted, a call was made, and the list still reads as "in progress, assigned". Whatever the reason was, it is not written down anywhere a new RA can find it — so the next person either redoes it or avoids it without knowing why.
Of the 28 PRs referenced in #173: 13 merged, 5 closed, 10 still open (9 open + 1 draft), the oldest open since 2025-08-30.
The proposal
1.
project-lecture-improvements— the coordination homeA
project-*repo under QEP-3: decides and records why; private; goal-scoped; no production code. It carries the narrative that an issue body cannot hold:make sync— the QEP-3 minimal command bench overlecture-python.myst,lecture-python-advanced.myst,lecture-jax,lecture-python-intro.Suggested access: private, with the
lecture-review-modernizationteam granted write, so RAs read the same source the maintainers do.2. The status layer — a JSON catalog, not a checklist
One row per lecture, keyed
{repo}/{slug}, seeded fromlectures/*.mdso the corpus is complete by construction and renames surface as diffs rather than silently rotting. Modelled onstatus-translations'data/latest.json+data/history/contract.repo,slug,series,chapterstatedecision,decision_reason,decision_date,decided_bystateisdeclinedownerprslectures/{slug}.md, with live open/merged/closed stateissues[{slug}] …— the repos already use this conventionjax_candidate,jax_signalsnumba/@jit/@njit/prange/vectorize+ explicit maintainer overridestyleguide_stateaction-style-guide/ audit.2026-05.style-guidelast_touched,last_verifiednotesProposed states: candidate · assigned · in-review (PR open) · done (PR merged) · declined (looked at, decided against — reason required) · not-applicable (e.g. pure-prose lecture, no code to accelerate) · blocked (e.g. upstream fix pending, chapter under active authorship by Tom).
declinedandnot-applicableare first-class terminal states. A checkbox list has exactly two states and that is why it drifts.3. Derived vs human — the anti-drift mechanism
A nightly collector recomputes everything in the derived column from public GitHub state, so PR/issue/rename churn can never make the catalog stale; humans only ever own the judgement fields. That split is what makes
status-translationsreliable, and it applies cleanly here. The dashboard then answers, per series: how much of the corpus has had a review pass, what is in flight and how long it has sat, what was declined and why, and where the JAX candidates actually remain.Per QEP-3's boundary rule ("a dashboard may incubate as hand-maintained tables inside a project repo; once its numbers are collected automatically on a cadence it graduates to a
status-*repo named for the domain it measures"), the catalog starts inproject-lecture-improvements/status/and graduates tostatus-lecture-improvementsonce the collector is on a cron. Keeping it separate from status-lectures preserves that repo's domain (build/environment configuration, #321); the alternative — an editorial-progress page insidestatus-lecturesas the umbrella "how are the lectures doing" URL — is a reasonable call to make instead, and is listed as a decision below.Onboarding inventory
What moves into, or gets indexed by, the new repo:
CONTRIBUTING.md/ RA onboarding docdeclined/blockeddecision written down, or a fresh ownerlecture-python.mystimprovement issuesjax-conversion,improve,good first issue[slug]title conventionlecture-python-advanced.mystissues[amss]JAX family and the style-guide review issue lecture-python-advanced.myst#261lecture-python-introissuesimproveorreading-group-2023/2024lecture-jaxissueslecture-review-modernizationteamRelated
metaissues to cross-link (not absorb): #332 Projects as the PM/reporting layer · #321 environment & config reporting · #299 NumPy Generator sweep · #320 action-code-style · #341code-figuredirective · #333/#334 repo renames (they will move slugs under the catalog) · #310 Custom Course Builder, which already cross-references #173.Relationship to meta#332
No conflict, and no duplication: issues stay the source of truth in their home repos, GitHub Projects stays the portfolio view for humans, and the catalog is the corpus-complete view — one row per lecture, including the ~60 lectures nobody has opened an issue about. Projects cannot represent "this lecture exists and has never been looked at", which is most of the work. The Lectures workstream in #332 can pull its status update straight from the catalog.
Proposed sequence
project-lecture-improvements(private;lecture-review-modernizationteam → write)ROADMAP.md,PLAN.md,DECISIONS.md,CONTRIBUTING.md,manifest.yml+ benchstatus/catalog.jsonfrom the repo trees, merged with the Lecture Improvement Project #173 rows and live PR stateDECISIONS.mdos_*/ifp_*reorganisationstatus-translations/collectorstructure[slug]status-lecture-improvementswhen the cron is greenlecture-review-modernizationteam pointing at the new workflowDecisions needed
project-lecture-improvements(plural, proposed) vsproject-lecture-improvement. Cosmetic; picking one unblocks the rest.lecture-python-intro? Intro carries the single largest improvement backlog (32 issues labelledimproveorreading-group-*) and is the same kind of work, so including it is the recommendation.status-lecture-improvementsrepo on graduation (recommended, keeps domains clean), or an editorial page insidestatus-lecturesas a single lectures umbrella.project-*repos (recommended, QEP-3 default), noting that a public catalog would let outside contributors self-serve; the dashboard can be published publicly either way.Success criteria
Audit figures in this issue were computed on 2026-07-22 from the #173 body and live GitHub API state; the reconciliation script is the seed for the catalog collector.