Skip to content

VALIDATION: independent review of the 2026-08-06 migration work #45

Description

@mmcky

Independent validation of the migration work landed on 2026-08-06. 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.

Bias to test for: most claims here were verified by running scripts/build_audit.py, which is also the tool the work was built around. A validation pass should confirm reader-facing outcomes independently of that tool wherever possible — fetch the URLs, open the notebooks, read the published pages.

What landed

Repo PRs merged
data-lectures #36, #38, #41, #43, #44
lecture-python-intro #823, #824 (#825 open)
lecture-wasm #52, #53
workspace-lectures #22

Issues opened: #35, #37, #39, #40, #42 here; workspace-lectures#23. Closed: #20. Rewritten: #8, workspace-lectures#14.
Publishes: publish-2026aug06 (set 1), publish-2026aug06b (set 2).

1. Reader-facing outcomes — check these first, without the audit tool

Two datasets moved. The claim is that no reader-visible output changed and nothing 404s.

  • intro.quantecon.org/long_run_growth.html and inflation_history.html render, figures intact
  • The same two pages on the wasm site
  • Download each lecture's notebook and run it — the data cells should fetch from data-lectures and succeed
  • Open each in Colab — this is the failure mode the whole migration exists to fix
  • Click the {download} link for chapter_3.xlsx in inflation_history — it should serve the spreadsheet, not 404
  • Follow the "hosted on GitHub" link in inflation_history — should reach data-lectures' CATALOG.md
  • Spot-check a figure against the pre-migration published version (e.g. via the Wayback Machine) — the bytes are identical, so the figures must be too

Known live-site history worth confirming is now clean: between set 1 merging and publish-2026aug06, the published long_run_growth notebook pointed at a deleted file and returned 404. That window is closed, but it is the single clearest thing to verify independently.

2. Data integrity — the claim is byte-identity

Every repoint asserted the served bytes are identical to what the lecture used before.

  • For each of mpd2020.xlsx, longprices.xls, chapter_3.xlsx: fetch from github.com/QuantEcon/data-lectures/raw/main/lectures/<file> and compare sha256 against integrity.sha256 in its sidecar manifest
  • Compare the same against the pre-deletion blob in lecture-python-intro's git history (git show <pre-merge-sha>:lectures/datasets/<file> | shasum -a 256)
  • Confirm the three manifests' sha256 values were not simply copied from the file they describe without an independent check

3. The mpd2020.xlsx provenance finding — the highest-value claim to re-test

Claim: the file is not a pristine Maddison release. All 21,682 data rows match upstream, but three header labels on the Regional data sheet were edited locally, and long_run_growth depends on them via header=(0,1,2).

  • Re-download from rug.nl/ggdc/historicaldevelopment/maddison/data/mpd2020.xlsx and diff cell-by-cell against lectures/mpd2020.xlsx
  • Confirm exactly three cells differ, and that they are header labels rather than data
  • Independently confirm the edits are ours: the Internet Archive digest for the upstream file (4OWZWHTE5HXBBF4XLCCQTGDXY4HXOGOK) should be unchanged across snapshots from 2021-01-10 to 2026-01-02, i.e. predating the 2023-03-23 commit that added our copy
  • Sanity-check the consequence: replacing the file with a clean upstream copy should visibly change long_run_growth's regional-data output

This one matters because it determines the dataset's class (constructed, not verbatim) and is recorded as the first entry in the upstream-delta register (#39).

4. Manifests — 8 written in #38

  • Every manifest parses, and filename matches the sidecar's own name (note load_manifests() keys on filename, so a typo makes a manifest silently invisible)
  • Provenance classifications are defensible: mpd2020.xlsx constructed; longprices.xls / assignat / dette / fig_3 verbatim; chapter_3.xlsx constructed (hand-transcribed from print); caron.npy / nom_balances.npy constructed with builder_status: unrecovered
  • The two .npy files claim no recoverable provenance. Re-test that: they should not be extractable from any column of the committed Sargent–Velde workbooks
  • The sheets: blocks match what the lectures actually read — read_as should reproduce the recorded shape
  • positional_reads: true is set on the three French Revolution workbooks, which are read with header=None plus usecols/skiprows/nrows

5. Tracker consistency

  • migration.yml reads 13 repointed / 5 landed; the 5 are exactly the french_rev files
  • Each repointed record names the PRs that actually did the repointing
  • CATALOG.md is current (python scripts/build_catalog.py then git diff --exit-code)
  • scripts/build_audit.py all --strict passes on main

6. The two blind spots — verify they are real, and that the counts are right

#42 — the audit cannot see prose references. Claim: 12 references ({download} directives, markdown file links, directory links) point at files the migration will delete, and none fails any build.

  • Confirm build_audit.py genuinely does not report them
  • Confirm the count. It was revised 10 → 12 mid-session after Copilot found a directory link the original sweep missed — the sweep shared the blind spot it was documenting, so 12 should not be taken on trust either
  • Confirm the six in french_rev.md:60-62 (both repos) are still outstanding — they are set 3's problem

Repoint rule 3 — the published site lags main. Claim: 7 of 9 manifest repos publish on a publish* tag, with gaps up to 29 days.

  • Verify the trigger for each repo from its workflow files
  • Verify that rendered HTML survives a deleted data file (figures baked at build time) while notebooks do not — this is why nothing reported the set 1 breakage

7. Decisions to sanity-check before they are built on

These were settled today and Track A's remaining work depends on them.

  • Both SCF minis fit plain git — 31.3 MiB and 72.4 MiB against GitHub's 100 MiB limit. If wrong, the whole sources/-plus-plain-git storage design changes
  • SCF_plus.dta is 99.1 MiB — within 0.9 MB of the hard block, and has no lecture consumer
  • generating_mini.md reads its input from high_dim_data over the network — confirm, because archiving that repo without repointing it re-introduces a legacy-repo dependency silently
  • pandas 3 reports text dtype as str — not string, not object. Affects every future manifest
  • data.quantecon.org is an AWS load balancer with no healthy targets — 503 on every hostname, not a live service

8. Things deliberately not done

Confirm each was a decision rather than an oversight.

Where the reasoning lives

PLAN.md (tracks, repoint rules, phases) · AGENTS.md (working rules) · #8 (scaffolding checklist) · workspace-lectures#14 (workspace tracker) · workspace-lectures#23 (next work plan). PR descriptions carry the per-change reasoning and are the best record of why each decision was made.

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