Full audit · regenerated from each repo's main
Dataset registry — Python lecture family
1Hosting patterns in use
Eight distinct patterns. The 2026-07-15 audit found seven; adding lecture-wasm surfaced the sibling repo URL pattern, and the migration added data-lectures while retiring legacy-repo URL entirely.
| Pattern | What it looks like | Refs | Where |
|---|---|---|---|
| data-lectures | reads this repo's published tree — the target state | 65 | advanced.myst, intro, programming, python.myst, wasm |
| written by the lecture itself, then read back | 12 | dp, intro, jax, programming, python.myst, wasm | |
| live API | fetched at build time from a third-party service | 23 lectures | advanced.myst, intro, programming, python.myst, wasm |
2 URL spellings for "raw file on GitHub"
- github.com/{org}/{repo}/raw/{ref}/…
- raw.githubusercontent.com/{org}/{repo}/{ref}/…
Down from six — the blob/master…?raw=true spelling retired with the
legacy-repo refs. One canonical spelling is a styleguide question for
QuantEcon.manual#108.
2Registry A — static dataset files (40)
Every distinct file a lecture reads, grouped by the repo that owns the bytes. lecture-wasm mirrors intro's lectures and reads intro's copies by URL, so it appears as a consumer, not an owner.
| File | Contents | Lecture(s) | Hosting | Flags / notes |
|---|---|---|---|---|
| data-lectures — 40 files | ||||
| NEWQDATA.csv | Cogley-Sargent (2005) "Drifts and Volatilities" — quarterly US inflation, unemployment and T-bill rate | phillips_drifts_volatilities | data-lectures | ✓ migrated |
| SCF_plus_mini.csv | SCF+ mini — net wealth, income and survey weights, 1950-2016 | inequality, inequality (wasm) | data-lectures | ✓ migrated |
| SCF_plus_mini_no_weights.csv | SCF+ mini, weight-expanded — net wealth and income, 1950-2016 | mle, mle (wasm) | data-lectures | ✓ migrated |
| acs_data_summary.csv | American Community Survey — earnings count, mean and dispersion by occupation cell | match_transport | data-lectures | ✓ migrated |
| ames_house_prices.csv | Ames, Iowa — residential house sales, 2006-2010 | bivariate_dist, fitting_distributions, observed_distributions | data-lectures | ✓ migrated |
| assignat.xlsx | French Revolution — assignat issues, budgets and seigniorage (Sargent-Velde) | french_rev, french_rev (wasm) | data-lectures | ✓ migrated |
| bbh_macro_quarterly.csv | Bhandari-Borovička-Ho replication — quarterly US macro series for the belief-wedge VAR, 1955Q1-2019Q4 | subjective_beliefs_business_cycles | data-lectures | ✓ migrated |
| bbh_michigan_monthly.csv | Michigan Surveys of Consumers monthly aggregates and the US unemployment rate, 1978-01 to 2020-03 (BBH replication extract) | subjective_beliefs_business_cycles | data-lectures | ✓ migrated |
| caron.npy | French Revolution — monthly specie value of the assignat, 1791-1796 | french_rev, french_rev (wasm) | data-lectures | ✓ migrated |
| chapter_3.xlsx | The Ends of Four Big Inflations — appendix tables, transcribed | inflation_history, inflation_history (wasm) | data-lectures | ✓ migrated |
| cities_brazil.csv | World Population Review — Brazilian city populations, 2023 | heavy_tails, heavy_tails (wasm) | data-lectures | ✓ migrated |
| cities_us.csv | World Population Review — US city populations, 2023 | heavy_tails, heavy_tails (wasm) | data-lectures | ✓ migrated |
| countries.csv | WorldData.info country reference table | pandas_panel | data-lectures | ✓ migrated |
| dataBHS.csv | Barillas-Hansen-Sargent "Doubts or variability?" — quarterly US log consumption and real returns, 1948Q1-2006Q4 | five_preferences | data-lectures | ✓ migrated |
| dette.xlsx | French Revolution — public debt, military spending and revenues (Sargent-Velde) | french_rev, french_rev (wasm) | data-lectures | ✓ migrated |
| employ.csv | Eurostat employment in Europe — by age and sex, 2007–2016 | pandas_panel | data-lectures | ✓ migrated |
| epl_match_goals.csv | English Premier League — full-time scores, 2015-16 to 2024-25 | fitting_distributions | data-lectures | ✓ migrated |
| fig_3.xlsx | French Revolution — figure 3 series (Sargent-Velde) | french_rev, french_rev (wasm) | data-lectures | ✓ migrated |
| forbes-billionaires.csv | Forbes Billionaires — individual net worth | heavy_tails, heavy_tails (wasm) | data-lectures | ✓ migrated |
| forbes-global2000.csv | Forbes Global 2000 — firm size measures | heavy_tails, heavy_tails (wasm) | data-lectures | ✓ migrated |
| fp.dta | Treisman (2016) Russia's Billionaires — country-year panel of billionaire counts and covariates | mle | data-lectures | ✓ migrated |
| fred_data.csv | US Treasury yields and NBER recessions — GS1/GS5/GS10, DFII5/DFII10 and USREC, monthly 1953-04 to 2024-12 | risk_aversion_or_mistaken_beliefs | data-lectures | ✓ migrated |
| hansen_jagannathan_1991_data.json | Hansen-Jagannathan (1991) replication — US asset returns 1891-1986, with annual consumption (three-table bundle) | hansen_jagannathan_1991 | data-lectures | ✓ migrated |
| hansen_singleton_1982_data.csv | Hansen-Singleton (1982) replication — monthly US gross real market return and consumption growth, 1959-1978 | hansen_singleton_1982 | data-lectures | ✓ migrated |
| hansen_singleton_1983_data.csv | Hansen-Singleton (1983) replication — monthly US returns, consumption and inflation, 1959-1978 | hansen_singleton_1983 | data-lectures | ✓ migrated |
| japan_deaths_by_age.csv | Japan — deaths by single year of age, 2023 | fitting_distributions, observed_distributions | data-lectures | ✓ migrated |
| japan_earthquakes.csv | Japan region — earthquakes of magnitude 5 and above, 2000-2024 | fitting_distributions | data-lectures | ✓ migrated |
| japan_population_by_age.csv | Japan — population by single year of age, 2024 | prob_dist | data-lectures | ✓ migrated |
| life-expectancy-vs-gdp-per-capita.csv | Life expectancy vs GDP per capita — Our World in Data grapher export | simple_linear_regression, simple_linear_regression (wasm) | data-lectures | ✓ migrated |
| lingcod_msy_recovery.csv | Pacific Coast lingcod — biomass and fishing pressure relative to MSY | msy_fishery | data-lectures | ✓ migrated |
| longprices.xls | Price levels in four hard-currency countries, 1600-2000 | inflation_history, inflation_history (wasm) | data-lectures | ✓ migrated |
| maketable1.dta | Acemoglu-Johnson-Robinson (2001) colonial origins — table 1 replication data | ols | data-lectures | ✓ migrated |
| maketable2.dta | Acemoglu-Johnson-Robinson (2001) colonial origins — table 2 replication data | ols | data-lectures | ✓ migrated |
| maketable4.dta | Acemoglu-Johnson-Robinson (2001) colonial origins — table 4 replication data | ols | data-lectures | ✓ migrated |
| mpd2020.xlsx | Maddison Project Database 2020 — GDP per capita and population, 1 CE to 2018 | long_run_growth, long_run_growth (wasm) | data-lectures | ✓ migrated |
| nom_balances.npy | French Revolution — monthly nominal assignat balances, 1789-1796 | french_rev, french_rev (wasm) | data-lectures | ✓ migrated |
| realwage.csv | OECD real minimum wages — 32 countries, 2006–2016 | pandas_panel | data-lectures | ✓ migrated |
| test_pwt.csv | Penn World Table teaching extract — eight countries, year 2000 | pandas, polars | data-lectures | ✓ migrated |
| us_adult_heights.csv | United States — adult standing height by sex, NHANES 2015-2018 | fitting_distributions, observed_distributions, prob_dist | data-lectures | ✓ migrated |
| usa-gini-nwealth-tincome-lincome.csv | US Gini coefficients — net wealth, total income and labour income, 1950-2016 | inequality, inequality (wasm) | data-lectures | ✓ migrated |
3Registry B — data embedded in lecture source (8 files)
Written to the working directory by the lecture itself (%%file,
%%writefile, or an in-lecture open(…, 'w')), then read back.
Self-contained everywhere — including Colab — at the cost of data living inside narrative source.
| File | Lecture(s) | Series |
|---|---|---|
| graph.txt | short_path | dp · intro · jax · wasm — same data maintained in 4 repos |
| newfile.txt | python_essentials | programming |
| numbers.txt | debugging | programming |
| output.txt | python_essentials | programming |
| output2.txt | python_essentials | programming |
| test_table.csv | python_advanced_features | programming |
| us_cities.txt | python_advanced_features, python_essentials | programming |
| web_graph_data.txt | finite_markov | python.myst |
4Registry C — live API data (23 lectures)
Fetched at build time from third-party services — the build-reproducibility surface, and the blocker for the WASM/JupyterLite target (pyodide cannot reach most of these APIs; that is lecture-wasm's core problem, meta#143).
| Provider / access | Series or tickers | Lecture | Series | Why live |
|---|---|---|---|---|
| FRED fredgraph.csv URL | PCND, PCESV, DPCERD3Q086SBEA, CNP16OV | doubts_or_variability | advanced.myst | incidental |
| FRED fredgraph.csv URL | USREC | subjective_beliefs_business_cycles | advanced.myst | incidental |
| FRED pandas_datareader | UNRATE, USREC, M0892AUSM156SNBR, UMCSENT, CPILFESL, INDPRO | business_cycle | intro | mixed snapshot pipeline already exists (data-lectures business_cycle_data.csv) but is unadopted |
| FRED fredgraph.csv URL | UNRATE | pandas | programming | API is the lesson |
| FRED fredgraph.csv URL | UNRATE | polars | programming | API is the lesson mirror of pandas' FRED section — the lesson is pl.read_csv from a URL |
| FRED fredgraph.csv URL | CPIAUCSL, UNRATE, TB3MS | phillips_drifts_volatilities | python.myst | incidental splices post-2000Q4 observations onto the Cogley-Sargent sample (NEWQDATA.csv) to test whether the extra quarter-century changes the findings. Snapshot-ready, but a snapshot would need periodic refresh — the section's point is the *latest* vintage
|
| FRED pandas_datareader | PCEPI, GDPC1, GDPPOT, FEDFUNDS | phillips_lost_conquest | python.myst | incidental |
| FRED pandas_datareader | CPIAUCNS, LNS14000028 | phillips_two_stories | python.myst | incidental LNS14000028 is the unemployment rate for white men 20+ |
| FRED pandas_datareader | M2SL, GDPDEF, GDPC1, TB3MS | sargent_surico | python.myst | incidental |
| FRED pandas_datareader | UNRATE | unemployment_linear | python.myst | incidental |
| FRED pandas_datareader | UNRATE | unemployment_shocks | python.myst | incidental |
| FRED pandas_datareader | UNRATE, USREC, M0892AUSM156SNBR, UMCSENT, CPILFESL, INDPRO | business_cycle | wasm | mixed mirror of intro's business_cycle; cannot run under pyodide |
| FRED pandas_datareader | historical mirror — intro has since moved off pandas_datareader here | heavy_tails | wasm | incidental mirror of an older intro heavy_tails |
| World Bank wbgapi | NY.GDP.MKTP.KD.ZG, SL.UEM.TOTL.NE.ZS, FS.AST.PRVT.GD.ZS | business_cycle | intro | mixed teaches wb.series.info querying and metadata as part of the narrative |
| World Bank wbgapi | NY.GDP.MKTP.CD | heavy_tails | intro | incidental |
| World Bank wbgapi | SI.POV.GINI, NY.GDP.PCAP.KD | inequality | intro | mixed demonstrates searching for the Gini series ID with wbgapi |
| World Bank wbgapi | GC.DOD.TOTL.GD.ZS | pandas | programming | API is the lesson the section is literally "Using wbgapi and yfinance to Access Data" |
| World Bank wbgapi | NY.GDP.MKTP.KD.ZG, SL.UEM.TOTL.NE.ZS, FS.AST.PRVT.GD.ZS | business_cycle | wasm | mixed mirror of intro's business_cycle; cannot run under pyodide |
| World Bank wbgapi | SI.POV.GINI, NY.GDP.PCAP.KD | inequality | wasm | mixed mirror of intro's inequality |
| Yahoo Finance yfinance | AMZN, COST | bivariate_dist | intro | incidental two downloads in a solved exercise, fitting a bivariate normal to monthly returns; the lecture points at observed_distributions for the same workflow, so the fetch is the illustration's input rather than its lesson
|
| Yahoo Finance yfinance | CT=F | commod_price | intro | incidental |
| Yahoo Finance yfinance | AMZN | fitting_distributions | intro | incidental one download, for the section showing that a normal fit to monthly returns fails in the tails
|
| Yahoo Finance yfinance | AMZN, BTC-USD | heavy_tails | intro | incidental |
| Yahoo Finance yfinance | AMZN, COST | observed_distributions | intro | incidental moved here from prob_dist by lecture-python-intro#811, which split the observed-data half of that lecture into observed_distributions; prob_dist no longer calls yfinance
|
| Yahoo Finance yfinance | 11-ticker exercise list | pandas | programming | API is the lesson |
| Yahoo Finance yfinance | 11-ticker exercise list | polars | programming | API is the lesson mirror of pandas' yfinance exercise, rewritten with pl.DataFrame |
| Yahoo Finance yfinance | ^IXIC | kesten_processes | python.myst | incidental |
| Yahoo Finance yfinance | CT=F | commod_price | wasm | incidental mirror of intro's commod_price |
| Yahoo Finance yfinance | AMZN, BTC-USD | heavy_tails | wasm | incidental mirror of intro's heavy_tails |
| Yahoo Finance yfinance | AMZN, COST | prob_dist | wasm | incidental mirror of intro's prob_dist |
5Cross-series reuse
Files consumed by more than one repo. Before the migration the only true cross-series files were the pandas_panel trio; the wasm mirror now multiplies every intro dataset into a second consumer.
| Dataset | Consumers | How it's shared today |
|---|---|---|
| SCF_plus_mini.csv | intro + wasm | all consumers read data-lectures — the target state |
| SCF_plus_mini_no_weights.csv | intro + wasm | all consumers read data-lectures — the target state |
| assignat.xlsx | intro + wasm | all consumers read data-lectures — the target state |
| caron.npy | intro + wasm | all consumers read data-lectures — the target state |
| chapter_3.xlsx | intro + wasm | all consumers read data-lectures — the target state |
| cities_brazil.csv | intro + wasm | all consumers read data-lectures — the target state |
| cities_us.csv | intro + wasm | all consumers read data-lectures — the target state |
| countries.csv | programming + python.myst | all consumers read data-lectures — the target state |
| dette.xlsx | intro + wasm | all consumers read data-lectures — the target state |
| employ.csv | programming + python.myst | all consumers read data-lectures — the target state |
| fig_3.xlsx | intro + wasm | all consumers read data-lectures — the target state |
| forbes-billionaires.csv | intro + wasm | all consumers read data-lectures — the target state |
| forbes-global2000.csv | intro + wasm | all consumers read data-lectures — the target state |
| life-expectancy-vs-gdp-per-capita.csv | intro + wasm | all consumers read data-lectures — the target state |
| longprices.xls | intro + wasm | all consumers read data-lectures — the target state |
| mpd2020.xlsx | intro + wasm | all consumers read data-lectures — the target state |
| nom_balances.npy | intro + wasm | all consumers read data-lectures — the target state |
| realwage.csv | programming + python.myst | all consumers read data-lectures — the target state |
| usa-gini-nwealth-tincome-lincome.csv | intro + wasm | all consumers read data-lectures — the target state |
| graph.txt | dp + intro + jax + wasm | duplicated as %%file blocks — 4 copies of the same data to keep in sync |
6Committed but unreferenced data files (24)
Files in a repo's tree that no executed code cell reads. Orphan-sweep candidates are tracked in meta#337; shadowed and exercise-download files are functional, just invisible to a URL-level audit.
| File | State | Why |
|---|---|---|
| lecture-python-intro — 4 files | ||
| lectures/datasets/GDP_per_capita_world_bank.csv | orphan | no reference anywhere; the QuantEcon/data copy was dropped at Phase 2 |
| lectures/datasets/Metadata_Country_API_NY.GDP.PCAP.CD_DS2_en_csv_v2_4770417.csv | orphan | metadata twin of the World Bank GDP-per-capita orphan |
| lectures/datasets/fig_3.ods | orphan | source-format twin of fig_3.xlsx; referenced by nothing |
| lectures/graph.txt | short_path regenerates it via %%file before reading it, so the committed bytes are never consumed — the build prints "Overwriting graph.txt". It became an orphan when QuantEcon/lecture-wasm#63 removed the only URL read of it in the organisation; deletable as Track X | |
| lecture-python-programming — 5 files | ||
| lectures/_static/lecture_specific/pandas/data/ticker_data.csv | orphan | no reference anywhere |
| lectures/_static/lecture_specific/python_advanced_features/numbers.txt | debugging lecture writes it with %%file | |
| lectures/_static/lecture_specific/python_advanced_features/test_table.csv | exercise download | prose exercise link tells the reader to download this exact URL — keep |
| lectures/_static/lecture_specific/python_foundations/test_table.csv | orphan | duplicate of the python_advanced_features copy |
| lectures/_static/lecture_specific/python_foundations/us_cities.txt | python_essentials writes it with %%writefile | |
| lecture-python.myst — 2 files | ||
| lectures/_static/lecture_specific/finite_markov/web_graph_data.txt | finite_markov writes it with %%file | |
| lectures/web_graph_data.txt | shadowed duplicate at lectures/ root | |
| lecture-dp — 10 files | ||
| lectures/_static/lecture_specific/finite_markov/web_graph_data.txt | orphan | inherited from python.myst; no finite_markov data reference in this repo |
| lectures/_static/lecture_specific/match_transport/acs_data_summary.csv | orphan | inherited copy, no consuming lecture in this repo |
| lectures/_static/lecture_specific/mle/fp.dta | orphan | inherited from python.myst, no consuming lecture |
| lectures/_static/lecture_specific/ols/maketable1.dta | orphan | inherited from python.myst, no consuming lecture |
| lectures/_static/lecture_specific/ols/maketable2.dta | orphan | inherited from python.myst, no consuming lecture |
| lectures/_static/lecture_specific/ols/maketable4.dta | orphan | inherited from python.myst, no consuming lecture |
| lectures/_static/lecture_specific/pandas_panel/countries.csv | orphan | inherited copy; the consuming lectures live in other repos and now read data-lectures |
| lectures/_static/lecture_specific/pandas_panel/employ.csv | orphan | inherited copy; the consuming lectures live in other repos and now read data-lectures |
| lectures/_static/lecture_specific/pandas_panel/realwage.csv | orphan | inherited copy; the consuming lectures live in other repos and now read data-lectures |
| lectures/graph.txt | short_path regenerates it via %%file | |
| lecture-wasm — 2 files | ||
| lectures/datasets/GDP_per_capita_world_bank.csv | orphan in intro, mirrored into wasm | |
| lectures/datasets/Metadata_Country_API_NY.GDP.PCAP.CD_DS2_en_csv_v2_4770417.csv | orphan in intro, mirrored into wasm | |
| continuous_time_mcs — 1 files | ||
| lectures/old_stuff.txt | orphan | scratch file at lectures/ root; referenced by nothing |
7Provenance — how each file came to exist
The axis the manifest convention formalizes (verbatim / constructed / dynamic snapshot, meta#336). For migrated datasets this comes from their manifests; for everything else, from the curated audit annotations.
| File | Provenance | Recorded in |
|---|---|---|
| verbatim — 12 | ||
| assignat.xlsx | French Revolution — assignat issues, budgets and seigniorage (Sargent-Velde) | manifest |
| cities_brazil.csv | World Population Review — Brazilian city populations, 2023 | manifest |
| cities_us.csv | World Population Review — US city populations, 2023 | manifest |
| countries.csv | WorldData.info country reference table | manifest |
| dette.xlsx | French Revolution — public debt, military spending and revenues (Sargent-Velde) | manifest |
| fig_3.xlsx | French Revolution — figure 3 series (Sargent-Velde) | manifest |
| fp.dta | Treisman (2016) Russia's Billionaires — country-year panel of billionaire counts and covariates | manifest |
| life-expectancy-vs-gdp-per-capita.csv | Life expectancy vs GDP per capita — Our World in Data grapher export | manifest |
| longprices.xls | Price levels in four hard-currency countries, 1600-2000 | manifest |
| maketable1.dta | Acemoglu-Johnson-Robinson (2001) colonial origins — table 1 replication data | manifest |
| maketable2.dta | Acemoglu-Johnson-Robinson (2001) colonial origins — table 2 replication data | manifest |
| maketable4.dta | Acemoglu-Johnson-Robinson (2001) colonial origins — table 4 replication data | manifest |
| constructed · builder committed — 18 | ||
| NEWQDATA.csv | Cogley-Sargent (2005) "Drifts and Volatilities" — quarterly US inflation, unemployment and T-bill rate | manifest |
| SCF_plus_mini.csv | SCF+ mini — net wealth, income and survey weights, 1950-2016 | manifest |
| SCF_plus_mini_no_weights.csv | SCF+ mini, weight-expanded — net wealth and income, 1950-2016 | manifest |
| ames_house_prices.csv | Ames, Iowa — residential house sales, 2006-2010 | manifest |
| bbh_macro_quarterly.csv | Bhandari-Borovička-Ho replication — quarterly US macro series for the belief-wedge VAR, 1955Q1-2019Q4 | manifest |
| bbh_michigan_monthly.csv | Michigan Surveys of Consumers monthly aggregates and the US unemployment rate, 1978-01 to 2020-03 (BBH replication extract) | manifest |
| dataBHS.csv | Barillas-Hansen-Sargent "Doubts or variability?" — quarterly US log consumption and real returns, 1948Q1-2006Q4 | manifest |
| epl_match_goals.csv | English Premier League — full-time scores, 2015-16 to 2024-25 | manifest |
| forbes-billionaires.csv | Forbes Billionaires — individual net worth | manifest |
| forbes-global2000.csv | Forbes Global 2000 — firm size measures | manifest |
| fred_data.csv | US Treasury yields and NBER recessions — GS1/GS5/GS10, DFII5/DFII10 and USREC, monthly 1953-04 to 2024-12 | manifest |
| hansen_singleton_1982_data.csv | Hansen-Singleton (1982) replication — monthly US gross real market return and consumption growth, 1959-1978 | manifest |
| hansen_singleton_1983_data.csv | Hansen-Singleton (1983) replication — monthly US returns, consumption and inflation, 1959-1978 | manifest |
| japan_deaths_by_age.csv | Japan — deaths by single year of age, 2023 | manifest |
| japan_earthquakes.csv | Japan region — earthquakes of magnitude 5 and above, 2000-2024 | manifest |
| japan_population_by_age.csv | Japan — population by single year of age, 2024 | manifest |
| us_adult_heights.csv | United States — adult standing height by sex, NHANES 2015-2018 | manifest |
| usa-gini-nwealth-tincome-lincome.csv | US Gini coefficients — net wealth, total income and labour income, 1950-2016 | manifest |
| constructed · pipeline lost — 10 | ||
| acs_data_summary.csv | American Community Survey — earnings count, mean and dispersion by occupation cell | manifest |
| caron.npy | French Revolution — monthly specie value of the assignat, 1791-1796 | manifest |
| chapter_3.xlsx | The Ends of Four Big Inflations — appendix tables, transcribed | manifest |
| employ.csv | Eurostat employment in Europe — by age and sex, 2007–2016 | manifest |
| hansen_jagannathan_1991_data.json | Hansen-Jagannathan (1991) replication — US asset returns 1891-1986, with annual consumption (three-table bundle) | manifest |
| lingcod_msy_recovery.csv | Pacific Coast lingcod — biomass and fishing pressure relative to MSY | manifest |
| mpd2020.xlsx | Maddison Project Database 2020 — GDP per capita and population, 1 CE to 2018 | manifest |
| nom_balances.npy | French Revolution — monthly nominal assignat balances, 1789-1796 | manifest |
| realwage.csv | OECD real minimum wages — 32 countries, 2006–2016 | manifest |
| test_pwt.csv | Penn World Table teaching extract — eight countries, year 2000 | manifest |
8Draft rules for styleguide/datasets.md
Distilled from the live-API pedagogy analysis (§4) and the migration pilots; feeding QuantEcon.manual#108.
A lecture reads data from a stable snapshot URL (data-lectures). Live API calls are the exception and require a reason recorded in the lecture source.
A live call is justified when the fetch workflow is itself the lesson (the pandas lecture's wbgapi/yfinance sections) or when currency is the point. “The lecture needs series X” is not a reason — that's what snapshots are for.
A refresh builder in data-lectures producing the snapshot (the business_cycle_data.csv pattern, already prototyped). Breakage becomes a one-line URL switch, and the WASM build always uses the twin — pyodide cannot reach the live APIs at all.
Where live access stays, fredgraph.csv-style URLs beat pandas_datareader-style wrappers: one less dependency, and the git history shows the wrappers are what broke.
Source, series IDs, retrieval date, license and refresh cadence — the manifest schema in this repo is the template; the provenance classes in §7 say which fields are required.