Repository navigation
feat(agents): serve Makie in the agent chat (Julia runtime, J2b) - #12464
Merged
Merged
Conversation
…r tail A deep Makie failure prints 7,500 characters of stack and more, so the last 2,000 characters a theme returns lost Julia's first `ERROR: LoadError: ...` line, and the agents' Julia error grammar fell back to "an error (the tail cut off its first line)" (found in J2a). - `RuntimeCommand.stderr_head`: a line prefix whose first line the tail keeps; `"ERROR:"` for the Julia row (`JULIA_ERROR_HEAD`), empty for every other row. - `executor.stderr_tail(stderr, head)`: the last `MAX_STDERR_CHARS`; with a head, the first line that starts with it, cut to 300 characters, goes in front when the tail lost its start, and the tail gives up that many characters, so the answer stays within the same bound and `wire.py` is unchanged. `run_theme` passes the job's row. - The local Docker backend cuts a theme's stderr with the same function and the runtime's row, so local and deployed renders summarise alike. Safe for Python and R: their rows carry no head, and an empty head, a stderr within the bound, a head line inside the tail and a stderr without one all give the plain tail, byte for byte as before; a test pins that only the Julia row has a head. Data runs and conversions are untouched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
J2b of step 5 of agentic/specs/261024-agent-all-libraries.md, as PR 3b
served ggplot2: the Julia runtime on J2a's code profile and J1.1's image,
the Julia adapter prompt, the fixtures and the admin deploy.
- `JuliaRuntime` (`render/runtimes/julia.py`), registered as
`JULIA_LIBRARIES = {"makie"}` and `RUNTIME_CLASSES["julia"]`: `plot.jl`,
the renderer's Julia row as the command and its environment key for key,
J2a's normaliser, loader, validators, readiness scan, edits and error
grammar, no probe (`review_texts`), `dataset-package` in the blocking
rules, Julia adaptation targets, the export with `julia --project=.
plot.jl`, the row's 25 s reserve, Python's data runs and conversions.
- Loader note (owner decision of 2026-10-29): timestamps cut to the
millisecond are counted per column and named first in "what changed";
the status stays the render's. The 200-character fitting moved from
`RRuntime` to `runtimes/notes.counted_note` (R's line unchanged).
`root.md` names the line in replies and `plot.jl` next to `plot.py` and
`plot.R`.
- Line numbers: `RuntimeAdapter.error_summary` takes the run form as a
keyword, which the pipeline passes; the Julia runtime takes the loader's
span (`loader.loader_span`, 15 lines and more) off the lines, so the
repair gets the working form's line, and a line inside the loader reads
"(the data loader)". Python and R leave the keyword unread (R names no
line; Python keeps its run-form line, a finding for the owner).
- `prompts/adapter_julia.md` fills every slot of `adapter.md` and the
highlights slot: placeholder and loader types, `df[!, COL]` column
constants, protected statements, package allowlist, `dropmissing` before
a time axis, categories as integer positions, a formatter with DECIMAL
and THOUSANDS (Printf has no grouping flag), spans and bands on a time
axis as numeric offsets (measured: `vspan!`, `hspan!`, `vlines!` and
`band!` fail on a DateTime axis in any order). The Python prompt keeps
its SHA-256; a test runs the idioms through both Julia validators, an
image test renders them with missing cells.
- Evals: 60 Makie fixtures (480 generated, 487 in a full run) and the
smoke case `scatter-basic-makie-renamed` (18); eligibility sweeps Makie
(325: 0 clean, 308 coupled, 17 blocked); `ladder_lab` uses the runtime's
error grammar instead of Python's.
- Deploy: `_LIBRARIES` gains makie (owner decision: the admin deploy serves
every library with a runtime; the matrix gates the public release). The
agents image's build check composes the Julia adapter instruction;
`ci-image.yml` checks the new prompt and makie.md in the image and scans
through the runtime.
- Docs: the plan's "What J2b built", agent-network.md, agents/README.md,
a changelog fragment. The app needed no change.
Verified without a model: an identity adaptation of the smoke case with a
timestamp column rendered 3200x1800 in both themes through LocalDockerBackend
on anyplot-renderer:julia in 5.7 s, `exec_deny: on`, the 60 cut timestamps
first in "what changed", status ok; a forced MethodError now reads
"MethodError for initialize_block!() at line 86; in Legend()" instead of
"an error (the tail cut off its first line) at line 116; in Legend()".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
Contributor
There was a problem hiding this comment.
🟡 Changes recommended
An active documentation inconsistency remains because the fixture totals list 510 cases while the section heading still reports 450.
1 open issue
What changed in this PR
This PR adds Makie support to the admin agent chat through a Julia runtime, extending the existing Python and R runtime architecture. It also improves Julia loader fidelity reporting and error diagnostics, and adds Makie fixtures and readiness coverage for the evaluation matrix.
Changes:
- Registers
JuliaRuntimeand Makie with the agent, renderer, Docker image, admin deployment, export flow, and runtime prompts. - Adds Julia-specific data loading, timestamp precision notes, stderr preservation, and source-line mapping for failed renders.
- Adds 60 Makie evaluation fixtures, readiness assertions, Julia validator/image tests, and documentation updates.
| File | Description |
|---|---|
| tests/unit/agents/test_image.py | Updated as part of this pull request. |
| tests/unit/agents/runtime/test_service_flow.py | Updated as part of this pull request. |
| tests/unit/agents/runtime/test_render.py | Updated as part of this pull request. |
| tests/unit/agents/runtime/test_policy.py | Updated as part of this pull request. |
| tests/unit/agents/runtime/test_pipeline.py | Updated as part of this pull request. |
| tests/unit/agents/runtime/test_dev_fixture.py | Updated as part of this pull request. |
| tests/unit/agents/renderer/test_executor.py | Updated as part of this pull request. |
| tests/unit/agents/evals/test_make_fixtures.py | Updated as part of this pull request. |
| tests/unit/agents/evals/test_eligibility.py | Updated as part of this pull request. |
| tests/unit/agents/evals/test_cases.py | Updated as part of this pull request. |
| tests/unit/agents/code/test_profile_julia_loader.py | Updated as part of this pull request. |
| tests/unit/agents/code/test_profile_julia_image.py | Updated as part of this pull request. |
| tests/unit/agents/code/test_profile_julia_errors.py | Updated as part of this pull request. |
| tests/unit/agents/code/conftest.py | Updated as part of this pull request. |
| changelog.d/julia-runtime.md | Updated as part of this pull request. |
| agents/renderer/executor.py | Updated as part of this pull request. |
| agents/renderer/commands.py | Updated as part of this pull request. |
| agents/evals/matrix.py | Updated as part of this pull request. |
| agents/evals/ladder_lab.py | Updated as part of this pull request. |
| agents/evals/fixtures/README.md | Updated as part of this pull request. |
| agents/evals/fixtures/cases/violin-basic-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/violin-basic-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/violin-basic-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/violin-basic-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/violin-basic-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/violin-basic-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/violin-basic-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/scatter-basic-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/scatter-basic-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/scatter-basic-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/scatter-basic-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/scatter-basic-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/scatter-basic-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/scatter-basic-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-x10/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-renamed/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-decimal-comma/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-date/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/pie-basic-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-timeseries-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-timeseries-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-timeseries-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-timeseries-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-timeseries-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-timeseries-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-timeseries-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-x10/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-renamed/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-decimal-comma/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-date/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/line-basic-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/histogram-basic-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/histogram-basic-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/histogram-basic-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/histogram-basic-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/histogram-basic-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/histogram-basic-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/histogram-basic-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/heatmap-basic-makie-x10/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/heatmap-basic-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/heatmap-basic-makie-renamed/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/heatmap-basic-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/heatmap-basic-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/heatmap-basic-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/heatmap-basic-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/heatmap-basic-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/heatmap-basic-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/box-basic-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/box-basic-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/box-basic-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/box-basic-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/box-basic-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/box-basic-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/box-basic-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-x10/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-renamed/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-decimal-comma/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-date/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/bar-grouped-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-x10/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-x10/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-renamed/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-renamed/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-n5000/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-n12/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-n12/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-decimal-comma/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-decimal-comma/case.json | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-date/data.csv | Updated as part of this pull request. |
| agents/evals/fixtures/cases/area-basic-makie-date/case.json | Updated as part of this pull request. |
| agents/evals/eligibility.py | Updated as part of this pull request. |
| agents/evals/cases.py | Updated as part of this pull request. |
| agents/Dockerfile | Updated as part of this pull request. |
| agents/cloudbuild.yaml | Updated as part of this pull request. |
| agents/anyplot/settings.py | Updated as part of this pull request. |
| agents/anyplot/render/runtimes/r.py | Updated as part of this pull request. |
| agents/anyplot/render/runtimes/python.py | Updated as part of this pull request. |
| agents/anyplot/render/runtimes/notes.py | Updated as part of this pull request. |
| agents/anyplot/render/runtimes/__init__.py | Updated as part of this pull request. |
| agents/anyplot/render/contract.py | Updated as part of this pull request. |
| agents/anyplot/render/backends/local.py | Updated as part of this pull request. |
| agents/anyplot/render/__init__.py | Updated as part of this pull request. |
| agents/anyplot/prompts/root.md | Updated as part of this pull request. |
| agents/anyplot/policy.py | Updated as part of this pull request. |
| agents/anyplot/pipeline.py | Updated as part of this pull request. |
| agents/anyplot/code/profiles/julia/loader.py | Updated as part of this pull request. |
| agents/anyplot/code/profiles/julia/errors.py | Updated as part of this pull request. |
| .github/workflows/ci-image.yml | Updated as part of this pull request. |
Review effort: Lite
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
… case total The agents-image job failed on scatter-basic's Makie file, which has no Imprint palette (a single brand colour; 213 of the 325 Makie files carry one). The step proves the runtime reaches the Julia profile in the image: readiness, SECURITY, THEME and the protected save, as before this PR. Copilot's review: the fixture README's total is 510 (480 + 7 + 23). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
MarkusNeusinger
added a commit
that referenced
this pull request
Oct 30, 2026
J2b (#12464) touched the same paragraph of docs/concepts/agent-network.md: keep JS-1's JavaScript and bokeh/plotly text and take main's Julia text (the agents service sends Makie jobs since 2026-10-30). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
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.

Summary
JuliaRuntime(agents/anyplot/render/runtimes/julia.py) mirrorsRRuntimeon J2a's Julia code profile:plot.jlrenders through the renderer's strict Julia row in exec mode under the exec filter, with the precompiled depot and the J1.1 workload; command and environment match the row key for key;review_textson (no probe);dataset-packageblocks; the export runsjulia --project=. plot.jl. Registered asJULIA_LIBRARIES = {"makie"};agents/cloudbuild.yaml_LIBRARIESgainsmakie(admin-only deploy; the 80 % eval matrix gates the public release, owner decision).DateTimecannot hold are counted per column and named first in "what changed"; the status stays the render's. The 200-character note fitting moved fromr.pyinto a sharedruntimes/notes.py(R's output byte-identical, its tests unchanged).RuntimeCommand.stderr_head = "ERROR:"for the Julia row only:executor.stderr_tailkeeps the firstERROR:line (cut to 300 characters) in front of the tail within the same 2,000 characters (renderer and local backend); every other row's tail is byte for byte as before.error_summary(..., run_form=...)maps the run form's line numbers back to the code the adapter edits (the loader adds 15+ lines); Python and R accept and ignore the keyword. Before: "an error (the tail cut off its first line) at line 116; in Legend()"; now: "MethodError for initialize_block!() at line 86; in Legend()".prompts/adapter_julia.mdfills every slot ofadapter.md(Python's prompt pinned by SHA-256, unchanged): the placeholder and how the loader types each column,df[!, COL], the protected statements, the allowed packages (CSV and TimeZones loader-only), afmthelper for the plot language's decimal/thousands marks (Julia's Printf has none), and Makie 0.24's refusals measured in the image (a Date column with a missing cell:dropmissing, notfilter; spans,vlines!andband!on a date axis: numeric day offsets; text asbarplot!x: integer positions andxticks). Its idioms pass both Julia validators and render in the image. 60*-makie-*fixtures and the smoke casescatter-basic-makie-renamed; eligibility: 325 files, 0 clean, 308 coupled, 17 blocked; all ten matrix specs coupled.Gemini 3.8 Flash pre-PR check: sound, no findings. Follow-ups left out on purpose (Todoist): Python's error line also counts the run form (the new keyword would fix it, but that changes Python's feedback text); deep Makie failures without a Base exception type stay "an error"; telemetry still classifies R/Julia render failures with Python's grammar.
Plan
agentic/specs/261024-agent-all-libraries.md, step 5 (J2b)
Test plan
uv run ruff check . && uv run ruff format --check .;uv run --extra typecheck --extra agents mypy agents(125 files clean)uv run --extra agents --extra test pytest tests/unit -q -n auto(20,326 passed, 27 skipped); the Julia image tests (4) againstanyplot-renderer:juliauv run --extra agents python -m agents.evals.make_fixtures --check; eligibility sweep (makie row above);uv run python -m tools.changelog check --base origin/mainLocalDockerBackend, the renderer image with the workload): an identity adaptation of the smoke fixture with a timestamp column (offsets,Z, microseconds, missing cells) renders 3200x1800 in both themes (3200x1864 with the footer strip), R1–R3 pass, 5.7 s per theme,exec_deny: on, 1,014 MiB; the note counts 60 timestamps and comes first in "what changed", statusok; two forced failures summarise with theERROR:line and the working-form line*-makie-*, 60 cases) and a live test in the admin chat