Skip to content

chore(julia): move the render stack to Julia 1.13 and Makie 0.24 - #12245

Merged
MarkusNeusinger merged 3 commits into
mainfrom
chore/julia-1.13-makie-0.24
Oct 23, 2026
Merged

MarkusNeusinger merged 3 commits into
mainfrom
chore/julia-1.13-makie-0.24

Conversation

@MarkusNeusinger

@MarkusNeusinger MarkusNeusinger commented Oct 23, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Moves the Julia render stack from Julia 1.11.9 / Makie 0.21.9 / CairoMakie 0.12.9 to Julia 1.13.2 / Makie 0.24.16 / CairoMakie 0.15.16 (Project.toml compat, Manifest.toml regenerated by Pkg in a julia:1.13.2 container, setup-julia default 1.13). Since refactor: derive library versions from pins, install from uv.lock #12240 the displayed versions derive from the Manifest and the setup-julia default, so core/constants.py needs no change.
  • Drops QRCoders from the environment. It is the dependency that pinned Makie at 0.21.9, and it still blocks every Makie release from 0.21.10 on. The generator and reviewer package lists now name it as not loadable.
  • Updates prompts/library/makie.md: Figure(size = …) replaces the deprecated resolution keyword, the "API level" line names Makie 0.24, and a new "Makie 0.24 API Notes" section covers every break the before/after render found.

Why Makie was stuck on 0.21.9

