PLAN: correct the stale figures, widen rule 1 to the org, restate rule 6 - #53
Merged
Conversation
Seven figures in PLAN.md restated the audit dashboard's stats and had all drifted by three repoint sets, each understating progress: 10 of 41 migrated is 18, 31 to go is 23, and 35 committed orphans is 26. Every one was contradicted by the audit.json the document itself cites, so the numbers now carry a note to re-read them from the generated file rather than from here. Rule 1's consumer set was scoped to lecture-wasm, and in practice has been read as "the repos in manifest.yml". That is wrong for deletion safety: a repo that fetches another repo's committed blobs by URL is a consumer however its content is produced. Three classes sit outside the eight scanned repos and each has been missed once already -- translations (five of six live editions read another repo's blobs; lecture-intro.zh-cn alone holds 7 reads of the high_dim_data six), generated mirrors, and course forks/canaries. Records the sweep method too: clone and grep, because code search cannot find a bare URL, though it does index repo-name tokens. Rule 6 counted 14 reads across two repos. It is 21 across three, and only 12 need the host changed -- the github.com/*/raw/ form is a smart redirect that routes per path by LFS status, so reads already on it survive an org/repo swap. The media endpoint routes per path rather than per repo, measured against high_dim_data's own untracked files. Its acceptance grep could never pass, as written it matched PLAN.md's own occurrences of the string; now scoped to the consuming lecture trees. Also records that the strict audit exits 0 on a fold left entirely on the media host -- lfs_media is computed and never asserted. Other corrections: LFS-on-raw returns HTTP 200 with pointer text and pd.read_csv raises nothing at all, so a status check is a false green; two workflows check this repo out with lfs: true, not just the Pages job, and the quota is org-wide; SCF_plus.dta is 0.88% under the hard blob limit and must stay LFS-tracked; generating_mini.md's two to_csv writes are commented out upstream; and P3 is reframed off "the LFS case", which the plain-git storage decision made unrunnable, onto the host migration it actually tests. Found by an independent review of QuantEcon/workspace-lectures#23.
There was a problem hiding this comment.
Pull request overview
Updates the repository’s planning and agent guidance documentation to align with current audit-derived counts and to clarify migration/repoint rules (notably org-wide consumer discovery and the media.githubusercontent.com host-migration implications for the high_dim_data fold), plus a small wording clarification in the pending P3 wave description.
Changes:
- Refreshes stale progress figures in
PLAN.mdand adds guidance to prefer citingaudit.jsonover copied numbers. - Clarifies repoint rules: expands rule-1 “consumer set” to the whole org and refines rule-6 to distinguish host changes needed for media-host reads.
- Rewords the P3
pendingwavescopeinmigration.ymlto reflect the host-migration framing; updatesAGENTS.mdto note both workflows currently checkout withlfs: true.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| PLAN.md | Updates audit-derived counts and refines repoint/migration rules (org-wide consumer sweep; media-host vs smart-redirect distinction; acceptance grep scoping). |
| migration.yml | Rephrases the pending P3 wave scope to emphasize host-migration requirements for LFS→plain-git fold cases. |
| AGENTS.md | Clarifies that two workflows currently use lfs: true and documents the intended lfs toggling policy. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Widening rule 6 from two consuming repos to three raised the read total from 14 to 21 but carried the old media-host count forward unchanged. Counted per repo: intro 5 media + 2 redirect, wasm 7 + 0, zh-cn 5 + 2 -- so 17 reads need a host change and 4 survive an org/repo swap, not 12 and 2. Adds the per-repo table, since the 12 is a real number for the intro+wasm subset and has now been mistaken for the total once.
This was referenced Aug 7, 2026
mmcky
added a commit
that referenced
this pull request
Aug 11, 2026
All 28 consuming reads are on main across the four repos, so the P3 wave is complete and the tracker should say so. This is the last push of the fold and the same-day close of the window PLAN describes as red by design. Verified locally against the real repos before pushing, both directions: migration.yml at `landed` -> exit 1, 6 warnings migration.yml at `repointed` -> exit 0, 0 warnings The six warnings are "marked landed but some consumer already reads data-lectures" -- the pre-existing assertion at build_audit.py:444. A non-zero strict audit also skips the Pages deploy, and Pages serves lectures/ as well as the dashboard, so the served data tree would have gone stale alongside. That window opened when the last C2 PR merged and closes here. consumed-file-check: 24 manifests, 25 files hash-checked, 0 errors. Records all FOUR repoint PRs, not the usual two: lecture-python-intro #832 lecture-wasm #60 lecture-intro.zh-cn #292 test-actions-lecture-intro #53 and populates each manifest's `consumers` with all four as well. This departs from the 18 existing records, which name only the two repos the audit scans. The departure is deliberate: zh-cn and the canary are real consumers that no CI can see, so this file is the only place they are written down at all, and the habit of recording only the scanned repos is what produced the undercount three times (ws#28, rule 6's enumeration table, and the "in 2020" prose count). Safe to record: build_audit derives its own consumer list from the scan (:403) and asserts on that, never on the manifest's; check_consumed_files uses `consumers` only to require existence and a hash, both already true. Confirmed by the green runs above. The other 18 manifests undercount the same way and want a separate backfill. Part of QuantEcon/workspace-lectures#23. Data: #62 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Sep 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Documentation-only. No data, no manifests, no
migration.ymlstatus changes — the strict audit exits 0 before and after, andaudit.jsonregenerates byte-identically.These are the corrections an independent review of QuantEcon/workspace-lectures#23 turned up, landed ahead of the
high_dim_datafold so the fold is planned against accurate rules.Seven stale figures
Every number in PLAN.md that restated the audit dashboard's stats had drifted by three repoint sets — set 1 (
mpd2020), set 2 (longprices+chapter_3) and set 3 (the fivefrench_revfiles) — and each understated progress. All seven were contradicted by theaudit.jsonthe document itself cites.continuous_time_mcs1lectures/".ymlfiles, 18 manifests; onlybusiness_cycle_data.csvlacks oneThe headline now says where the numbers come from and warns that any figure restating them is a copy that can drift.
Rule 1 — the consumer set is the org
Rule 1 was scoped to
lecture-wasm, and in practice has been read as the repos inmanifest.yml. That is correct for authoring and wrong for deletion safety: a repo that fetches another repo's committed blobs by URL is a rule-1 consumer regardless of how its content is produced.Three classes sit outside this repo's eight scanned repos, and each has already been missed once — translations (five of the six live editions read another repo's blobs, and
lecture-intro.zh-cnalone holds 7 reads of thehigh_dim_datasix), generated mirrors (lecture-python-intro.notebooks), and course forks and canaries (tom-econ370-2025,test-actions-lecture-intro— both of which are serving 404s today).The sweep method is now recorded with it: clone and grep, because code search cannot find a bare URL and returns a confident zero — though it does index repo-name tokens, so
gh search code 'high_dim_data org:QuantEcon'finds every consumer of that repo including the translations.Rule 6 — 21 reads across three repos, 12 needing a host change
Three corrections, all of which change what the fold PR has to do.
The count. 14 reads across two repos is 21 across three.
lecture-intro.zh-cnholds seven more —heavy_tails.md:810,837,838,862,mle.md:105,inequality.md:256,_static/lecture_specific/inequality/data.ipynb:37— and is invisible to every audit run, sinceSCAN_REPOSexcludes translations by decision atscripts/build_audit.py:45-46.Only 12 need the host changed.
github.com/<org>/<repo>/raw/…is a smart redirect that routes per path by LFS status, so the two reads already on that form survive an org/repo/path swap with no host decision. The rule previously said "move all 14 off the media host", which is impossible for two of them.The acceptance grep could never pass. As written it was
grep -rn '…' repos/, which matches PLAN.md's own occurrences of the string. Now scoped to the consuming lecture trees, with a note thatlecture-intro.zh-cnis never underrepos/and has to be cloned for it.Also recorded: the media endpoint routes per path, not per repo — measured against
high_dim_data's own untrackedREADME.mdandcross_section/webscrape_forbes.ipynb, both 404 on media inside an LFS-enabled repo — and the strict audit exits 0 on a fold left entirely on the media host. A media-host URL under a data-lectures path classifies aspattern: data-lectures, so it passes while 404ing at read time.scripts/build_audit.py:196already computeslfs_mediaper reference and nothing asserts on it; closing that is the first gate on the fold, tracked separately.Other corrections
LFS-on-
rawis silent, not loud. The sequencing constraint said consumers "fail with a confusing parse error". They do not: the URL returns HTTP 200 with pointer text, andpd.read_csvraises nothing at all — it returns a 2×1 frame whose single column name isversion https://git-lfs.github.com/spec/v1. Every affected lecture read is aread_csv, so silence is the case that matters, and a status-code check is a false green. Verify withcurl -s <url> | head -1.Two workflows check this repo out with
lfs: true, not one.audit-dashboard.yml:43(the Pages deploy) andconsumed-file-check.yml:22(every pull request). AGENTS.md assertedlfs: falsefor the Pages job while the workflow saystrue, and never mentioned the second. Both must flip beforesources/SCF_plus.dtalands — LFS bandwidth is an org-wide quota shared withhigh_dim_data, and a 403 on LFS downloads takes out the live media-host reads in intro, wasm and zh-cn simultaneously. That is a lecture outage, not a CI failure.SCF_plus.dtais 0.88% under the hard blob limit — 103,934,093 B against 104,857,600 B. It must stay LFS-tracked permanently; an upstream vintage 1% larger could not be pushed as plain git at all.generating_mini.md's twoto_csvwrites are commented out upstream, so the builder as committed produces both frames in memory and writes nothing. Its fetch and transform stages are complete, so this is a small fix at migration time rather than an unrecovered builder.P3 is reframed. Its stated tests — "served URL makes the raw-vs-media trap invisible" and "Pages handles LFS objects (
lfs: true)" — became unrunnable by construction when the Phase 3 storage decision made the published tree 100% plain git. P3 tests the host migration offmedia.githubusercontent.com, across three consuming repos including one the audit cannot see. It also deletes nothing: neither intro nor wasm holds a copy of the six files, and archivinghigh_dim_datapreserves serving on both hosts, so rule 3's phase 2 does not apply and the set is fully reversible.Part of QuantEcon/workspace-lectures#23. Upstream: QuantEcon/meta#336.
🤖 Generated with Claude Code