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
Everything below was verified during the work by the same agent that did it. This issue exists so it can be checked by someone who was not there.
Bias to test for: almost every integrity claim in this session was produced by one method — an ad-hoc Python script in a throwaway venv (pandas 3.0.5) that fetched the new URL and compared it against lecture-python-intro's old committed copy — plus curl for status codes and headers. The session leaned on that pair because GitHub Actions was in a major outage for much of it, so for a long stretch no build could run at all. Confirm reader-facing outcomes without that pair: fetch the published artifacts, open the notebooks, execute the cells, read the rendered pages. A second bias worth naming: the pre-deletion safety sweep was run over the nine repos cloned in workspace-lectures, and was described in the PR as "org-wide". It was not — see section 6, which already found one live regression from exactly that gap.
Issues opened: QuantEcon/workspace-lectures#25, QuantEcon/QuantEcon.manual#149, and this one. Comments posted: QuantEcon/QuantEcon.manual#108, QuantEcon/meta#336, QuantEcon/meta#337, QuantEcon/meta#338, #37, QuantEcon/workspace-lectures#23, QuantEcon/workspace-lectures#14. Closed: QuantEcon/meta#337. Publish tag: publish-2026aug07 on lecture-python-intro, which needed three attempts — two failed on Anaconda defaults CDN errors before succeeding with no change to any file.
For the validator
Work in a session that did not do this work. Do not use the tool named under "Bias to test for" except where a check explicitly says to run it. Re-derive counts rather than confirming them. Where a check can be run against a surface the original session did not exercise, do that too — the margin beyond the checklist is where regressions hide. Deliver: one comment on this issue with a per-item verdict (confirmed / confirmed with caveat / refuted / not completable, with evidence), a new issue for any regression found (do not bury findings in the comment), and leave the checkboxes to the issue owner unless told otherwise.
1. Reader-facing outcomes — check these first, without the session's tooling
intro.quantecon.org/french_rev.html renders and every figure is present. The lecture plots assignat/dette/fig_3 series and two .npy-derived series — all should look like economics, not empty axes
Download intro.quantecon.org/_notebooks/french_rev.ipynb and run it end to end. Every data cell must succeed
Open the same notebook in Colab and run it. This is the failure this set exists to fix: caron.npy and nom_balances.npy were np.load('datasets/…') local-path reads that raised FileNotFoundError anywhere the working directory was not lectures/
Click the three Data Sources links at the top of the rendered lecture — each should reach a file in data-lectures, not a 404 and not lecture-python-intro
Compare a rendered figure against the pre-migration published version via the Wayback Machine. The bytes are claimed identical, so the figures must be pixel-identical
2. Artifact integrity — the claim is byte-identity
The claim: what data-lectures serves is byte-identical to what the lectures read before, for all five files.
For each of assignat.xlsx, dette.xlsx, fig_3.xlsx, caron.npy, nom_balances.npy: fetch from raw.githubusercontent.com/QuantEcon/data-lectures/main/lectures/<file> and compare sha256 against integrity.sha256 in its sidecar manifest
Triangulate against git history, which is the source the live fetch cannot fake: git -C lecture-python-intro show 6986e35a~1:lectures/datasets/<file> | shasum -a 256 (the commit before #826) must equal the same value
Confirm the recorded sizes: 209,555 / 632,030 / 9,466 / 1,136 / 1,424 bytes
Re-derive rather than trust: the session claimed all ten read_excel calls produce DataFrame.equals frames. Re-run them from the pre-deletion blobs vs the live URLs, with the lecture's exact arguments. All three workbooks are positional_reads: true — read by cell position with usecols/skiprows/nrows — so a shifted row would change a figure silently rather than raise
Confirm both .npy files load to arrays of shape (63, 2) and (81, 2), dtype float64
3. The highest-value claim to re-test — repoint rule 6
#50 records that media.githubusercontent.com is LFS-only and 404s on plain-git files. All of step 3 (the high_dim_data fold, 6 datasets, 14 reads) is being planned around this. It was measured once, on one file.
Reproduce from scratch: curl -I https://media.githubusercontent.com/media/QuantEcon/data-lectures/main/lectures/mpd2020.xlsx should be 404, and the raw.githubusercontent.com equivalent 200
Test the converse, which the session did not: pick a file that is LFS-tracked in high_dim_data and confirm the media host serves it while raw.githubusercontent.com returns pointer text rather than data
Confirm both hosts send access-control-allow-origin: *, i.e. that this is host routing and not CORS as first assumed
Re-derive the count of 14 affected reads independently, and check the file:line table in PLAN.md rule 6 against the current files. Two entries are _static/…/inequality/data.ipynb builder notebooks — confirm the audit genuinely does not classify those as data reads
Check the claim that this is invisible to CI: add a throwaway media-host reference to a data-lectures path in a scratch branch of a lecture repo and confirm no check anywhere fails
4. Records written
All five french_rev manifests parse, and each filename matches its sidecar's own name (load_manifests() keys on filename, so a typo makes a manifest silently invisible)
Each now lists exactly two consumers — lecture-python-intro and lecture-wasm, both lectures/french_rev.md — and those files really do read them
positional_reads: true is set on assignat, dette and fig_3 and not on the two .npy files
.github/scripts/check_consumed_files.py reports 18 manifests, 18 consumed files, 0 errors. Confirm the count rose from 13 because these five gained consumers, and that the check actually hashes bytes rather than trusting the manifest
5. Tracker consistency
migration.yml is 18 repointed, 0 landed — count record-level entries only; an unanchored grep matches a comment line and returns 19
Each of the five repoints entries names the PRs that did the work (#826 and #55) with date 2026-08-07
CATALOG.md is current: run python scripts/build_catalog.py then git diff --exit-code
python scripts/build_audit.py scan --repos-dir ../ --strict exits 0 with all repos at origin/main
Committed orphans are 26, down from 31 — exactly the five deletions. Re-derive; do not trust
lecture-python-intro/lectures/datasets/ holds exactly three files: fig_3.ods, GDP_per_capita_world_bank.csv, Metadata_Country_API_NY.GDP.PCAP.CD_DS2_en_csv_v2_4770417.csv
6. Known blind spots — one already produced a live regression
The session documented that the audit cannot see prose references, and added that it cannot see a wrong host either. A third was found while writing this issue and is already confirmed broken, so treat the listed blind spots as a floor, not a ceiling.
Verify the cause rather than the symptom: the pre-deletion sweep ran over the nine repos in workspace-lectures/manifest.yml, which excludes translation repos, and was described in #827 as "org-wide". Confirm that description is wrong
Re-run the sweep properly — over every non-archived QuantEcon repo, not the workspace clones — and report whether anything besideslecture-intro.zh-cn reads the five deleted paths. The session's own re-check covered only repos matching intro|wasm by name, which is itself a guess
Confirm the six french_rev prose references (french_rev.md:60-62 in both repos) were repointed, and that no build in either repo would have caught them if they had not been
Re-derive the claim that these were the last local-path data reads in lecture-python-intro
7. Decisions settled today — future work builds on these
pandas.read_* cannot take a timeout for a URL read, and storage_options={"timeout": 5} is silently ignored — pandas passes storage_options as HTTP headers (pandas.io.common._get_filepath_or_buffer builds urllib.request.Request(url, headers=storage_options)). Re-verify against pandas 3.0.5; QuantEcon.manual#149 rests on it
The publish-2026aug07 failures were upstream, not configuration: git diff publish-2026aug06b..main -- .github/workflows/publish.yml environment.yml is empty, and setup-miniconda v4.0.1 predates the last green publish. Confirm both
The high_dim_data "auto-delete head branches" story recorded in QuantEcon/workspace-lectures#14 is false: delete_branch_on_merge is false on that repo, and the four repoints merged before the deliberate branch deletion. Re-check via gh api
8. Deliberately not done
fig_3.ods was kept in lecture-python-intro while lecture-wasm's copy was deleted. Confirm the stated reason holds: wasm's was a redundant mirror, intro's is the last copy in the org because data-lectures dropped it as a format twin of fig_3.xlsx. Verify no copy exists in data-lectures and that nothing references it
Copilot's request for raise_for_status() and a timeout on #826 was declined rather than overlooked — see the reply thread and QuantEcon.manual#149
environment.yml and the conda channel configuration were not changed despite that being the likely way to make the failing publish go green. Confirm this was recorded as a deliberate scope decision
Where the reasoning lives
PLAN.md in this repo carries the six repoint rules and the phase machinery; AGENTS.md the manifest conventions. QuantEcon/workspace-lectures#23 is the ordered plan with per-step traps, QuantEcon/workspace-lectures#14 the standing cross-repo tracker including two corrections made today. The PR descriptions on #826, #55, #49, #50 and #827 carry the per-change evidence and the sequencing arguments.
Everything below was verified during the work by the same agent that did it. This issue exists so it can be checked by someone who was not there.
Bias to test for: almost every integrity claim in this session was produced by one method — an ad-hoc Python script in a throwaway venv (pandas 3.0.5) that fetched the new URL and compared it against
lecture-python-intro's old committed copy — pluscurlfor status codes and headers. The session leaned on that pair because GitHub Actions was in a major outage for much of it, so for a long stretch no build could run at all. Confirm reader-facing outcomes without that pair: fetch the published artifacts, open the notebooks, execute the cells, read the rendered pages. A second bias worth naming: the pre-deletion safety sweep was run over the nine repos cloned inworkspace-lectures, and was described in the PR as "org-wide". It was not — see section 6, which already found one live regression from exactly that gap.What landed
lecture-python-introlecture-wasmdata-lecturesIssues opened: QuantEcon/workspace-lectures#25, QuantEcon/QuantEcon.manual#149, and this one. Comments posted: QuantEcon/QuantEcon.manual#108, QuantEcon/meta#336, QuantEcon/meta#337, QuantEcon/meta#338, #37, QuantEcon/workspace-lectures#23, QuantEcon/workspace-lectures#14. Closed: QuantEcon/meta#337. Publish tag:
publish-2026aug07onlecture-python-intro, which needed three attempts — two failed on AnacondadefaultsCDN errors before succeeding with no change to any file.For the validator
1. Reader-facing outcomes — check these first, without the session's tooling
intro.quantecon.org/french_rev.htmlrenders and every figure is present. The lecture plots assignat/dette/fig_3 series and two.npy-derived series — all should look like economics, not empty axesintro.quantecon.org/_notebooks/french_rev.ipynband run it end to end. Every data cell must succeedcaron.npyandnom_balances.npywerenp.load('datasets/…')local-path reads that raisedFileNotFoundErroranywhere the working directory was notlectures/data-lectures, not a 404 and notlecture-python-introlecture-wasm'sfrench_revin a browser. It only checked the URL form and thatcurlsawaccess-control-allow-origin: *. Openquantecon.github.io/lecture-wasm/french-rev/, wait for Pyodide, and run the data cells. This is precisely the surface that produced Repoint rule for wasm: in-browser reads need raw.githubusercontent.com — the github.com/*/raw/ form fails CORS, breaking long_run_growth and inflation_history on the wasm site #46, and a passing static page proves nothing there — the wasm build bakes no outputs2. Artifact integrity — the claim is byte-identity
The claim: what
data-lecturesserves is byte-identical to what the lectures read before, for all five files.assignat.xlsx,dette.xlsx,fig_3.xlsx,caron.npy,nom_balances.npy: fetch fromraw.githubusercontent.com/QuantEcon/data-lectures/main/lectures/<file>and comparesha256againstintegrity.sha256in its sidecar manifestgit -C lecture-python-intro show 6986e35a~1:lectures/datasets/<file> | shasum -a 256(the commit before #826) must equal the same valueread_excelcalls produceDataFrame.equalsframes. Re-run them from the pre-deletion blobs vs the live URLs, with the lecture's exact arguments. All three workbooks arepositional_reads: true— read by cell position withusecols/skiprows/nrows— so a shifted row would change a figure silently rather than raise.npyfiles load to arrays of shape(63, 2)and(81, 2), dtypefloat643. The highest-value claim to re-test — repoint rule 6
#50records thatmedia.githubusercontent.comis LFS-only and 404s on plain-git files. All of step 3 (thehigh_dim_datafold, 6 datasets, 14 reads) is being planned around this. It was measured once, on one file.curl -I https://media.githubusercontent.com/media/QuantEcon/data-lectures/main/lectures/mpd2020.xlsxshould be 404, and theraw.githubusercontent.comequivalent 200high_dim_dataand confirm the media host serves it whileraw.githubusercontent.comreturns pointer text rather than dataaccess-control-allow-origin: *, i.e. that this is host routing and not CORS as first assumedPLAN.mdrule 6 against the current files. Two entries are_static/…/inequality/data.ipynbbuilder notebooks — confirm the audit genuinely does not classify those as data reads4. Records written
filenamematches its sidecar's own name (load_manifests()keys onfilename, so a typo makes a manifest silently invisible)consumers—lecture-python-introandlecture-wasm, bothlectures/french_rev.md— and those files really do read thempositional_reads: trueis set onassignat,detteandfig_3and not on the two.npyfiles.github/scripts/check_consumed_files.pyreports 18 manifests, 18 consumed files, 0 errors. Confirm the count rose from 13 because these five gained consumers, and that the check actually hashes bytes rather than trusting the manifest5. Tracker consistency
migration.ymlis 18repointed, 0landed— count record-level entries only; an unanchored grep matches a comment line and returns 19repointsentries names the PRs that did the work (#826 and #55) with date 2026-08-07CATALOG.mdis current: runpython scripts/build_catalog.pythengit diff --exit-codepython scripts/build_audit.py scan --repos-dir ../ --strictexits 0 with all repos atorigin/mainlecture-python-intro/lectures/datasets/holds exactly three files:fig_3.ods,GDP_per_capita_world_bank.csv,Metadata_Country_API_NY.GDP.PCAP.CD_DS2_en_csv_v2_4770417.csv6. Known blind spots — one already produced a live regression
The session documented that the audit cannot see prose references, and added that it cannot see a wrong host either. A third was found while writing this issue and is already confirmed broken, so treat the listed blind spots as a floor, not a ceiling.
lecture-intro.zh-cn'smainreads eight datasets by URL fromlecture-python-intro/lectures/datasets/, all now 404. Verify the eight, and verify the fix exists as the open sync PRs 🌐 [translation-sync] long_run_growth: read mpd2020.xlsx from data-lectures lecture-intro.zh-cn#285, #286 and #288workspace-lectures/manifest.yml, which excludes translation repos, and was described in #827 as "org-wide". Confirm that description is wronglecture-intro.zh-cnreads the five deleted paths. The session's own re-check covered only repos matchingintro|wasmby name, which is itself a guessfrench_rev.md:60-62in both repos) were repointed, and that no build in either repo would have caught them if they had not beenlecture-python-intro7. Decisions settled today — future work builds on these
pandas.read_*cannot take a timeout for a URL read, andstorage_options={"timeout": 5}is silently ignored — pandas passesstorage_optionsas HTTP headers (pandas.io.common._get_filepath_or_bufferbuildsurllib.request.Request(url, headers=storage_options)). Re-verify against pandas 3.0.5; QuantEcon.manual#149 rests on itpublish-2026aug07failures were upstream, not configuration:git diff publish-2026aug06b..main -- .github/workflows/publish.yml environment.ymlis empty, andsetup-minicondav4.0.1 predates the last green publish. Confirm bothhigh_dim_data"auto-delete head branches" story recorded in QuantEcon/workspace-lectures#14 is false:delete_branch_on_mergeisfalseon that repo, and the four repoints merged before the deliberate branch deletion. Re-check viagh api8. Deliberately not done
fig_3.odswas kept inlecture-python-introwhilelecture-wasm's copy was deleted. Confirm the stated reason holds: wasm's was a redundant mirror, intro's is the last copy in the org becausedata-lecturesdropped it as a format twin offig_3.xlsx. Verify no copy exists indata-lecturesand that nothing references itraise_for_status()and a timeout on #826 was declined rather than overlooked — see the reply thread and QuantEcon.manual#149environment.ymland the conda channel configuration were not changed despite that being the likely way to make the failing publish go green. Confirm this was recorded as a deliberate scope decisionWhere the reasoning lives
PLAN.mdin this repo carries the six repoint rules and the phase machinery;AGENTS.mdthe manifest conventions. QuantEcon/workspace-lectures#23 is the ordered plan with per-step traps, QuantEcon/workspace-lectures#14 the standing cross-repo tracker including two corrections made today. The PR descriptions on #826, #55, #49, #50 and #827 carry the per-change evidence and the sequencing arguments.