Skip to content

feat(agents): serve Makie in the agent chat (Julia runtime, J2b) - #12464

Merged
MarkusNeusinger merged 4 commits into
mainfrom
feat/julia-runtime
Oct 30, 2026
Merged

MarkusNeusinger merged 4 commits into
mainfrom
feat/julia-runtime

Conversation

@MarkusNeusinger

Copy link
Copy Markdown
Owner

Summary

  • Makie served for the admin, as feat(agents): serve ggplot2 in the agent chat (R runtime) #12448 served ggplot2. JuliaRuntime (agents/anyplot/render/runtimes/julia.py) mirrors RRuntime on J2a's Julia code profile: plot.jl renders 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_texts on (no probe); dataset-package blocks; the export runs julia --project=. plot.jl. Registered as JULIA_LIBRARIES = {"makie"}; agents/cloudbuild.yaml _LIBRARIES gains makie (admin-only deploy; the 80 % eval matrix gates the public release, owner decision).
  • Loader note (owner decision 2026-10-29): datetime cells whose digits below the millisecond Julia's DateTime cannot hold are counted per column and named first in "what changed"; the status stays the render's. The 200-character note fitting moved from r.py into a shared runtimes/notes.py (R's output byte-identical, its tests unchanged).
  • Julia errors read right. RuntimeCommand.stderr_head = "ERROR:" for the Julia row only: executor.stderr_tail keeps the first ERROR: 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()".
  • Prompt and evals. prompts/adapter_julia.md fills every slot of adapter.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), a fmt helper 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, not filter; spans, vlines! and band! on a date axis: numeric day offsets; text as barplot! x: integer positions and xticks). Its idioms pass both Julia validators and render in the image. 60 *-makie-* fixtures and the smoke case scatter-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) against anyplot-renderer:julia
  • uv run --extra agents python -m agents.evals.make_fixtures --check; eligibility sweep (makie row above); uv run python -m tools.changelog check --base origin/main
  • End to end without a model (LocalDockerBackend, 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", status ok; two forced failures summarise with the ERROR: line and the working-form line
  • After the merge (owner): the eval matrix on Vertex (*-makie-*, 60 cases) and a live test in the admin chat

MarkusNeusinger and others added 2 commits October 30, 2026 01:25
…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
Copilot AI lite review requested due to automatic review settings October 30, 2026 00:32

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.

🟡 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 JuliaRuntime and 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

Comment thread agents/evals/fixtures/README.md Resolved
@codecov

codecov Bot commented Oct 30, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.93617% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
agents/anyplot/render/runtimes/julia.py 99.00% 1 Missing ⚠️
agents/evals/ladder_lab.py 50.00% 1 Missing ⚠️

📢 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
MarkusNeusinger merged commit 6bb68f3 into main Oct 30, 2026
18 checks passed
@MarkusNeusinger
MarkusNeusinger deleted the feat/julia-runtime branch October 30, 2026 06:28
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
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