The qrcode-basic implementation (#9398) added QRCoders, and the resolver moved Makie from 0.22.10 down to 0.21.9. The chain, confirmed with the resolver in a julia:1.13.2 container:

  1. Every QRCoders release (1.0.0 to 1.4.5, and upstream master today) has compat ImageCore = "0.8, 0.9".
  2. Makie 0.21.10 and later, all of 0.22 to 0.24 included, require ImageBase >= 0.1.7.
  3. ImageBase 0.1.7 requires ImageCore 0.10, so no Makie after 0.21.9 can coexist with QRCoders.

QRCode.jl, the only other QR package in the General registry, has the same ImageCore 0.8 to 0.9 cap. The new Manifest avoids the conflict by not carrying a QR encoder at all. The prompt now says so, so a regeneration does not reach for one.

plots/qrcode-basic/implementations/julia/makie.jl stops running in the new environment and is left untouched. Its catalogue PNGs stay valid until it is regenerated; the generator will have to hand-roll the encoder or return NOT_FEASIBLE. An upstream compat PR to JuliaImages/QRCoders.jl (ImageCore 0.10) is a possible follow-up for the owner to decide.

Before/after renders

All 325 Makie implementations in both themes, no sampling. Each render is its own julia --project=<env> makie.jl process with ANYPLOT_THEME set, run from the implementation's directory as in impl-generate.yml. The renders ran in official julia:1.11 and julia:1.13 images with the action's apt packages. Before: Julia 1.11.9 with the committed Manifest. After: Julia 1.13.2 with exactly the Manifest in this PR. A pixel counts as changed when any channel moves by more than 16/255. "Near" means under 0.1 % of pixels changed.

Class Specs Renders
Identical 23 46
Near (< 0.1 % pixels) 251 502
Changed 45 90
Failed after the bump 5 10
Failed before, renders after 1 2

No render changed its pixel size.

Failures after the bump

All five are code written against old behaviour, not default drift:

  • qrcode-basic: QRCoders is no longer installed (see above).
  • area-mountain-panorama, line-parametric: GridLayoutBase 0.11.3 (upstream PR feat(highcharts): implement heatmap-correlation #68) makes rowgap!/colgap! honour offset indices. After a header at fig[0, …], rowgap!(fig.layout, 1, …) names a gap that does not exist and raises "invalid row gap". bode-basic and spc-xbar-r use the same pattern without crashing; they now resize a different gap.
  • circos-basic: a custom recipe called with keyword arguments only; Makie 0.24 refuses it ("No plot arguments given").
  • feynman-basic: the deprecated arrows! called inside a custom recipe hits a MethodError in the 0.24 compatibility shim.

Healed

  • nyquist-basic was generated on Makie 0.22.10 and crashes on today's 0.21.9 runtime (BoundsError at save). It renders again on 0.24.

Silent breakage

  • heatmap-polar exits 0 but saves a blank image: polar grid only, no title, data or colorbar. Any heatmap! on a PolarAxis does this in CairoMakie 0.15.15 and 0.15.16, for every input form, without an error; surface! and band! render. The canvas gate refuses it at review time (check_blank, AR-04: "Plot is 99% one color"), so a regeneration cannot merge blank. The prompt now forbids heatmap! on a PolarAxis and names the band! workaround.

The ten largest diffs

Spec Max pixels changed Cause
heatmap-polar 55.1 % Blank render, see above
flamegraph-basic 45.8 % Julia 1.13 changed hash(::String); frame colors are chosen by hash
biplot-pca 12.1 % General eigen returns PC1 with the opposite sign (mirrored plot); deprecated arrows draw thinner
scatter-ashby-material 11.4 % The family envelopes were missing on 0.21.9 and render on 0.24 (improvement)
bar-spine 11.0 % Hatch pattern rework (Makie 0.22.2)
histogram-epidemic 10.6 % Tighter automatic x-limits; bars stay on their dates
subplot-grid 8.9 % Scientific tick labels lost the .0 padding (0.24.11), shifting the axes
swimmer-clinical-timeline 8.7 % Julia 1.13 changed shuffle!; different patients
ma-differential-expression 8.6 % Julia 1.13 changed randperm; different points
network-bipartite 5.8 % Julia 1.13 changed randperm

Default drift is visible in the polar plots too: Makie 0.24.12 aligned the PolarAxis defaults with Axis, with a bold title, a thinner spine and lighter grid lines. Seeded rand and randn streams are unchanged between Julia 1.11 and 1.13.

Deprecated keywords

  • resolution: 122 implementations pass Figure(resolution = …). All of them still render on 0.24 with a deprecation warning, so it is a warning, not a failure.
  • arrows!: 16 implementations use the deprecated arrows!. All render except feynman-basic, with warnings about the renamed attributes.

Breaking changes handled in the prompt

From the Makie changelog 0.21.9 to 0.24.16 and the render results, each checked in the 1.13 container:

  • Figure(size = …) instead of resolution (deprecated since 0.20).
  • arrows2d! with shaftwidth/tipwidth/tiplength/tipcolor/shaftcolor (arrows! deprecated in 0.23).
  • annotations! removed in 0.24, so the prompt names text! and the annotation! recipe instead.
  • text! align must be a tuple.
  • shading = false instead of NoShading.
  • PseudologTicks/SymlogTicks for pseudolog10/Symlog10 (0.24.11).
  • series! color cycling (0.24.16).
  • Top-down layouts for rowgap!/colgap! (GridLayoutBase 0.11.3).
  • No heatmap! on a PolarAxis.
  • No hash/Dict order for colors.
  • No QR encoder in the environment.

prompts/plot-generator.md and prompts/quality-criteria.md carry identical Julia "compute with" blocks, which a unit test compares with Project.toml. Both now move QRCoders from the installed list to "Not loadable". In the rubric this corrects which packages are installed and changes no criterion or deduction, so I dispatched no review-retest arm.

Regeneration candidates

  • Must regenerate: qrcode-basic (QRCoders dropped), area-mountain-panorama, circos-basic, feynman-basic, line-parametric, heatmap-polar.
  • Healed by this bump: nyquist-basic. Its stored images predate the 0.21.9 runtime and need no action.
  • Optional: the 16 implementations on the deprecated arrows!, and bode-basic / spc-xbar-r, whose header gap moved.

First review (Gemini 3.8 Flash)

  • Applied: plot-generator.md and quality-criteria.md still listed QRCoders as installed. The CI "Run Tests" job failed on that test before the fix.
  • Skipped: the claim that arrows2d!, PseudologTicks and SymlogTicks don't exist. All three are defined in Makie 0.24.16, checked in the container.
  • Skipped: adding PNGFiles to the action's no-Manifest fallback. That path predates this PR and never runs while Manifest.toml is committed.
  • Skipped: fixing the failing implementations in this PR. plots/ is out of scope, and the pipeline regenerates them.

Dependencies and verification gaps

  • refactor: derive library versions from pins, install from uv.lock #12240 (version sources): merged; this branch is rebased on it. core/constants.py and the makie.md header line take its form, and its "API level:" line now names Makie 0.24, which tests/unit/core/test_version_sources.py checks against the Manifest.
  • setup-julia action: no local verification loop exists beyond the container run. Pkg.instantiate() on this Manifest and the action's smoke test both pass in julia:1.13.2. The first real check is the next Makie impl-generate run.

Plan

N/A

Test plan

  • Before/after render of all 325 Makie implementations, both themes, in julia:1.11 / julia:1.13 containers
  • Resolver run confirming the QRCoders → ImageCore → ImageBase → Makie chain
  • Pkg.instantiate() and the action's smoke test on this Manifest in julia:1.13.2
  • Prompt API notes checked against Makie 0.24.16 in the container
  • ruff check, ruff format --check, mypy api core, pytest tests/unit tests/integration (12,277 passed)
  • uv run python -m tools.changelog check --base origin/main
  • Next Makie impl-generate run installs Julia 1.13 and renders

MarkusNeusinger added a commit that referenced this pull request Oct 23, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The shared runtime upgrade has documented rendering regressions and a pending real Makie pipeline check that warrant human sign-off.

No open issues 🎉

What changed in this PR

Upgrades anyplot’s shared Julia rendering environment to Julia 1.13 and Makie 0.24, with matching dependency pins, displayed versions, and generator guidance.

Changes:

  • Updates Julia, Makie, and CairoMakie compatibility and regenerates the dependency lockfile.
  • Removes QRCoders to resolve its dependency conflict with newer Makie releases.
  • Updates figure sizing examples and documents API changes and rendering workarounds.
File Description
prompts/​quality-criteria.md Marks QRCoders as unavailable to reviewed implementations.
prompts/​plot-generator.md Aligns the generator’s package list with the new environment.
prompts/​library/​makie.md Updates sizing examples, version header, and API guidance.
Project.toml Raises compatibility requirements and removes QRCoders.
Manifest.toml Locks the upgraded Julia rendering dependencies.
core/​constants.py Updates displayed Julia and Makie versions.
changelog.d/​julia-1.13-makie-0.24.md Records the upgrade and compatibility impacts.
.github/​actions/​setup-julia/​action.yml Updates the default runtime and smoke-test sizing keyword.

Review effort: Balanced

MarkusNeusinger and others added 3 commits October 23, 2026 11:59
Makie 0.24.16 / CairoMakie 0.15.16 on Julia 1.13.2, up from Makie 0.21.9
on Julia 1.11.9. QRCoders leaves Project.toml: every release caps
ImageCore at 0.9, while Makie >= 0.21.10 needs ImageBase 0.1.7 and
therefore ImageCore 0.10. That conflict is what resolved Makie down to
0.21.9 when qrcode-basic (#9398) added QRCoders.

- Project.toml compat and Manifest.toml, regenerated by Pkg in a
  julia:1.13.2 container
- setup-julia installs 1.13 by default; its smoke test uses `size`
- core/constants.py shows Makie 0.24 and Julia 1.13
- prompts/library/makie.md: `Figure(size = ...)` instead of the
  deprecated `resolution`, header line 0.24 / 1.13, and notes on the
  0.24 APIs that broke catalogue implementations in the before/after
  render (arrows, text align, layout gaps, heatmap on PolarAxis,
  hash/Dict determinism, no QR encoder)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The generator and reviewer "compute with" blocks still named QRCoders
after it left Project.toml; test_julia_block_matches_project_toml
compares the two. Move it to the not-loadable list in both copies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MarkusNeusinger
MarkusNeusinger force-pushed the chore/julia-1.13-makie-0.24 branch from 00d5e91 to b1fe0b0 Compare October 23, 2026 10:02
@MarkusNeusinger
MarkusNeusinger merged commit 862014d into main Oct 23, 2026
16 checks passed
@MarkusNeusinger
MarkusNeusinger deleted the chore/julia-1.13-makie-0.24 branch October 23, 2026 10:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants