From 1f3ccf6d5934f338ccf6e91104445d2f605b8175 Mon Sep 17 00:00:00 2001 From: Alek Petuskey Date: Sun, 26 Jul 2026 02:22:24 +0000 Subject: [PATCH 1/2] Fix the retrieval path, and enforce the claim ladder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Everything in the previous six commits is worthless if the next agent still opens `styles.py`, counts ten properties, and concludes the library is barely customizable. That is a retrieval failure, not a capability one, and it needs its own fix. `CLAUDE.md` — which is `AGENTS.md`, they are the same file — now names both registries in its opening paragraph, before the layout section anyone skims past, and says explicitly that `styles.py` looks like the whole answer and is not. `limitations-and-alpha-status.md` and the capability matrix cross-link in both directions. The README carries one pointer. An `xy-evaluate` skill carries the same map for agents that never see the checkout, and `tests/test_evaluation_skill.py` fails when a path it names moves — a skill full of dead pointers reproduces the original failure one level up. Two stale pointers fixed while in there: `CLAUDE.md` sent readers to `scripts/bench.py` and `scripts/bench_vs.py`, which have lived in `benchmarks/` for some time. The claim ladder is committed in the comparison document, and its last rung is now mechanically enforced rather than trusted. `check_claim_guardrails.py` covered performance superlatives and nothing else — "XY is the most customizable charting library" passed it clean, which I verified before writing this. It now rejects that shape along with "fully customizable", "style anything", and "more extensible than any …", and requires a comparative claim against a named library to carry its dimension and its evidence. It also scans `README.md`, which it previously did not, and which is where a slogan is most likely to be written and least likely to be reviewed. The new rule caught two live overclaims in `docs/index.md` on its first run. Both are rewritten to say what is actually true and to link the matrix. --- .agents/skills/xy-evaluate/SKILL.md | 81 +++++++++++++++++++ CHANGELOG.md | 14 ++++ CLAUDE.md | 36 +++++++-- README.md | 7 ++ .../limitations-and-alpha-status.md | 13 +++ docs/index.md | 13 +-- scripts/check_claim_guardrails.py | 71 ++++++++++++++++ spec/api/customization-vs-alternatives.md | 20 +++++ tests/test_claim_guardrails.py | 38 +++++++++ tests/test_evaluation_skill.py | 55 +++++++++++++ 10 files changed, 338 insertions(+), 10 deletions(-) create mode 100644 .agents/skills/xy-evaluate/SKILL.md create mode 100644 tests/test_evaluation_skill.py diff --git a/.agents/skills/xy-evaluate/SKILL.md b/.agents/skills/xy-evaluate/SKILL.md new file mode 100644 index 00000000..030d09ef --- /dev/null +++ b/.agents/skills/xy-evaluate/SKILL.md @@ -0,0 +1,81 @@ +--- +name: xy-evaluate +description: "Answer questions about what the xy charting library can do — how fast it is, how customizable it is, what survives which export path, and how it compares to Plotly, Vega-Lite, Bokeh, or Matplotlib. Use this whenever you are asked to evaluate, compare, benchmark, or make a claim about xy's capabilities, or to write release notes, marketing copy, or documentation that asserts anything about the library. Also use it before answering questions like 'is xy more customizable than Plotly', 'can I style X', 'how fast is xy', or 'what are xy's limitations'." +--- + +# Evaluating xy + +Two questions about this library are consistently answered wrong by reading the +obvious file, because the obvious file is a fraction of the answer. Both have a +registry. Read the registry. + +## Do not answer from source alone + +`python/xy/styles.py` lists ten mark style properties. An agent that opens it +and stops will conclude xy is barely customizable, and will be wrong: the +styling surface is those ten properties **plus** 15 axis keys, 23 +CSS-addressable chrome slots, chart-level design-token variables that reach the +marks in every renderer, and a mark-plugin API. Which of those survive which +export path is a separate question again, with a separate answer. + +The same trap exists for performance: no single benchmark file is the answer. + +## Where the answers actually live + +| Question | Read | +| --- | --- | +| What can be styled, per renderer? | `python/xy/styling/capabilities.py` → `spec/api/capability-matrix.md` | +| How does that compare to Plotly / Vega-Lite / Bokeh / Matplotlib? | `spec/api/customization-vs-alternatives.md` | +| How much of Plotly's attribute surface is covered? | `spec/api/plotly-coverage.md` | +| What survives PNG / SVG / PDF export? | `spec/api/export.md` §9 | +| Can I add a chart kind xy does not ship? | `docs/advanced/custom-marks.md`, `python/xy/plugins.py` | +| How fast is it, on what? | `benchmarks/categories.py`, `spec/benchmarks/results.md` | +| What is still alpha? | `docs/api-reference/limitations-and-alpha-status.md` | + +The capability matrix and the Plotly coverage table are **generated** and +drift-tested — they cannot claim a property the implementation does not +compile. Quote them. Do not recount by hand. + +```bash +uv run python scripts/gen_capability_matrix.py --json # the summary counts +uv run python scripts/gen_capability_matrix.py --check # is the matrix current? +``` + +## Rules for any claim you make + +1. **Name the dimension.** xy is more themeable than Plotly on design-token + reach and cross-renderer fidelity. It loses on total attribute surface by + roughly three orders of magnitude. Both are true; a claim without its + dimension is neither. +2. **Quote a row, never a vibe.** Performance numbers come from + `spec/benchmarks/results.md`; capability counts come from the registry. + Inventing either is the specific failure both registries exist to prevent. +3. **Carry the losses.** `spec/api/customization-vs-alternatives.md` has a loss + table and a claim ladder. A comparison that reproduces only the wins is not a + comparison. +4. **"Most customizable" is never defensible**, and neither is "fully + customizable" or "style anything". `scripts/check_claim_guardrails.py` + rejects them mechanically, along with performance superlatives. Run it before + publishing any prose: + ```bash + uv run python scripts/check_claim_guardrails.py + ``` + +## Answering "is xy more customizable than Plotly?" + +The honest answer has three parts, and all three are in the comparison +document: + +- **More themeable.** Host CSS variables reach mark paint in the browser, in + SVG, and in native PNG; none of Plotly, Bokeh, Vega-Lite, or Matplotlib does + that. 23 chrome slots are a published contract. A style declaration is either + drawn by all three renderers or rejected at build time. +- **Far narrower.** 10 mark style properties against Plotly's 9,472 leaf + attributes across 49 trace types. Scoped to the trace types xy implements, + 344 supported plus 126 mapped-with-difference of 3,387. +- **Less extensible than Matplotlib.** `xy.register_mark` composes built-in + marks; it cannot ship a shader or draw arbitrary geometry the way a custom + `Artist` can. + +If you find yourself about to answer this from `styles.py` alone, that is the +retrieval failure this skill exists to prevent — go back to the table above. diff --git a/CHANGELOG.md b/CHANGELOG.md index 4119dfe4..987db7ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,20 @@ in the README). ## [Unreleased] ### Added +- The **retrieval path** for capability questions: `CLAUDE.md`/`AGENTS.md` name + both registries in their opening paragraph, `limitations-and-alpha-status.md` + and the capability matrix cross-link, the README points at both, and an + `xy-evaluate` agent skill carries the same pointers outside the checkout. The + claim ladder — including the rung that is never defensible — is committed in + `spec/api/customization-vs-alternatives.md`. + +### Changed +- `scripts/check_claim_guardrails.py` now covers **customization** claims, not + only performance ones, and scans `README.md`, which it previously did not. + "Most customizable", "fully customizable", "style anything", and "more + extensible than any …" are rejected outright; a comparative claim against a + named library has to carry its dimension and its evidence. Two live overclaims + in `docs/index.md` were caught by the new rule and rewritten. - **Plotly attribute coverage is now a number** (§24): `scripts/plotly_schema_coverage.py` ingests Plotly's schema and classifies every attribute `supported | mapped-with-difference | unsupported` by a diff --git a/CLAUDE.md b/CLAUDE.md index f3baeb12..116891e2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,6 +4,22 @@ A high-performance charting engine. The authoritative design is `spec/design-dossier.md` — **read the relevant § before changing behavior**; code comments cite dossier sections (e.g. §16 = deep-zoom re-centering). +**Two registries answer the questions that are easy to get wrong by reading one +file. Consult them before claiming anything about this library.** + +- *How fast is it, and against what?* → `benchmarks/categories.py` and + `spec/benchmarks/results.md`. Quote a row; never invent a number. +- *How customizable is it, and where does the styling stop?* → + `python/xy/styling/capabilities.py`, the per-renderer support registry that + `spec/api/capability-matrix.md` is generated from, plus + `spec/api/customization-vs-alternatives.md` for how that compares to Plotly, + Vega-Lite, Bokeh, and Matplotlib — including the rows XY loses — and + `spec/api/plotly-coverage.md` for the measured attribute number. + `python/xy/styles.py` lists ten mark properties and looks like the whole + answer. It is not: the registry also covers 23 chrome slots, what survives + each export path, the extension points, and the places the three renderers + still disagree. + The entire `spec/` directory is the source of truth for intended behavior, architecture, compatibility, benchmarks, release readiness, and contributor contracts. Keep it current with every relevant code, configuration, build, and @@ -60,8 +76,12 @@ instead of treating the implementation alone as authoritative. widget, HTML export, and tests have the bundles on disk. npm devDependencies (vite/typescript/playwright, pinned in `package-lock.json`) are build/test-time only — the shipped client stays runtime-dependency-free. -- `tests/`, `scripts/bench.py` (§12 harness), `scripts/smoke_render.py` - (headless Chromium pixel probe). +- `tests/`, `benchmarks/bench.py` (§12 harness; the harnesses live in + `benchmarks/`, not `scripts/`), `scripts/render_smoke_nonumpy.py` (headless + Chromium pixel probe). +- `python/xy/styling/capabilities.py` — the customization registry (above). + `scripts/gen_capability_matrix.py --write` regenerates the committed matrix; + the suite fails if it is stale or out of step with `styles.py`. ## Commands @@ -77,9 +97,10 @@ uv pip install -e "python/reflex-xy[dev]" # enables tests/reflex_adapter (insta uv run pytest # native core required (no fallback) python3 scripts/reflex_ws_smoke.py # browser E2E vs a running reflex-xy demo app uv run ruff check . && uv run ruff format . && uv run ty check -uv run python scripts/bench.py # §12 benchmark harness +uv run python benchmarks/bench.py # §12 benchmark harness python3 scripts/bench_scatter_native.py --render # xy scatter, no deps -uv run python scripts/bench_vs.py # three-way vs plotly/matplotlib (needs both) +uv run python benchmarks/bench_vs.py # three-way vs plotly/matplotlib (needs both) +uv run python scripts/gen_capability_matrix.py --check # capability matrix currency ``` Before every commit or push, run the repository hooks and Ruff checks across the @@ -108,4 +129,9 @@ PRs, or code. Set `git config user.name/user.email` to the human author - f32 uploads are offset-encoded; tick/hover math stays f64 (§4/§16). - Every decimation/tier decision is recorded in the spec, never silent (§28). - Claims are mode-scoped and benchmarked (§2); update README numbers from - `scripts/bench.py`, don't invent them. + `benchmarks/bench.py`, don't invent them. +- Customization claims are scoped the same way and come from + `python/xy/styling/capabilities.py`. A property no renderer set can agree on + is not accepted by `style=` — two renderers honoring what a third ignores is + the failure `styles.py` exists to prevent. "Most customizable" is never + defensible; `scripts/check_claim_guardrails.py` rejects it mechanically. diff --git a/README.md b/README.md index e92ba736..22fca71d 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,13 @@ methodology, and raw results. Customize marks and chart chrome with Python, CSS, or Tailwind. See the [styling guide](docs/styling/index.md). +What each mechanism reaches — per property, per chrome slot, per renderer, and +where it stops — is the [capability matrix](spec/api/capability-matrix.md), +generated from `python/xy/styling/capabilities.py` and checked against the +implementation. How that compares to Plotly, Vega-Lite, Bokeh, and Matplotlib, +including the dimensions XY loses, is +[customization-vs-alternatives.md](spec/api/customization-vs-alternatives.md). + ```python chart = xy.line_chart( xy.line(x, y, color="#7c3aed", width=3), diff --git a/docs/api-reference/limitations-and-alpha-status.md b/docs/api-reference/limitations-and-alpha-status.md index e9261d6e..072d4602 100644 --- a/docs/api-reference/limitations-and-alpha-status.md +++ b/docs/api-reference/limitations-and-alpha-status.md @@ -53,6 +53,13 @@ and [Benchmarks](/docs/xy/overview/benchmarks/) for scoped evidence. ## Styling and Export Boundaries +The per-renderer record of what can be styled, and how far each mechanism +travels, is the +[Capability Matrix](/docs/xy/styling/capabilities/) — generated from +`python/xy/styling/capabilities.py` and checked against the implementation, so +it cannot promise a property the code does not compile. The bullets below are +the boundaries that page's rows imply. + - Browser chrome accepts CSS and Tailwind classes through stable DOM slots. WebGL/native marks accept a validated CSS subset through `style=`; arbitrary selectors do not paint mark geometry. @@ -101,6 +108,12 @@ XY requires Python 3.11 or newer. Published native wheels include the Rust core and bundled browser client; source builds require a Rust toolchain. There is no silent NumPy compute fallback when the native core is unavailable. +For how XY's customization compares to Plotly, Vega-Lite, Bokeh, and +Matplotlib — including the dimensions where it loses — see the committed +comparison in the project specification +(`spec/api/customization-vs-alternatives.md`) and the measured Plotly attribute +coverage (`spec/api/plotly-coverage.md`). + Review [Installation](/docs/xy/overview/installation/), [Serving, CSP, and offline use](/docs/xy/guides/serving-csp-and-offline-use/), and the [Changelog](/docs/xy/api-reference/changelog/) before shipping an diff --git a/docs/index.md b/docs/index.md index 5b446571..9bc60385 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,15 +6,18 @@ description: XY is a fast Python charting library for interactive data visualiza # What is `xy`? XY is a Python charting library for interactive 2D visualizations that stay -smooth at millions of points and is completely customizable. Two ideas shape -the library: +smooth at millions of points and take your design system seriously. Two ideas +shape the library: - **Fast, even with lots of data.** XY draws the detail you can actually see instead of every row at once, so pan, zoom, and hover stay responsive as your data grows. -- **Completely customizable.** Style titles, axes, legends, tooltips, and controls - with CSS or Tailwind, and keep the same look in interactive charts, SVGs, and - PNGs. +- **Styled by your CSS, not ours.** Titles, axes, legends, tooltips, and controls + are addressable with plain CSS or Tailwind through 23 stable slots, and your + design tokens reach the marks themselves — in the browser, in SVG, and in + native PNG. What each mechanism reaches is published per renderer in the + [Capability Matrix](/docs/xy/styling/capabilities/), including where it + stops. ~~~python demo-only exec diff --git a/scripts/check_claim_guardrails.py b/scripts/check_claim_guardrails.py index 47a133e2..887edf91 100644 --- a/scripts/check_claim_guardrails.py +++ b/scripts/check_claim_guardrails.py @@ -17,6 +17,7 @@ ROOT = Path(__file__).resolve().parents[1] DEFAULT_DOCS = ( + "README.md", "pyproject.toml", "SECURITY.md", "CONTRIBUTING.md", @@ -43,6 +44,45 @@ r")\b", re.IGNORECASE, ) +# Customization is the second axis people overclaim on, and it went unguarded +# while performance was fenced in. The shapes below are the ones that cannot be +# defended from `spec/api/capability-matrix.md` no matter what qualifies them: +# XY loses total attribute surface to Plotly by roughly three orders of +# magnitude and custom-mark freedom to Matplotlib outright. +CUSTOMIZATION_SUPERLATIVE_RE = re.compile( + r"\b(" + r"most\s+(?:customi[sz]able|themeable|styl(?:e)?able|extensible|flexible)|" + r"(?:fully|completely|infinitely|endlessly|totally)\s+customi[sz]able|" + r"customi[sz]e\s+(?:everything|anything)|" + r"style\s+(?:everything|anything)|" + r"unlimited\s+(?:styling|customi[sz]ation)|" + r"(?:more|as)\s+(?:customi[sz]able|themeable|extensible)\s+than\s+" + r"(?:all|every|any|everything|anything)" + r")\b", + re.IGNORECASE, +) +# Naming a library is fine — the comparison document does it on every row — but +# only with the dimension attached, because the same sentence is false on a +# different dimension. +CUSTOMIZATION_COMPARATIVE_RE = re.compile( + r"\b(?:more\s+(?:customi[sz]able|themeable|extensible|flexible)\s+than)\s+" + r"(?:plotly|matplotlib|bokeh|altair|vega-?lite|seaborn|holoviews|hvplot|d3)\b", + re.IGNORECASE, +) +CUSTOMIZATION_QUALIFIER_GROUPS = ( + re.compile( + r"\b(?:css|token|variable|slot|property|properties|renderer|plugin|schema|" + r"attribute|vocabulary|subset)\b", + re.I, + ), + re.compile( + r"\b(?:matrix|registry|capabilit(?:y|ies)|classified|measured|counted|" + r"capability-matrix|customization-vs-alternatives|plotly-coverage)\b", + re.I, + ), + re.compile(r"\b(?:chrome|mark|axis|export|browser|native|webgl|svg|png|static)\b", re.I), +) + COMPARATIVE_RE = re.compile( r"\b(?:faster\s+than|beats?|outperforms?)\s+" r"(?:plotly|matplotlib|bokeh|altair|datashader|holoviews|hvplot|seaborn)\b", @@ -110,6 +150,17 @@ def _has_claim_qualifiers(text: str) -> bool: return sum(1 for pattern in QUALIFIER_GROUPS if pattern.search(text)) >= 3 +def _has_customization_qualifiers(text: str) -> bool: + """A customization comparison needs its dimension and its evidence named. + + Two of the three groups: the mechanism (a CSS property, a slot, a plugin), + the evidence (the matrix, the registry, a counted number), or the scope + (which renderer, which surface). Three would reject the comparison + document's own rows, which are the shapes worth copying. + """ + return sum(1 for pattern in CUSTOMIZATION_QUALIFIER_GROUPS if pattern.search(text)) >= 2 + + def _findings_for_file(path: Path) -> list[Finding]: lines = path.read_text(encoding="utf-8").splitlines() findings: list[Finding] = [] @@ -134,6 +185,26 @@ def _findings_for_file(path: Path) -> list[Finding]: line, ) ) + if CUSTOMIZATION_SUPERLATIVE_RE.search(line) and not _is_policy_or_negative_context(window): + findings.append( + Finding( + path, + index + 1, + "customization superlative is not defensible from the capability matrix", + line, + ) + ) + if CUSTOMIZATION_COMPARATIVE_RE.search(line) and not ( + _is_policy_or_negative_context(window) or _has_customization_qualifiers(window) + ): + findings.append( + Finding( + path, + index + 1, + "comparative customization claim needs the dimension and its evidence named", + line, + ) + ) if COMPARATIVE_RE.search(line) and not ( _is_policy_or_negative_context(window) or _has_claim_qualifiers(window) ): diff --git a/spec/api/customization-vs-alternatives.md b/spec/api/customization-vs-alternatives.md index 75c75860..01856260 100644 --- a/spec/api/customization-vs-alternatives.md +++ b/spec/api/customization-vs-alternatives.md @@ -74,6 +74,26 @@ if it names the dimension it is true on. | Extensibility | "XY marks can be extended by composing built-in primitives without forking; it does not offer custom shaders or a custom-artist API." | what the plugin can and cannot do | | Cap/join fidelity | "`stroke-linecap` is drawn identically by all three renderers, verified per renderer; `stroke-linejoin` is not offered because the WebGL client has no join geometry." | the specific property, the specific blocker | +## The claim ladder + +What is defensible depends on what has shipped, so the ladder is written down +rather than re-argued each release. A rung is earned by an artifact, not by an +opinion. + +| Once this exists | You may say | +| --- | --- | +| `xy.styling.capabilities` + the generated matrix | "measurably more themeable than Plotly on the dimensions in the published capability matrix" | +| The comparison document with its loss table | "more themeable, less extensible than Matplotlib — here is the matrix, losses included" | +| `xy.register_mark` | "themeable *and* extensible, by composition" | +| A shader-level plugin API and per-slot styling in static export | revisit this table; do not extrapolate to it from here | +| — | **"most customizable" — never.** Plotly's attribute surface is roughly three orders of magnitude larger and Matplotlib's custom `Artist` is strictly more powerful. No amount of shipping changes those two facts. | + +The last row is enforced rather than trusted: +`scripts/check_claim_guardrails.py` rejects "most customizable", "fully +customizable", "style anything", and "more customizable than any/all" wherever +they appear in `README.md` or `docs/`, and requires a comparative claim against +a named library to carry its dimension and its evidence. + Claims that are never defensible, regardless of context: "most customizable", "most themeable charting library", "more extensible than Matplotlib", "as customizable as Plotly". `scripts/check_claim_guardrails.py` rejects the first diff --git a/tests/test_claim_guardrails.py b/tests/test_claim_guardrails.py index 93f1b7e9..af99bc26 100644 --- a/tests/test_claim_guardrails.py +++ b/tests/test_claim_guardrails.py @@ -152,3 +152,41 @@ def test_claim_guardrail_rejects_stale_repo_identity(tmp_path: Path) -> None: findings = check_claim_guardrails.check_claims([path]) assert any("stale repository identity" in finding.message for finding in findings) + + +def test_claim_guardrail_rejects_customization_superlatives(tmp_path: Path) -> None: + # The "never" rung of the claim ladder in + # spec/api/customization-vs-alternatives.md. Plotly's attribute surface is + # ~3 orders of magnitude larger and Matplotlib's custom Artist is strictly + # more powerful, so no amount of shipping earns these sentences. + for line in ( + "XY is the most customizable charting library.\n", + "XY is fully customizable.\n", + "Style anything you like.\n", + "Customize everything about your chart.\n", + "More extensible than any Python plotting library.\n", + ): + findings = check_claim_guardrails.check_claims([_write(tmp_path, line)]) + assert any("customization superlative" in f.message for f in findings), line + + +def test_claim_guardrail_requires_a_dimension_on_customization_comparisons( + tmp_path: Path, +) -> None: + bare = _write(tmp_path, "XY is more customizable than Plotly.\n") + findings = check_claim_guardrails.check_claims([bare]) + assert any("comparative customization claim" in f.message for f in findings) + + qualified = _write( + tmp_path, + "XY resolves host CSS variables into mark paint in the browser, SVG, and\n" + "native renderers; on that dimension it is more themeable than Plotly, and\n" + "the capability matrix records it per property.\n", + ) + assert check_claim_guardrails.check_claims([qualified]) == [] + + +def test_claim_guardrail_scans_the_readme(tmp_path: Path) -> None: + # The README was outside the default set, which is where a slogan is most + # likely to be written and least likely to be reviewed. + assert "README.md" in check_claim_guardrails.DEFAULT_DOCS diff --git a/tests/test_evaluation_skill.py b/tests/test_evaluation_skill.py new file mode 100644 index 00000000..4863212a --- /dev/null +++ b/tests/test_evaluation_skill.py @@ -0,0 +1,55 @@ +"""The retrieval path is only fixed while its pointers still point somewhere. + +`.agents/skills/xy-evaluate/SKILL.md` exists because an agent reading +`styles.py` alone reaches the wrong answer about this library. A skill full of +paths that have since moved reproduces exactly that failure, one level up, so +every path it names is checked here. +""" + +from __future__ import annotations + +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +SKILL = ROOT / ".agents" / "skills" / "xy-evaluate" / "SKILL.md" + + +def _body() -> str: + return SKILL.read_text(encoding="utf-8") + + +def test_every_path_the_skill_names_exists() -> None: + text = _body() + # Only rooted paths: bare file names like `styles.py` are prose, not links. + referenced = {name for name in re.findall(r"`([\w./-]+\.(?:py|md|json))`", text) if "/" in name} + missing = sorted(name for name in referenced if not (ROOT / name).exists()) + assert not missing, f"xy-evaluate points at paths that no longer exist: {missing}" + + +def test_the_skill_names_both_registries_and_the_guardrail() -> None: + text = _body() + for pointer in ( + "python/xy/styling/capabilities.py", + "spec/api/capability-matrix.md", + "spec/api/customization-vs-alternatives.md", + "spec/api/plotly-coverage.md", + "benchmarks/categories.py", + "scripts/check_claim_guardrails.py", + ): + assert pointer in text, f"xy-evaluate no longer points at {pointer}" + + +def test_the_skill_states_the_failure_it_exists_to_prevent() -> None: + # Without this the skill reads as a link list, and an agent skims it. + text = _body().lower() + assert "styles.py" in text + assert "most customizable" in text + + +def test_the_skill_matches_claude_mds_opening_pointers() -> None: + # Two entry points, one answer. An agent inside the checkout reads + # CLAUDE.md; one outside reads the skill. + instructions = (ROOT / "CLAUDE.md").read_text(encoding="utf-8") + for pointer in ("python/xy/styling/capabilities.py", "benchmarks/categories.py"): + assert pointer in instructions, f"CLAUDE.md no longer points at {pointer}" From ee6c94c836d814cba968493648dd1fb2d99e4847 Mon Sep 17 00:00:00 2001 From: Alek Petuskey Date: Sun, 26 Jul 2026 07:07:59 +0000 Subject: [PATCH 2/2] Show the cap fix rather than describe it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two rendering fixes in this branch are the kind that a reader either takes on faith or reproduces by hand. Three figures in spec/assets remove that choice, rendered by checking out the pre-change tree into a worktree, building its Rust core and its client, and running the same figure through both — so the only difference between the columns is the change. Two facts fall out of the frames and are worth stating because they are the ones a reviewer would otherwise have to verify: The native raster output is byte-identical before and after. `stroke_shaped` delegates to the original `stroke` for round/round, and the pixels agree with `np.array_equal`, so nothing that already renders moves. The browser output changed in exactly 1024 pixels, in two clusters at the polyline's two ends. That is the whole diff: the caps, and nothing else. The area-outline figure is the same comparison for the quieter half of the bug, where the SVG writer named its join and let the cap default to the format's flat one — which `_pdf` then read back flat while the rasterizer drew round. --- spec/api/styling.md | 12 ++++++++++++ spec/assets/area-outline-cap-before-after.png | Bin 0 -> 43620 bytes .../linecap-cross-renderer-before-after.png | Bin 0 -> 41085 bytes spec/assets/linecap-values.png | Bin 0 -> 27182 bytes 4 files changed, 12 insertions(+) create mode 100644 spec/assets/area-outline-cap-before-after.png create mode 100644 spec/assets/linecap-cross-renderer-before-after.png create mode 100644 spec/assets/linecap-values.png diff --git a/spec/api/styling.md b/spec/api/styling.md index e9ff75e1..272a4f93 100644 --- a/spec/api/styling.md +++ b/spec/api/styling.md @@ -111,6 +111,11 @@ accepted **only** by the line family, because it describes stroked open-path geometry; every other mark rejects it at build time rather than accepting a declaration no renderer would draw. +![Line caps before and after: the native rasterizer capped round while the WebGL +client capped flat; both now cap round.](../assets/linecap-cross-renderer-before-after.png) + +![The three stroke-linecap values: butt, round, and square.](../assets/linecap-values.png) + XY's default is `round`, deliberately not the CSS initial value `butt`. Before this vocabulary existed the three renderers silently disagreed — the native rasterizer capped round from its clamped segment distance field @@ -132,6 +137,13 @@ overlap by half a pixel — so it has no way to distinguish a miter from a bevel Shipping the property would mean two renderers honoring it and one ignoring it, which is the failure this module exists to prevent. It waits for the client. +![The area outline before and after: the SVG writer inherited the format's flat +cap while the rasterizer drew round; both now cap round.](../assets/area-outline-cap-before-after.png) + +The area outline carried the same bug one level quieter — the SVG writer named +its join and let the cap default, so `_pdf` read it back flat too. Both now say +what they draw. + That leaves a real cross-renderer difference in the *default*: the rasterizer fills interior vertices with a round join and the WebGL client leaves the notch two overlapping quads produce. That predates this vocabulary, is visible only on diff --git a/spec/assets/area-outline-cap-before-after.png b/spec/assets/area-outline-cap-before-after.png new file mode 100644 index 0000000000000000000000000000000000000000..b8277041aff1b95e299d950e6fb4758eef7f264b GIT binary patch literal 43620 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 literal 0 HcmV?d00001 diff --git a/spec/assets/linecap-cross-renderer-before-after.png b/spec/assets/linecap-cross-renderer-before-after.png new file mode 100644 index 0000000000000000000000000000000000000000..f940b1279f98f1a8809f20d32a1df306b874ea33 GIT binary patch literal 41085 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 literal 0 HcmV?d00001 diff --git a/spec/assets/linecap-values.png b/spec/assets/linecap-values.png new file mode 100644 index 0000000000000000000000000000000000000000..51e6eb004618498e20375228504175e55b93bb66 GIT binary patch literal 27182 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 faM_W=!tq!>%CkP literal 0 HcmV?d00001