Repository navigation
Licensing: record-and-track policy, and the per-dataset inventory for migration #35
Description
Inventory of datasets migrating into this repo whose redistribution status needs a decision, and the record of the policy that governs them. Opened 2026-08-06 so the migration can proceed without stalling per-dataset on licence questions, while nothing goes unrecorded.
This is the per-dataset working inventory for this repo; QuantEcon/workspace-lectures#20 remains the org-level thread where an item's fate (confirm / replace / remove) is decided.
The policy
Licensing does not gate migration. These datasets are already served publicly from the lecture repos — in several cases for years. Moving the same bytes to a canonical host with better provenance, attribution and an explicit licence field is a strict improvement on the status quo, and holding the migration for licence review would trade a real, present reproducibility problem for a hypothetical one.
So the rule is record and track, not block:
- Migrate what we already serve. The manifest records the licence as found, including
redistribution: restrictedandname: nullwhere that is the honest answer. - Inherit the existing status. A file the lectures have served for years arrives with that fact recorded, not with a fresh legal review as a precondition.
- Track anything needing further thought here, with alternatives, and resolve it before
data.quantecon.orgis promoted as a public open-data endpoint — that promotion, not the migration, is the real gate.
This generalises the exception AGENTS.md already carries for countries.csv into the default for inherited data. It does not extend to new datasets: a dataset arriving here for the first time, with no prior life in a lecture repo, should still have its licence established before it lands — as the P5 additions all did.
Already recorded — the ten migrated datasets
Eight are cleanly permitted and need nothing further. Two are listed below as open items.
| Dataset | Licence as recorded | Status |
|---|---|---|
employ.csv |
Eurostat reuse (Commission Decision 2011/833/EU) | permitted |
epl_match_goals.csv |
Public domain | permitted |
japan_deaths_by_age.csv |
CC BY 3.0 IGO | permitted |
japan_earthquakes.csv |
US Government work — public domain | permitted |
japan_population_by_age.csv |
Japan Statistics Bureau terms of use | permitted |
lingcod_msy_recovery.csv |
CC BY 4.0 (established against the Zenodo DOI record) | permitted |
realwage.csv |
CC BY 4.0 | permitted |
us_adult_heights.csv |
US Government work — public domain | permitted |
Open items
1. countries.csv — restricted, migrated, in use
WorldData.info, "all rights reserved", no redistribution grant stated. Already redistribution: restricted in its manifest and already tracked at QuantEcon/workspace-lectures#20. Consumed by pandas_panel in both lecture-python-programming and lecture-python.myst, where it supplies a country-to-continent lookup — 2 of its 17 columns.
Alternatives: an openly-licensed country-to-continent mapping would replace the only part the lectures use, at the cost of re-validating figures. This is the strongest candidate for replacement rather than permission-seeking, because the substitute is trivial and abundant.
2. ames_house_prices.csv — no formal licence, reasoned as permitted
Recorded name: null, redistribution: permitted, verified: 2026-08-03, with the reasoning in the manifest: the source article states no formal licence but presents the data as a teaching set published for reuse, distributed from the journal's own server. Long-established redistribution in practice.
No action expected — listed so that "the licence field is empty" is not repeatedly re-discovered as a gap. It is a documented decision, not an omission. (The 2026-08-04 migration plan lists this as an open manifest gap; that entry is stale.)
To assess as they migrate
None of these blocks its wave. Each gets redistribution recorded at migration time; the ones that come back anything other than a clear yes get a row in the Open items table above.
| Dataset(s) | Source | Expectation |
|---|---|---|
forbes-global2000.csv, forbes-billionaires.csv |
Forbes, scraped via the Forbes API (webscrape_forbes.ipynb) |
most likely to be restricted — commercial publisher, scraped. Treat as the countries.csv case if so |
cities_us.csv, cities_brazil.csv |
worldpopulationreview.com | unestablished; same publisher class as WorldData.info, so expect to need a decision |
SCF_plus_mini.csv, SCF_plus_mini_no_weights.csv, SCF_plus.dta |
Kuhn–Schularick–Steins replication data | published replication data — normally permitted, verify against the deposit record rather than a homepage |
maketable1/2/4.dta |
AJR 2001 replication | published replication data |
fp.dta |
Treisman 2016 | published replication data |
dataBHS.mat |
BHS MATLAB replication bundle | published replication data |
bbh_macro_quarterly.csv, bbh_michigan_monthly.csv |
Zenodo replication package | already known CC BY 4.0 |
acs_data_summary.csv |
American Community Survey | US Government work — expect public domain |
mpd2020.xlsx |
Maddison Project 2020 | expect CC BY 4.0 — confirm against the release page |
life-expectancy-vs-gdp-per-capita.csv |
Our World in Data | expect CC BY |
test_pwt.csv |
Penn World Table 7.0 extract | expect permitted |
NEWQDATA.csv |
Cogley–Sargent 2005 | published dataset |
fred_data.csv |
FRED (GS1/GS5/GS10/DFII5/DFII10/USREC) | check the underlying series — AGENTS.md warns that FRED re-serves third-party series that may not be redistributable. These six look like Treasury/NBER series, which are fine, but confirm |
hansen_singleton_1982/1983_data.csv, hansen_jagannathan_1991_data.json |
constructed from documented sources | inherits its sources' terms |
longprices.xls, chapter_3.xlsx, assignat.xlsx, dette.xlsx, fig_3.xlsx, caron.npy, nom_balances.npy |
author-assembled — QuantEcon's own transcriptions from cited publications | record as such; the transcription is QuantEcon's own work |
The real gate
Resolve every Open item before data.quantecon.org is announced as a public open-data host. That is a decision point in PLAN.md Phase 4 and #15, not a per-migration checkpoint.
Related: QuantEcon/workspace-lectures#20 (org-level licensing thread), #15 (URL cutover — the promotion gate), QuantEcon/meta#338 (pilot), QuantEcon/QuantEcon.manual#108 (convention). Part of #8.
Activity
mmcky commentedon Aug 7, 2026
The six high_dim_data files are the next wave to arrive (P3 in
migration.yml), so I went through their upstream provenance. The licence expectations in the assessment table all hold. Two things do not, and both need deciding before the fold PR is written rather than at migration time.1. SCF+ has no existing status to inherit
Policy rule 2 says a file arrives with its recorded status, not a fresh review. For SCF+ there is nothing recorded to carry over.
SCF_plus/README.md(4,974 B) is a variable dictionary — a header, four lines on units and imputation implicates, then a 60-row variable/label table. It contains zero URLs, zero dates, no licence, no DOI, and the word "source" does not appear anywhere in it. The provenance table lives only incross_section/README.md(2,173 B), which covers the four cross-section files and says nothing about SCF+.So the SCF row needs a positive decision, and there are two honest ones. Either establish it against the Kuhn–Schularick–Steins (JPE 2020) deposit record — which is what the table already asks for, and which needs someone to match the deposit to these bytes — or, if that match cannot be made, land
retrieved: null,license.name: nullandintegrity.upstream.status: unverifiablerather than inventing a value. Specifically: do not use the high_dim_data commit date asretrieved. That dates our copy, not the retrieval.Two related mechanics. The minis are derived, not retrieved:
SCF_plus/generating_mini.mdreadsSCF_plus.dta, keeps 7 of its columns and renames them; bothto_csvcalls are commented out upstream, so the committed builder writes nothing while the fetch and transform are complete. AndSCF_plus.dtaappears in the table above but not in P3's dataset list — no lecture reads the.dtadirectly, onlygenerating_mini.mddoes. Whichever way that goes, the deposit-record question still has to be answered, because both minis inherit their record from it.2.
webscrape_forbes.ipynbis a separate row from the Forbes dataThe table treats the two CSVs and their builder as one item. They are two different questions, and they need not resolve the same way. Caching data we already serve is the policy's case. Republishing the scraper from a canonical, publicly-served dataset repo is not.
The global2000 cell requests
https://www.forbes.com/forbesapi/org/global2000/2020/position/true.json?limit=2000— an undocumented internal endpoint, still live — with a spoofed Chrome 87 user-agent, a matchingreferer, and hardcoded GDPR consent cookies (notice_behavior: "expressed,eu",notice_gdpr_prefs). The billionaires cell hits a second undocumented endpoint,http://www.forbes.com/ajax/list/data. That is a terms-of-service question about the method, independent of whateverredistributionthe CSVs get. The data can land restricted-and-tracked while the notebook either does not come across at all, or comes across with the consent-cookie and user-agent spoof stripped and a note that it no longer runs as-is.The six, with evidence
forbes-global2000.csv,forbes-billionaires.csvforbes.com/lists/global2000/,forbes.com/billionaires/— recorded incross_section/README.md, no grant of any kindcountries.csvcasecities_us.csv,cities_brazil.csvworldpopulationreview.com/us-cities,/countries/cities/brazilcountries.csv, the substitute is abundant — both are plain population-by-city tablesSCF_plus_mini.csv,SCF_plus_mini_no_weights.csvSCF_plus.dtaTwo files the inventory does not cover
Both are still to migrate and appear in neither the Open items nor the assessment table.
usa-gini-nwealth-tincome-lincome.csvis a second-order derivative —_static/lecture_specific/inequality/data.ipynb:100writes it fromSCF_plus_mini— so it inherits whatever record SCF+ gets and cannot be assessed ahead of it.graph.txtis QuantEcon's own generated output (short_path.md:272writes it with%%file, 100 nodes), so it belongs in the author-assembled row withlongprices.xlsandchapter_3.xlsx.None of this blocks the wave, consistent with the policy. The SCF+ record is the one item that has to be chosen rather than copied, and it has to be chosen while the manifest is being written.
Fold in the six high_dim_data datasets (PR B1) (#62)
mmcky commentedon Aug 10, 2026
P3 migrated — five of the "to assess" rows are now settled, and four came back
restrictedThe six
high_dim_datadatasets landed in #62 andSCF_plus.dtain #63, so the top three rows of the "To assess as they migrate" table have answers. Two of the three expectations recorded there held; the third was right about the licence and wrong about how it would be established.forbes-global2000.csv,forbes-billionaires.csvredistribution: restricted,license.name: nullcities_us.csv,cities_brazil.csvredistribution: restricted,license.name: nullSCF_plus_mini.csv,SCF_plus_mini_no_weights.csv,SCF_plus.dtaredistribution: permitted,license.name: nullAll five are inherited exposures — served publicly from
lecture-python-introandlecture-wasmfor years — so under the record-and-track policy they migrated with the licence recorded as found. None blocked its wave.3. Forbes ×2 — restricted, migrated, about to be in use
Commercial publisher, editorially assembled ranking, obtained through an undocumented internal API. No redistribution grant of any kind is stated, and attribution alone does not cure that. Both manifests carry
redistribution: restrictedwith a note pointing here.Unlike
countries.csv, there is no trivial substitute:heavy_tailsuses these to illustrate that firm size and wealth are heavy-tailed, and the pedagogical point depends on the data being a recognisable real-world rich list. An openly-licensed replacement would change what the lecture demonstrates, not just its numbers. So permission-seeking is the more likely route here, and it is worth starting earlier than the others.4. World Population Review ×2 — restricted, migrated, about to be in use
Same publisher class as
countries.csvand the same absence of a redistribution grant.heavy_tailsuses one column of each —pop2023— to plot a city-size CCDF.This is the strongest replacement candidate of the four: the lectures use a single population column, and openly-licensed city-population tables are abundant. Worth pairing with the
countries.csvdecision, since resolving that publisher class once covers three of the five open rows.5. SCF+ — permitted, but the deposit could not be located at all
The expectation in the table above was to "verify against the deposit record rather than a homepage". That turned out not to be possible. Searched to exhaustion on 2026-08-10:
10.1086/708815license: null, and no data relation registeredSo
license.name,license.urlandretrievedare honest nulls with a note in all three records, andintegrity.upstream.statusisunverifiablerather than a softunverified.redistribution: permittedreflects that this is replication data for a published article that QuantEcon has served publicly for years — recorded as a reasoned position, likeames_house_prices.csvabove, not as a verified licence.Worth stating plainly so it is not re-derived: nothing that migrated supplies SCF+ provenance. The
SCF_plus/README.mdinherited upstream is a variable dictionary — zero URLs, zero dates, no licence, no DOI, not even the word "source". Its content went intoSCF_plus_mini.csv.yml'sschema.columns[].descriptionrather than landing as a second unstructured record. The audit trail issources/README.md.6.
webscrape_forbes.ipynb— a republication question separate from the data licenceThis is not the same question as rows 3 above, and it should not be resolved by answering those. The builder now committed at
builders/webscrape_forbes.ipynb(builder_status: committed-frozen):user-agentstring;notice_behavior,notice_gdpr_prefs) to defeat a consent gate;forbesapi/org/global2000/…, not a published API;http://.The data licence question is may we cache and serve these bytes with attribution. This one is should QuantEcon publish, under its own name, a working recipe for circumventing a commercial publisher's access controls — which stands whatever the answer on the data is, and would stand even if Forbes granted redistribution tomorrow.
It is committed deliberately: a
constructeddataset without its builder is a bug, andcommitted-frozenrecords that it will not be re-run. The options if that reads as too much are to redact the headers and cookies with a note (which costs the artifact its value as a record of what actually ran), or to remove it and mark both manifestsunrecovered(which reintroduces the gap the status exists to make visible). Recording rather than deciding, since it is a judgement call about what the org publishes rather than a data question.Suggested edit to the table above when someone next touches the body: the three settled rows move into Open items as 3, 4 and 5, leaving
maketable1/2/4.dtathroughmpd2020.xlsxto assess.Record D11: invest in qeld, defer data.quantecon.org indefinitely (#76)
Land wave B2' — the hansen_singleton pair and their builders (Track B) (
mmcky commentedon Aug 17, 2026
Correction: the two BBH files are not simply CC BY 4.0
The inventory in this issue's body records:
That is right about the deposit and wrong about one of the two files. Established while writing their manifests for #92.
bbh_macro_quarterly.csv— the row stands. All fourteen series are US federal statistics (BEA, BLS, CBO, Federal Reserve Board) delivered through FRED, plusPIRIC, a series contributed to FRED by Riccardo DiCecio and tagged "public domain: citation requested". None of the fourteen FRED series pages carries a copyright or no-redistribution block — checked against a positive control, FRED'sSP500page, which does carry S&P Dow Jones Indices' "Reproduction … is prohibited" notice, so the zero is a real zero rather than a broken check.redistribution: permitted, attribution carried by the manifest's citation.bbh_michigan_monthly.csvlandsredistribution: restricted. Four of its five columns are University of Michigan Surveys of Consumers aggregates. Michigan's usage agreement (https://data.sca.isr.umich.edu/agreement.php, read 2026-08-17) states that the data "may be displayed, reformatted, and printed for your organization's use" and then: "You agree not to reproduce, retransmit, distribute, sell, publish, or broadcast the data and materials from the Surveys of Consumers website without the express written consent of the University of Michigan."The CC BY 4.0 grant is the depositors', and Bhandari, Borovička and Ho are not the rights holder for that material. Whether they obtained Michigan's written consent is not stated anywhere in the deposit and could not be established. So the deposit's licence does not settle the question for those four columns — it only tells us what the depositors granted over what was theirs to grant. The fifth column,
UNRATE, is a BLS series and clean.Decision taken 2026-08-17: migrate as
restrictedand register here, on the same reasoning ascountries.csv(workspace-lectures#20). This is an inherited exposure, not a new one — the bytes have been served publicly fromlecture-python-advanced.mystsince 2026-06-12 — and per AGENTS.md an already-served file may be cached when marked restricted and logged for review. Pausing the migration would not have reduced the existing exposure.Two facts that bear on how much is actually at stake, recorded so a future review does not have to re-derive them. What is published is four aggregate columns for the all-households cell only — not the demographic breakdowns the deposit ships, and not the microdata. And these are the same published aggregates Michigan puts on its own tables pages. Michigan's terms bind someone who obtains the data from its website; QuantEcon obtained these bytes from a CC BY 4.0 Zenodo deposit.
Suggested edit to the body table, so the inventory stops asserting the opposite of the manifest:
bbh_macro_quarterly.csvbbh_michigan_monthly.csvI have not edited the body — this is the register's own record to keep, and the row above is the correction it needs.
Land wave C1 — the three advanced.myst datasets that needed no rename…
mmcky commentedon Sep 29, 2026
2026-09-29: QuantEcon/workspace-lectures#20, a private workspace issue, is folded in here and closed in favour of this one. It tracked a single file,
countries.csv, already Open item 1 above. That issue was where each item's fate (confirm, replace or remove) was to be decided, and that role moves here too, so this issue is now the one licence register. It stays open as a standing record, as the P4 work plan (#118) already classes it. It does not gate the datasets migration: licensing does not gate migration (settled 2026-08-06), and the only gate, promoting a branded public open-data host, is unscheduled because D11 (2026-08-12) deferreddata.quantecon.orgindefinitely (#37).Correction to Open item 1:
countries.csvhas six readers, not two. Measured 2026-09-29,lectures/pandas_panel.mdreads this repo's copy in lecture-python-programming, lecture-python.myst and lecture-python.zh-cn, and in the programming translations lecture-python-programming.zh-cn, lecture-python-programming.fr and lecture-python-programming.fa. The manifest'sconsumerslists the first three.To do when the body is refreshed. The body stops at the first ten datasets and never absorbed its own comments. The manifests and CATALOG.md remain the register of record; as of 2026-09-29 the body lacks the following.
main(Add us_household_net_worth_2022.csv: SCF 2022 household net worth with survey weights #144 would add a 45th,permitted). Every one recordslicense.redistributionwith averifieddate: 38permitted, 6restricted. Drop "To assess as they migrate".restrictedfiles among the Open items, with their readers:countries.csv(above),cities_us.csv,cities_brazil.csv,forbes-global2000.csv,forbes-billionaires.csvandbbh_michigan_monthly.csv. This absorbs the 2026-08-10 comment's items 3 and 4 and the 2026-08-17 correction thatbbh_michigan_monthly.csvisrestricted, not CC BY 4.0. That comment's item 5 (SCF+,permittedwith no deposit record found) moves into the body too, and its item 6, whether to keep publishingbuilders/webscrape_forbes.ipynb, stays an open owner decision.NEWQDATA.csv,caron.npy,dataBHS.csv,fp.dta,hansen_jagannathan_1991_data.json,hansen_singleton_1982_data.csv,hansen_singleton_1983_data.csv,life-expectancy-vs-gdp-per-capita.csv,longprices.xls,maketable1.dta,maketable2.dta,maketable4.dta,nom_balances.npyandusa-gini-nwealth-tincome-lincome.csv.sources/README.mdmakes the same claim for two builder inputs,NEWQDATA.MATanddataBHS.mat.business_cyclesnapshots whose manifests landed on 2026-09-01:gdp_growth_annual.csv(in P4 groundwork: manifest, four-stage builder and provenance/ for business_cycle #109, asbusiness_cycle_data.csv, renamed in Record the four schema and naming decisions: rename, pattern capture groups, null placement, dtype sweep #124), andprivate_credit_to_gdp.csv,unemployment_rate_annual.csvandus_business_cycle_monthly.csv(in P4: the business_cycle snapshot set — three World Bank tables and a FRED composite #114).dataBHS.csv(the.matis a builder input insources/),SCF_plus.dtais an unpublished builder input, andgraph.txtwas retired in place, never migrated. Of the seven "author-assembled" files onlychapter_3.xlsxis QuantEcon's own transcription:longprices.xls,assignat.xlsx,dette.xlsxandfig_3.xlsxare verbatim, andcaron.npyandnom_balances.npyhave no recorded source, so no licence can be established for them yet.bbh_michigan_monthly.csvisrestrictedon Michigan's usage agreement, whileus_business_cycle_monthly.csvrecords its UMCSENT column, which FRED classes "Copyrighted: Citation Required", aspermitted, reading Michigan's terms as permitting use with citation. That file has no consumers yet, so this is cheapest to settle before Include business_cycle: what it reads, what data-lectures now serves, and the sequence lecture-wasm#70 adopts it. Second, clause (p) of FRED's Terms of Use, on storing, caching or archiving FRED content, has not been weighed for the FRED-built files.mmcky commentedon Sep 30, 2026
2026-09-30: @mmcky has decided the two questions registered on 2026-09-29, and #152 records them.
us_business_cycle_monthly.csvispermitted, on Michigan's FAQ. Michigan publishes two texts. The data portal's usage agreement forbids redistribution without written consent. Its FAQ says "Any data, tables, or charts available to the public on our main website can be used without permission" and asks for a citation. The headline index is main-website data: tables.html serves it as tbmics.csv, and every committed value matches that table. So it sits on the permitted side. The four Michigan columns ofbbh_michigan_monthly.csvcome from portal-only tables and stayrestricted. Both manifests now record that line.The check also turned up two errors, both corrected in #152. FRED labels USREC and M0892AUSM156SNBR "Copyrighted: Citation Required" too; the composite and
fred_data.csvsaid otherwise. And M0892AUSM156SNBR is seasonally adjusted, not NSA. This settles the item "Register two questions for an owner decision" in the comment of 2026-09-29.licence: rest UMCSENT on Michigan's FAQ and record FRED's caching cla…