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
Tracking issue for the July 2026 full-repository maintenance audit. Milestone: Maintenance audit 2026-07.
Complete (2026-09-24). All seven sub-issues are closed; v0.12.0 delivered the last five, and v0 moved to it after the staged canary run (decision 4). Two follow-ups in other repos are listed in the closing comment and in docs/dev/PLAN.md (#187).
A multi-agent sweep of every tracked file across 14 dimensions, then two adversarial verification passes: 135 raw findings, 63 rejected, 72 confirmed, 11 added by four completeness sweeps, 83 actioned. Nothing found is architectural.
The work, ordered by dependency
ci: repair the container publish and validation pipeline #103 — repair the container publish and validation pipeline (infrastructurehigh-priority) — done in v0.9.0 (ci: repair the container publish and validation pipeline #111): uppercase ghcr.io/QuantEcon/… from github.repository_owner made buildx registry cache refs fail non-fatally, leaving builds cold and green (CHANGELOG.md:233-237); an unserialised workflow let an older commit win :latest (:238-240); a concurrency group shared across runs cancelled most of the lecture-validation matrix (:241-247); both unattended workflows now open a deduplicated failure issue via scripts/create-ci-failure-issue.sh (:194-200), the alerting nine red weeks in Feb–Apr 2026 lacked.
fix(preview): surface deploy errors, pin CLIs, remove unsafe fork guidance #105 pins the CLIs with a package.json and package-lock.json in each preview action directory, installed with npm ci, plus an npm ecosystem entry in .github/dependabot.yml for both directories. Installing them into the images was rejected on three grounds. Dependabot cannot see a version string in action.yml. An image install does not reach non-container runners, which both READMEs support. And no ecosystem tracks tools installed in a Dockerfile: feat(containers): Node 24 LTS from nodejs.org, out of conda #166 bumps Node by hand for that reason.
wrangler … 2>&1 | tee …; EXIT=${PIPESTATUS[0]} still aborts under the composite shell's -eo pipefail before EXIT= runs. It needs set +e around the pipeline, or || EXIT=….
The Netlify capture must tee stdout only. Merging stderr into the --json payload breaks json.load on a successful deploy, and the now non-fatal parse would then fail a green deploy.
npm ci does not put the CLI on PATH, so the deploy steps must call it by path.
The container-mode conda env update should target the environment that is actually active: -p from sys.prefix, not -n "$ENV_NAME". -n would silently create a fresh envs/quantecon on a host whose stack is in base, such as the GPU AMI as docs/GPU-AMI-SETUP.md:115-178 describes it.
The LaTeX parse must keep splitting on whitespace. A per-line mapfile makes pkg one argument, which apt rejects, so the issue's own inline-comment example would stay red.
The builder parse must split on commas and whitespace, trim, and skip empty tokens, or html, pdflatex and html, regress. With that, the only values that go from green to red are the ones the fix targets (html,pdf, nojupyter). Every known consumer passes exactly html.
A new latex-requirements-file input on build-jupyter-cache must default to latex-requirements.txt. The runner passes an explicit '' through rather than applying the callee's default, so an empty default would break every standard-mode pdflatex user.
The template pin-drift check belongs in the harness gate job, because template-only PRs match the IGNORED regex and skip every other job.
Stale:PLAN.md:25-29's consumers table. All six exact call sites are now on @v0.11.1, bumped by Dependabot between 2026-08-12 and 2026-08-24.
Then remove the maintenance Type label — done, in that order: QEP-2's exemption from "unlabelled means needs triage" keys on the sub-issue relationship, so dropping it first would have left the tracker looking untriaged rather than structural.
Labelling and related issues
Labels follow QEP-2, now Accepted: infrastructure not maintenance for CI/build/deploy work, grouping by milestone rather than an audit label. security on #105 is a cross-cutting modifier, not a second Type. testing is retired to infrastructure/maintenance; #108 and #100 both moved, so nothing here uses it.
Nothing supersedes an existing issue. #100 (action-logic test coverage) stays open: its stage-1 harness shipped in v0.10.0, #108 covers only existing container tests being unable to fail, and its release-gating stage is tracked in #135. #99 folds into #109. #92 is open and unblocked. #83 and #14 were advanced here but closed elsewhere — #83 in v0.11.0 (#122, #123 variant in #127), which moots PLAN item 14 since create-failure-issue.sh was deleted rather than hardened, and #14 in v0.11.1 (#131). PLAN items 7 and 8 are done; item 15 is down to one cosmetic fix (#187).
The full ranked report — 83 findings, a 26-row quick-wins table, per-finding evidence — sits outside the repo.
Tracking issue for the July 2026 full-repository maintenance audit. Milestone: Maintenance audit 2026-07.
Complete (2026-09-24). All seven sub-issues are closed; v0.12.0 delivered the last five, and
v0moved to it after the staged canary run (decision 4). Two follow-ups in other repos are listed in the closing comment and indocs/dev/PLAN.md(#187).A multi-agent sweep of every tracked file across 14 dimensions, then two adversarial verification passes: 135 raw findings, 63 rejected, 72 confirmed, 11 added by four completeness sweeps, 83 actioned. Nothing found is architectural.
The work, ordered by dependency
ci: repair the container publish and validation pipeline #103 — repair the container publish and validation pipeline (— done in v0.9.0 (ci: repair the container publish and validation pipeline #111): uppercaseinfrastructurehigh-priority)ghcr.io/QuantEcon/…fromgithub.repository_ownermade buildx registry cache refs fail non-fatally, leaving builds cold and green (CHANGELOG.md:233-237); an unserialised workflow let an older commit win:latest(:238-240); a concurrency group shared across runs cancelled most of the lecture-validation matrix (:241-247); both unattended workflows now open a deduplicated failure issue viascripts/create-ci-failure-issue.sh(:194-200), the alerting nine red weeks in Feb–Apr 2026 lacked.fix(restore-jupyter-cache): save-mode outputs and fail-on-miss are broken #104 —— done in v0.9.0 (fix(restore-jupyter-cache): repair save-mode outputs and fail-on-miss #112); unblocks the Optimize preview builds: phased plan for the fastest PR previews (tracking) #92restore-jupyter-cachesave-mode outputs (bughigh-priority)save-cacherollout. Top-levelactions/cache@v6declares onlycache-hit, so save mode's outputs came back empty —cache-hitfalseon a perfect restore,fail-on-missfailing unconditionally; restore now always usesactions/cache/restore@v6, with alookup-only: truestep registering the job-end save hook (CHANGELOG.md:213-221). In CI since v0.10.0: both cache types × both modes,fail-on-missboth ways (CHANGELOG.md:141-151).fix(preview): surface deploy errors, pin CLIs, remove unsafe fork guidance #105 — preview deploy errors, CLI pinning, fork guidance (— done in v0.12.0: the README fork-PR warning in docs(preview-*): warn against pull_request_target instead of recommending it (#105) #170; in fix(preview-*): surface deploy errors, pin the CLIs by lockfile, keep the Netlify token off argv (#105) #174, with the three sketch corrections below applied, wrangler's output and netlify's stdout stream throughbugsecurityhigh-priority)teewithset +earound the call and the exit code read fromPIPESTATUS, and a failure ends in an::error::; both CLIs are pinned by a lockfile per action, installed withnpm ci(decision 2) and called by path; and the Netlify token, site ID, PR number, head SHA andbuild-dirmoved intoenv:. Closes PLAN item 8.docs: sweep to the Anaconda 2026.06 baseline and measured container sizes #106 — Anaconda 2026.06 baseline and measured sizes (— done in v0.12.0: fix(ci): make the image-size job report both sizes, and fail when it cannot #172 made the size job report both figures and fail when it cannot; docs: 2026.06 baseline, measured image sizes, and READMEs reconciled with the shipped code (#106, #109, #99) #175 moved the stale sites to the 2026.06 baseline and every size site to the measured, labelled pair (full 3.33 GB compressed / 8.60 GB on disk, lean 2.93 GB / 7.32 GB; decision 3), corrected "Minimal TexLive", refreshed the PLAN disposition rows (adding Release gating: require a green canary before v0 moves (adds a v0-next staging tag) #135's) and added CONTRIBUTING'sdocumentationhigh-priority)PLAN.mdrow.fix(actions): batch of small correctness fixes across the seven actions #107 — batch of small correctness fixes (— done in v0.12.0 (fix(actions): #107 correctness batch and #109 code items #173), with the three sketch corrections below applied (bug)conda env update -pon the active prefix, a LaTeX parse that splits on whitespace, an exact-token builder parse) and a LaTeX file with no packages made an::error::rather than the proposed warn-and-skip; new harness jobs (env-container-update,bjc-builders-parse);asset-urldeleted. Closes PLAN item 7; its cosmetic--path-outputresidual moves to PLAN item 15 (docs(plan): refresh after v0.12.0 closed the July 2026 audit; finish PLAN item 15 #187).test: unify container smoke tests and make the fixture exercise the Dockerfiles #108 — unify container smoke tests, fix the fixture (— done in v0.12.0 (test(containers): exercise the real theme and FreeFont path in the smoke fixture (#108) #171): the fixture builds withinfrastructure)quantecon_book_themeand Sphinx's default xelatexfontpkg,test-container.shis deleted and the image README points atsmoke-test.sh, andrun-local-tests.shpasses-W --keep-going. Test Container was dispatched on the branch and was green on both images.docs: reconcile action READMEs and templates with the shipped code #109 — reconcile READMEs and templates with shipped code (— done in v0.12.0: the docs in docs: 2026.06 baseline, measured image sizes, and READMEs reconciled with the shipped code (#106, #109, #99) #175 (closing docs: QUICK-REFERENCE "Pages 404?" snippet recommends the wrong permissions #99 too), plus thedocumentation)build-jupyter-cacheREADME's failure-only artifact wording in fix(actions): #107 correctness batch and #109 code items #173; the code items in fix(actions): #107 correctness batch and #109 code items #173 (latex-requirements-file, thecnamewarning, the template pin-drift check in thegatejob); the template checkouts in templates: move actions/checkout onto its Node 24 major #168.Decisions (2026-09-23)
PLAN item 10's docs trim comes later. The four docs: reconcile action READMEs and templates with the shipped code #109 items in
docs/QUICK-REFERENCE.md(thealias:recipe, the cache-key row, the fabricated LaTeX log line, docs: QUICK-REFERENCE "Pages 404?" snippet recommends the wrong permissions #99's 404 snippet) are fixed in place now. The trim is its own editorial PR. This lets docs: sweep to the Anaconda 2026.06 baseline and measured container sizes #106 and docs: reconcile action READMEs and templates with the shipped code #109 land as one docs PR.fix(preview): surface deploy errors, pin CLIs, remove unsafe fork guidance #105 pins the CLIs with a
package.jsonandpackage-lock.jsonin each preview action directory, installed withnpm ci, plus an npm ecosystem entry in.github/dependabot.ymlfor both directories. Installing them into the images was rejected on three grounds. Dependabot cannot see a version string inaction.yml. An image install does not reach non-container runners, which both READMEs support. And no ecosystem tracks tools installed in a Dockerfile: feat(containers): Node 24 LTS from nodejs.org, out of conda #166 bumps Node by hand for that reason.docs: sweep to the Anaconda 2026.06 baseline and measured container sizes #106 publishes both image sizes, each labelled: compressed, from the registry manifest, and on-disk, from a pull on a hosted runner. It does this after the size job is fixed.
Releases carrying fix(preview): surface deploy errors, pin CLIs, remove unsafe fork guidance #105 or fix(actions): batch of small correctness fixes across the seven actions #107 are staged. Merging to
mainreaches no action consumer. Movingv0reaches every@v0consumer on its next run, with nothing tested first: the Release gating: require a green canary before v0 moves (adds a v0-next staging tag) #135 gate is unbuilt, and the canary pins@v0, so it sees a release only after it ships. For these releases:vX.Y.Ztag and create the Release, but hold thev0move.ci.ymlpointed at@vX.Y.Z. That runsbuild-lecturesand a realpreview-netlifydeploy withpull_requestsemantics.cache.ymlfrom a branch pointed atbuild-jupyter-cache@vX.Y.Z. That runsbuild-jupyter-cache's own steps, including fix(actions): batch of small correctness fixes across the seven actions #107's builder parse.v0only when both are green.Known limits:
build-jupyter-cachecallssetup-environment@v0andbuild-lectures@v0(build-jupyter-cache/action.yml:149,:164,:174,:184), so fix(actions): batch of small correctness fixes across the seven actions #107'ssetup-environmentfixes reach that chain untested untilv0moves.It now has a project: the v0.12.0 staging ran a real deploy to thepreview-cloudflarehas no consumer and no known project to deploy to.qe-preview-canaryPages project (ci: staged check of quantecon/actions v0.12.0 (not for merging) test-actions-lecture-intro#66). It still has no standing consumer; a permanentpreview-cloudflare@v0step in the canary is a follow-up.create-release-assets, sopublish-gh-pages' release-asset path stays unexercised.git tag -f v0 <previous>plus a force push. It is undocumented (Release gating: require a green canary before v0 moves (adds a v0-next staging tag) #135).Container images do not stage: any merge touching
containers/**rebuilds and pushes:latestimmediately.Found in the 2026-09-23 revalidation
Checked against
main@ 44c0273. #165, #166 and #168 merged since the 2026-08-14 revalidation.test-container.yml's size job, added in test(containers): make the container fixture able to fail (#108) #125, logsjq: error … Cannot iterate over nullfor both images on every run since 2026-08-05 (e.g. runs 30981651170 and 35554068142), and stays green. The step has noshell:, so it runs asbash -e {0}withoutpipefail, and the pipeline takestee's status. The v0.11.0 CHANGELOG line on compressed manifest-byte reporting describes a measurement that never produced a figure. Fixed in fix(ci): make the image-size job report both sizes, and fail when it cannot #172, a prerequisite for docs: sweep to the Anaconda 2026.06 baseline and measured container sizes #106's size sweep.wrangler … 2>&1 | tee …; EXIT=${PIPESTATUS[0]}still aborts under the composite shell's-eo pipefailbeforeEXIT=runs. It needsset +earound the pipeline, or|| EXIT=….--jsonpayload breaksjson.loadon a successful deploy, and the now non-fatal parse would then fail a green deploy.npm cidoes not put the CLI onPATH, so the deploy steps must call it by path.conda env updateshould target the environment that is actually active:-pfromsys.prefix, not-n "$ENV_NAME".-nwould silently create a freshenvs/quanteconon a host whose stack is inbase, such as the GPU AMI asdocs/GPU-AMI-SETUP.md:115-178describes it.mapfilemakespkgone argument, which apt rejects, so the issue's own inline-comment example would stay red.html, pdflatexandhtml,regress. With that, the only values that go from green to red are the ones the fix targets (html,pdf,nojupyter). Every known consumer passes exactlyhtml.latex-requirements-fileinput onbuild-jupyter-cachemust default tolatex-requirements.txt. The runner passes an explicit''through rather than applying the callee's default, so an empty default would break every standard-mode pdflatex user.gatejob, because template-only PRs match the IGNORED regex and skip every other job.PLAN.md:25-29's consumers table. All six exact call sites are now on@v0.11.1, bumped by Dependabot between 2026-08-12 and 2026-08-24.bayes_nonconjfails under numpyro 0.22.0 and its build sits at the 120-minute timeout, neither caused by this repo or its images.Tracker structure
QEP-2 routes umbrella issues to native sub-issues with no Type label on the parent.
Add fix(preview): surface deploy errors, pin CLIs, remove unsafe fork guidance #105–docs: reconcile action READMEs and templates with the shipped code #109 as native sub-issues, plus closed ci: repair the container publish and validation pipeline #103 and fix(restore-jupyter-cache): save-mode outputs and fail-on-miss are broken #104 for the audit trail.— done; all seven are linked.Then remove the— done, in that order: QEP-2's exemption from "unlabelled means needs triage" keys on the sub-issue relationship, so dropping it first would have left the tracker looking untriaged rather than structural.maintenanceType labelLabelling and related issues
Labels follow QEP-2, now Accepted:
infrastructurenotmaintenancefor CI/build/deploy work, grouping by milestone rather than anauditlabel.securityon #105 is a cross-cutting modifier, not a second Type.testingis retired toinfrastructure/maintenance; #108 and #100 both moved, so nothing here uses it.Nothing supersedes an existing issue. #100 (action-logic test coverage) stays open: its stage-1 harness shipped in v0.10.0, #108 covers only existing container tests being unable to fail, and its release-gating stage is tracked in #135. #99 folds into #109. #92 is open and unblocked. #83 and #14 were advanced here but closed elsewhere — #83 in v0.11.0 (#122, #123 variant in #127), which moots PLAN item 14 since
create-failure-issue.shwas deleted rather than hardened, and #14 in v0.11.1 (#131). PLAN items 7 and 8 are done; item 15 is down to one cosmetic fix (#187).The full ranked report — 83 findings, a 26-row quick-wins table, per-finding evidence — sits outside the repo.