From aa18df898ca1b4c9221eff56fc6aea9c887ab927 Mon Sep 17 00:00:00 2001 From: Markus Neusinger <2921697+MarkusNeusinger@users.noreply.github.com> Date: Tue, 18 Aug 2026 22:46:51 +0200 Subject: [PATCH 1/2] =?UTF-8?q?release:=20v3.1.0=20=E2=80=94=20Legible=20t?= =?UTF-8?q?o=20machines?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moves the [Unreleased] section to [3.1.0], bumps pyproject.toml and the project's own pin in uv.lock. Minor rather than major by the repo's own rule: agentic/commands/release.md reserves major for language/library waves, rebrands and breaking URL or schema changes, and this window contains none of those. It is a large feature batch — 84 entries over two months — not a milestone in that sense. Two aggregate lines added as the procedure requires: the Dependencies bullet now covers all 32 Dependabot bumps of the window rather than the nine it listed, and a Catalog line records 1,607 implementation merges, 10 new plot types and the catalogue's current size. uv.lock carries only the version line. Running `uv lock` also normalised platform markers on secretstorage and statsmodels — drift from a newer uv than the one that wrote the committed lock. That is unrelated to the release and would have made the diff harder to audit, so it is left for a separate change; `uv lock --check` passes with the lock as committed here. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 30 ++++++++++++++++++++++++++---- pyproject.toml | 2 +- uv.lock | 2 +- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0ee24cde9..15fcf58e7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,22 @@ aggregate instead: an italic *Catalog* line at the end of the version section an ## [Unreleased] +## [3.1.0] — 2026-08-18 — Legible to machines + +anyplot 3.1 makes the catalogue readable by machines. An assistant asked about a plot can now find +it, open one library's page, read the runnable source, fetch the rendered image and cite the URL — +a path that was broken at four separate points, each invisible to anyone browsing the site by hand. +Googlebot had been walking an infinite redirect; a trailing slash sent crawlers to a host that +forbids crawling; unknown library names produced an unbounded supply of indexable near-duplicates; +and seven AI fetchers were served an empty shell. The crawler policy that used to decline training +crawlers is now open to every operator that follows the rules, which is also the only way Gemini +could ever cite the catalogue. Two Plausible sites now separate what people read from what machines +do. + +Behind that: a Search Console integration that had never once worked, a synthetic monitor that had +been failing unnoticed for ten days, three new verification skills, and a security-headers and +audit sweep across the stack. + ### Added - **You can now see which assistants read the catalogue** — a `bot_fetch` event records every AI @@ -221,9 +237,12 @@ aggregate instead: an italic *Catalog* line at the end of the version section an previews regenerate against the new major through the regular pipeline (#9609). - **Post-restructure `app/` cleanup:** dead components removed and stale doc paths fixed (#8630); ECharts / MUI X labels shortened in the `/stats` library list (#8666). -- **Dependencies:** grouped bumps across Python (starlette, cryptography, python-multipart, - sqlalchemy, uvicorn, 15-update python-minor group), npm (esbuild, undici), and GitHub Actions - (#8668, #8823, #8824, #8864, #8978, #8980, #9074, #9513, #9515). +- **Dependencies:** 32 grouped bumps across Python (starlette, cryptography, python-multipart, + sqlalchemy, uvicorn, pydantic, the python-minor group), npm (esbuild, undici, vite, react, the + npm-minor and mui groups) and GitHub Actions (#8330, #8668, #8823, #8824, #8864, #8977, #8978, + #8979, #8980, #9074, #9513, #9515, #9613, #9640, #9643, #9647, #9648, #9650, #9652, #9653, #9654, + #9657, #9673, #9674, #9955, #9957, #9960, #9961, #9962, #10017, #10067, #10115, #10178). One of + them, the vite 8.1.5 bump in #9657, took the site down and is written up under Fixed. ### Removed @@ -612,6 +631,8 @@ aggregate instead: an italic *Catalog* line at the end of the version section an included in both server blocks and re-included in every `add_header` location (audit 2026-07-15 Medium#21) (#9642). +*Catalog: 1,607 implementation merges across 15 libraries and 10 new plot types (heatmap-periodic-table, line-cycle-seasonal, depth-order-book, climograph-walter-lieth, audiogram-clinical, burndown-sprint, bar-heart-rate-zones, gauge-activity-rings, curve-power-duration, line-training-load-pmc); the catalogue stands at 324 specifications.* + ## [3.0.0] — 2026-06-10 — Julia & JavaScript, 15 libraries & the Imprint palette anyplot 3.0 doubles the language count — Julia and JavaScript join Python and R, growing the @@ -869,7 +890,8 @@ interactive HTML previews. Actions workflows (spec creation, impl generation, AI review, auto-merge); Cloud Run + Cloud SQL + GCS; 1,081 unit tests. -[Unreleased]: https://github.com/MarkusNeusinger/anyplot/compare/v3.0.0...HEAD +[Unreleased]: https://github.com/MarkusNeusinger/anyplot/compare/v3.1.0...HEAD +[3.1.0]: https://github.com/MarkusNeusinger/anyplot/compare/v3.0.0...v3.1.0 [3.0.0]: https://github.com/MarkusNeusinger/anyplot/compare/v2.4.0...v3.0.0 [2.4.0]: https://github.com/MarkusNeusinger/anyplot/compare/v2.3.0...v2.4.0 [2.3.0]: https://github.com/MarkusNeusinger/anyplot/compare/v2.2.0...v2.3.0 diff --git a/pyproject.toml b/pyproject.toml index 4c1cd6dc0a..728e7c1d4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ # pyproject.toml [project] name = "anyplot" -version = "3.0.0" +version = "3.1.0" description = "AI-powered plotting examples" authors = [{ name = "Markus Neusinger", email = "admin@anyplot.ai" }] requires-python = ">=3.13" diff --git a/uv.lock b/uv.lock index 40809a20f9..4a0221b06a 100644 --- a/uv.lock +++ b/uv.lock @@ -227,7 +227,7 @@ wheels = [ [[package]] name = "anyplot" -version = "3.0.0" +version = "3.1.0" source = { editable = "." } dependencies = [ { name = "alembic" }, From 92dd7560af688a09568392743aff2e276994c5d6 Mon Sep 17 00:00:00 2001 From: Markus Neusinger <2921697+MarkusNeusinger@users.noreply.github.com> Date: Wed, 19 Aug 2026 00:07:19 +0200 Subject: [PATCH 2/2] docs(changelog): fold in the entries merged after the release cut Merging main brought the five entries that landed after 3.1.0 was cut (#10476, #10477, #10479, #10482, #10483) into the version section, where they belong -- the image work and the sitemap fix are part of this release. Dates the release to the day it is published. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4cb43a06e..c02a7469fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ aggregate instead: an italic *Catalog* line at the end of the version section an ## [Unreleased] -## [3.1.0] — 2026-08-18 — Legible to machines +## [3.1.0] — 2026-08-19 — Legible to machines anyplot 3.1 makes the catalogue readable by machines. An assistant asked about a plot can now find it, open one library's page, read the runnable source, fetch the rendered image and cite the URL —