Skip to content

VALIDATION: independent review of the 2026-08-07 french_rev / write-back work #51

Description

@mmcky

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.

What landed

Repo PRs merged
lecture-python-intro #826 (repoint), #827 (phase-2 deletion)
lecture-wasm #55
data-lectures #49 (tracker flip), #50 (repoint rule 6)

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
  • Beyond what the session tested: the session never executed lecture-wasm's french_rev in a browser. It only checked the URL form and that curl saw access-control-allow-origin: *. Open quantecon.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 outputs

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 consumerslecture-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.

  • Confirm the regression in QuantEcon/workspace-lectures#25. lecture-intro.zh-cn's main reads eight datasets by URL from lecture-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 #288
  • 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 besides lecture-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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions