v2.3.0 — 10 new plot types & end-to-end auto-merge
✨ New
/mappage — force-directed spec map clustered by tag similarity, with a teaser on the landing page (#5647, #5649, #5665).- OG images redesigned in the any.plot() visual identity — branded cards with light/dark variants (#5659).
- Mobile debug: on-device console + richer ErrorBoundary so crashes on phones are inspectable (#5808).
- Legal page gained an avatar in the operator block (#5726).
- 10 new plot types × 9 libraries:
area-stacked,bar-horizontal,bland-altman-basic,count-basic,ice-basic,radar-multi,scatter-embedding,scatter-regression-polynomial,shap-waterfall,spiral-timeseries. - Coverage filled:
horizon-basicgot seaborn (#5851).
🛠️ Fixes
- iOS Safari: polyfilled
requestIdleCallbackso the site loads on iOS (#5816). - POTD: GitHub source link now includes the language segment (#5663); letterbox strips around the preview image removed (#5943).
- Frontend lint: 32 → 0 errors. Five
react-hooks/set-state-in-effectviolations refactored to React 19's "adjust state on prop change" pattern;Math.randompurity issue extracted to a module-level helper (#5818). - Analytics safety: fire-and-forget tasks in
api/analytics.pycould be GC'd mid-flight; now held in a module-level set (#5727).
🏷️ Tag-vocabulary policy
The auto-polish step was stripping valid niche tags (bioinformatics, confidence-interval, ohlc, …) because it treated the recommended-values tables as canonical for every dimension. Vocabulary policy is now asymmetric (#5856, #5859):
plot_typeis canonical — table is authoritative; new types added via PR.data_type/domain/featuresare advisory — any well-formed, recognized data-viz term is valid; polish only moves misclassified tags or canonicalizes synonyms.
Tables expanded with legitimate tags surfaced by an audit of all 327 specs.
🔧 Pipeline
- End-to-end auto-merge: polish PRs and impl PRs squash-merge themselves once green.
gh pr merge --autois set on creation (#5955);auto-update-pr-branches.ymlkeeps behind branches in sync after every push tomain(#5957, #5958). - Autonomous spec polish + cross-library similarity audit in daily-regen pre-flight (#5714).
- Daily-regen defaults to Haiku, gained
spec_idandmodelinputs (#5706). - Resumable regen — split into single-step invocations for local-model workflows (#5650).
- Transient retry hardened across impl-generate / impl-review (#5819, #5725, #5724).
evaluate-plot.pyswitched to the canonical 6-category rubric and bumpedclaude_modeldefault toclaude-sonnet-4-6(#5818).
🗂️ Repo
- Plot implementations moved under
plots/{spec}/implementations/python/{library}.py(metadata undermetadata/python/) to make room for other languages (#5648). - 64
Optional[X]→X | Nonemodernizations via UP007/UP045 (#5727).
📚 Docs
- Library expansion roadmap (#5951).
- Plausible: FCP/TTFB Web-Vitals events documented (#5818).
/seo-proxy/maphandler so bots get a real<title>for the network map (#5818).
Full Changelog: v2.2.0...v2.3.0