From 27f84cadffb04cb86b1035f9469732969d78b270 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Aug 2026 11:47:01 +0000 Subject: [PATCH 1/5] feat(muix): implement streamgraph-basic --- .../implementations/javascript/muix.tsx | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 plots/streamgraph-basic/implementations/javascript/muix.tsx diff --git a/plots/streamgraph-basic/implementations/javascript/muix.tsx b/plots/streamgraph-basic/implementations/javascript/muix.tsx new file mode 100644 index 0000000000..e0ed5dd995 --- /dev/null +++ b/plots/streamgraph-basic/implementations/javascript/muix.tsx @@ -0,0 +1,123 @@ +// anyplot.ai +// streamgraph-basic: Basic Stream Graph +// Library: muix 7.29.1 | JavaScript 22.22.3 +// License: @mui/x-charts — MIT (community). Pro/Premium are out of scope. +// Quality: pending | Created: 2026-08-05 + +import { LineChart } from "@mui/x-charts/LineChart"; +import Box from "@mui/material/Box"; +import Typography from "@mui/material/Typography"; + +const t = window.ANYPLOT_TOKENS; + +// --- Data (in-memory, deterministic) ---------------------------------------- +// Monthly listening hours (in thousands) by music genre, two years of data. + +const MONTH_NAMES = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +const MONTHS_COUNT = 24; +const months = Array.from( + { length: MONTHS_COUNT }, + (_, i) => `${MONTH_NAMES[i % 12]} ${2024 + Math.floor(i / 12)}`, +); + +// Tiny fixed-seed LCG for reproducible micro-variation (no seeded RNG in the browser) +let seed = 42; +function nextRandom() { + seed = (seed * 1103515245 + 12345) & 0x7fffffff; + return seed / 0x7fffffff; +} + +// Genre trajectories: Electronic and Hip-Hop grow steadily, Rock cools off, +// Jazz and Classical decline slowly, Pop stays roughly flat. +const genres = [ + { name: "Pop", base: 380, amp: 55, freq: 0.55, phase: 0.4, trend: 0.4 }, + { name: "Hip-Hop", base: 300, amp: 70, freq: 0.45, phase: 2.1, trend: 5.5 }, + { name: "Electronic", base: 190, amp: 60, freq: 0.65, phase: 4.0, trend: 8.5 }, + { name: "Rock", base: 260, amp: 45, freq: 0.35, phase: 1.2, trend: -3.5 }, + { name: "Jazz", base: 140, amp: 25, freq: 0.5, phase: 3.3, trend: -2.0 }, + { name: "Classical", base: 100, amp: 18, freq: 0.4, phase: 5.1, trend: -1.2 }, +]; + +const genreValues = genres.map((g) => + Array.from({ length: MONTHS_COUNT }, (_, i) => { + const wave = Math.sin(i * g.freq * 0.5 + g.phase) * g.amp; + const noise = (nextRandom() - 0.5) * g.amp * 0.3; + return Math.round(Math.max(30, g.base + g.trend * i + wave + noise)); + }), +); + +const series = genres.map((g, idx) => ({ + id: g.name, + label: g.name, + data: genreValues[idx], + area: true, + stack: "listening", + stackOrder: "insideOut" as const, + stackOffset: "wiggle" as const, + curve: "catmullRom" as const, + showMark: false, + color: t.palette[idx], +})); + +const TITLE = "Genre Streaming Hours · streamgraph-basic · javascript · muix · anyplot.ai"; +const TITLE_FONT_SIZE = Math.max(15, Math.round(22 * Math.min(1, 67 / TITLE.length))); +const TITLE_HEIGHT = 60; + +// --- Chart (default-exported component — the harness mounts it) ------------ +export default function Chart() { + const { width, height } = window.ANYPLOT_SIZE; + + return ( + + + {TITLE} + + index % 3 === 0, + disableTicks: true, + }, + ]} + leftAxis={null} + grid={{ horizontal: false, vertical: false }} + margin={{ left: 24, right: 24, top: 44, bottom: 56 }} + slotProps={{ + legend: { + position: { vertical: "top", horizontal: "middle" }, + direction: "row", + padding: { top: 0, bottom: 12 }, + }, + }} + sx={{ + "& .MuiChartsAxis-tickLabel": { fontSize: "14px", fill: t.inkSoft }, + "& .MuiChartsLegend-label": { fontSize: "14px" }, + "& .MuiAreaElement-root": { fillOpacity: 0.92 }, + "& .MuiLineElement-root": { strokeWidth: 1.5 }, + }} + /> + + ); +} From d995a9dd3deea6e1e4bcc19957e088a48c8baa98 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Aug 2026 11:47:11 +0000 Subject: [PATCH 2/5] chore(muix): add metadata for streamgraph-basic --- .../metadata/javascript/muix.yaml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 plots/streamgraph-basic/metadata/javascript/muix.yaml diff --git a/plots/streamgraph-basic/metadata/javascript/muix.yaml b/plots/streamgraph-basic/metadata/javascript/muix.yaml new file mode 100644 index 0000000000..ac48d7794c --- /dev/null +++ b/plots/streamgraph-basic/metadata/javascript/muix.yaml @@ -0,0 +1,21 @@ +# Per-library metadata for muix implementation of streamgraph-basic +# Auto-generated by impl-generate.yml + +library: muix +language: javascript +specification_id: streamgraph-basic +created: '2026-08-05T11:47:11Z' +updated: '2026-08-05T11:47:11Z' +generated_by: claude-sonnet +workflow_run: 31002324488 +issue: 856 +language_version: 22.23.1 +library_version: 7.29.1 +preview_url_light: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-light.png +preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-dark.png +preview_html_light: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-light.html +preview_html_dark: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-dark.html +quality_score: null +review: + strengths: [] + weaknesses: [] From dc1bbf47ba49ce45487124b64ec4621562b8b8ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Aug 2026 21:38:42 +0000 Subject: [PATCH 3/5] chore(muix): update quality score 0 and review feedback for streamgraph-basic --- .../implementations/javascript/muix.tsx | 5 +- .../metadata/javascript/muix.yaml | 261 +++++++++++++++++- 2 files changed, 256 insertions(+), 10 deletions(-) diff --git a/plots/streamgraph-basic/implementations/javascript/muix.tsx b/plots/streamgraph-basic/implementations/javascript/muix.tsx index e0ed5dd995..434803b774 100644 --- a/plots/streamgraph-basic/implementations/javascript/muix.tsx +++ b/plots/streamgraph-basic/implementations/javascript/muix.tsx @@ -1,8 +1,7 @@ // anyplot.ai // streamgraph-basic: Basic Stream Graph -// Library: muix 7.29.1 | JavaScript 22.22.3 -// License: @mui/x-charts — MIT (community). Pro/Premium are out of scope. -// Quality: pending | Created: 2026-08-05 +// Library: muix 7.29.1 | JavaScript 22.23.1 +// Quality: 0/100 | Created: 2026-08-05 import { LineChart } from "@mui/x-charts/LineChart"; import Box from "@mui/material/Box"; diff --git a/plots/streamgraph-basic/metadata/javascript/muix.yaml b/plots/streamgraph-basic/metadata/javascript/muix.yaml index ac48d7794c..6389ac68e5 100644 --- a/plots/streamgraph-basic/metadata/javascript/muix.yaml +++ b/plots/streamgraph-basic/metadata/javascript/muix.yaml @@ -1,11 +1,8 @@ -# Per-library metadata for muix implementation of streamgraph-basic -# Auto-generated by impl-generate.yml - library: muix language: javascript specification_id: streamgraph-basic created: '2026-08-05T11:47:11Z' -updated: '2026-08-05T11:47:11Z' +updated: '2026-08-05T21:38:42Z' generated_by: claude-sonnet workflow_run: 31002324488 issue: 856 @@ -15,7 +12,257 @@ preview_url_light: https://storage.googleapis.com/anyplot-images/plots/streamgra preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-dark.png preview_html_light: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-light.html preview_html_dark: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-dark.html -quality_score: null +quality_score: 0 review: - strengths: [] - weaknesses: [] + strengths: + - 'Correct streamgraph technique: area+stack with stackOrder="insideOut" and stackOffset="wiggle" + is the textbook Byron/Wattenberg streamgraph algorithm, paired with catmullRom + curve interpolation for smooth flowing bands.' + - 'Imprint categorical palette applied in exact canonical order (t.palette[0..5]): + brand green first (Pop), then lavender, blue, ochre, matte red, cyan — identical + hues in light and dark renders, only chrome flips.' + - 'Deliberate, theme-appropriate chrome: y-axis and gridlines hidden (appropriate + for a streamgraph where shape/proportion is the message, not exact magnitude), + thin single x-axis baseline, decluttered tick labels via tickLabelInterval to + avoid crowding.' + - Title follows the mandated `{Descriptive Title} · {spec-id} · {language} · {library} + · anyplot.ai` format and both renders keep title/legend text fully legible against + their respective backgrounds. + weaknesses: + - 'AR-09 (auto-reject): the first x-axis tick label "Jan 2024" is clipped at the + left canvas edge in BOTH plot-light.png and plot-dark.png — pixel inspection confirms + ink-colored pixels at column x=0, and a 6x zoom crop shows the left hook/curve + of the "J" glyph is missing, not just close to the border. Root cause: xAxis uses + scaleType="point" with margin={{left: 24, ...}}, so the first point sits at x=24 + in the plot''s local coordinate space and MUI X centers the point-scale tick label + under that position — a label this wide ("Jan 2024") needs far more than 24px + of left margin to avoid its centered text starting before x=0. Fix: increase margin.left + substantially (e.g. to ~60-80px) so the first tick''s label box fits within the + canvas, or keep the small margin but suppress/adjust the very first shown label + so its centered text doesn''t overflow the left edge.' + - 'Minor, not a required fix: the spec describes a ''baseline centered symmetrically + around the x-axis'' — stackOffset="wiggle" (the standard streamgraph minimize-wiggle + algorithm) is the correct and expected choice here, but note that it does not + produce a perfectly mirror-symmetric envelope like stackOffset="silhouette" would; + both are valid readings of ''streamgraph'', no deduction taken.' + image_description: |- + Light render (plot-light.png): + Background: Warm off-white, matches #FAF8F1 target (sampled corner pixel = (250,248,241)). + Chrome: Title "Genre Streaming Hours · streamgraph-basic · javascript · muix · anyplot.ai" centered at top in dark ink, clearly legible. Horizontal legend below title with 6 color swatches (Pop, Hip-Hop, Electronic, Rock, Jazz, Classical), all labels legible. X-axis shows a single baseline with month/year tick labels (Jan 2024, Apr 2024, ... Oct 2025) at every 3rd month; y-axis is intentionally hidden. Grid lines are off. + Data: Six stacked, smoothly-curved bands using the Imprint palette in canonical order — Pop = #009E73 (brand green, first series, confirmed), Hip-Hop = lavender, Electronic = blue, Rock = ochre, Jazz = matte red, Classical = cyan. Bands are stacked with insideOut ordering and wiggle offset, giving an organic river-like silhouette that trends: Electronic/Hip-Hop growing, Rock/Jazz/Classical shrinking, Pop roughly flat — consistent with the code's programmed trends. + Legibility verdict: FAIL — pixel-level inspection (6x zoomed crop of the bottom-left corner) shows the first x-axis tick label "Jan 2024" has its leading "J" clipped at the canvas' left edge (ink-colored pixels present at column x=0, left hook of the J missing). This is AR-09 edge clipping. All other text (title, legend, remaining tick labels) is fully readable and not clipped. + + Dark render (plot-dark.png): + Background: Warm near-black, matches #1A1A17 target. + Chrome: Same title and legend text now rendered in light ink, clearly legible against the dark surface — no dark-on-dark failures observed. Tick labels likewise readable. + Data: Colors are pixel-identical to the light render (same six Imprint hues) — only the background/text/axis-line chrome flipped, as required. Confirmed via direct comparison of swatch colors between renders. + Legibility verdict: FAIL — the same "Jan 2024" left-edge clipping reproduces identically in the dark render (confirmed via the same 6x zoomed crop); the left hook of the "J" is missing in this render too. No other legibility issues (no dark-on-dark text) were found. + criteria_checklist: + visual_quality: + score: 0 + max: 30 + items: + - id: VQ-01 + name: Text Legibility + score: 0 + max: 8 + passed: false + comment: 'AR-09 auto-reject caps score to 0: first x-axis tick label ''Jan + 2024'' clipped at left canvas edge in both themes; all other text otherwise + legible.' + - id: VQ-02 + name: No Overlap + score: 0 + max: 6 + passed: false + comment: AR-09 auto-reject caps score to 0. No overlap issues observed otherwise. + - id: VQ-03 + name: Element Visibility + score: 0 + max: 6 + passed: false + comment: AR-09 auto-reject caps score to 0. Bands, curves, and legend swatches + otherwise clearly visible. + - id: VQ-04 + name: Color Accessibility + score: 0 + max: 2 + passed: false + comment: AR-09 auto-reject caps score to 0. Six distinct Imprint hues otherwise + provide adequate contrast. + - id: VQ-05 + name: Layout & Canvas + score: 0 + max: 4 + passed: false + comment: 'AR-09 auto-reject caps score to 0: clipped tick label is the direct + Layout & Canvas defect.' + - id: VQ-06 + name: Axis Labels & Title + score: 0 + max: 2 + passed: false + comment: AR-09 auto-reject caps score to 0. Title format otherwise correct. + - id: VQ-07 + name: Palette Compliance + score: 0 + max: 2 + passed: false + comment: AR-09 auto-reject caps score to 0. Palette usage otherwise fully + canonical (t.palette[0..5] in order, correct light/dark backgrounds). + design_excellence: + score: 0 + max: 20 + items: + - id: DE-01 + name: Aesthetic Sophistication + score: 0 + max: 8 + passed: false + comment: AR-09 auto-reject caps score to 0. Otherwise a well-considered streamgraph + (hidden y-axis, insideOut ordering, wiggle offset, decluttered ticks). + - id: DE-02 + name: Visual Refinement + score: 0 + max: 6 + passed: false + comment: AR-09 auto-reject caps score to 0. Grid removed, generous whitespace + otherwise present. + - id: DE-03 + name: Data Storytelling + score: 0 + max: 6 + passed: false + comment: AR-09 auto-reject caps score to 0. insideOut ordering places dominant + genres centrally, giving a legible focal hierarchy otherwise. + spec_compliance: + score: 0 + max: 15 + items: + - id: SC-01 + name: Plot Type + score: 0 + max: 5 + passed: false + comment: AR-09 auto-reject caps score to 0. Correct streamgraph (area+stack+wiggle+insideOut+catmullRom) + otherwise. + - id: SC-02 + name: Required Features + score: 0 + max: 4 + passed: false + comment: AR-09 auto-reject caps score to 0. Smooth curves, near-centered baseline, + legend, distinct colors all otherwise present. + - id: SC-03 + name: Data Mapping + score: 0 + max: 3 + passed: false + comment: AR-09 auto-reject caps score to 0. Time on x, stacked genre values + on y, all 24 months represented otherwise. + - id: SC-04 + name: Title & Legend + score: 0 + max: 3 + passed: false + comment: AR-09 auto-reject caps score to 0. Title format and legend labels + otherwise correct. + data_quality: + score: 0 + max: 15 + items: + - id: DQ-01 + name: Feature Coverage + score: 0 + max: 6 + passed: false + comment: AR-09 auto-reject caps score to 0. 6 genres over 24 months, within + spec's 3-8 categories / 10-100 points range, with distinct growth/decline + trajectories, otherwise a good coverage. + - id: DQ-02 + name: Realistic Context + score: 0 + max: 5 + passed: false + comment: AR-09 auto-reject caps score to 0. Music genre listening hours is + plausible and neutral otherwise. + - id: DQ-03 + name: Appropriate Scale + score: 0 + max: 4 + passed: false + comment: AR-09 auto-reject caps score to 0. Values (roughly 30-500 'thousand + hours') are sensible for the domain otherwise. + code_quality: + score: 0 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 0 + max: 3 + passed: false + comment: AR-09 auto-reject caps score to 0. Flat script, one small deterministic-RNG + helper, otherwise KISS-compliant. + - id: CQ-02 + name: Reproducibility + score: 0 + max: 2 + passed: false + comment: AR-09 auto-reject caps score to 0. Fixed-seed LCG makes data fully + deterministic otherwise. + - id: CQ-03 + name: Clean Imports + score: 0 + max: 2 + passed: false + comment: AR-09 auto-reject caps score to 0. Only LineChart, Box, Typography + imported and all used. + - id: CQ-04 + name: Code Elegance + score: 0 + max: 2 + passed: false + comment: AR-09 auto-reject caps score to 0. No fake UI/interactivity; appropriate + complexity otherwise. + - id: CQ-05 + name: Output & API + score: 0 + max: 1 + passed: false + comment: AR-09 auto-reject caps score to 0. Correct default-export component + contract, skipAnimation set, harness handles output otherwise. + library_mastery: + score: 0 + max: 10 + items: + - id: LM-01 + name: Idiomatic Usage + score: 0 + max: 5 + passed: false + comment: AR-09 auto-reject caps score to 0. Correct area/stack/stackOrder/stackOffset/curve + combination is idiomatic MUI X streamgraph usage otherwise. + - id: LM-02 + name: Distinctive Features + score: 0 + max: 5 + passed: false + comment: AR-09 auto-reject caps score to 0. stackOrder="insideOut" + stackOffset="wiggle" + is a lesser-used, distinctive MUI X LineChart capability otherwise. + verdict: REJECTED +impl_tags: + dependencies: [] + techniques: + - stacked-area + - streamgraph-wiggle-offset + - smooth-curve-interpolation + - legend + patterns: + - data-generation + - seeded-rng + dataprep: [] + styling: + - theme-adaptive + - hidden-axis + - minimal-chrome From 992a304cc660ca3191bd20ffd5a7d42e19b77352 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Aug 2026 21:41:38 +0000 Subject: [PATCH 4/5] fix(muix): address review feedback for streamgraph-basic Attempt 1/4 - fixes based on AI review --- plots/streamgraph-basic/implementations/javascript/muix.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plots/streamgraph-basic/implementations/javascript/muix.tsx b/plots/streamgraph-basic/implementations/javascript/muix.tsx index 434803b774..305b3405bd 100644 --- a/plots/streamgraph-basic/implementations/javascript/muix.tsx +++ b/plots/streamgraph-basic/implementations/javascript/muix.tsx @@ -102,7 +102,7 @@ export default function Chart() { ]} leftAxis={null} grid={{ horizontal: false, vertical: false }} - margin={{ left: 24, right: 24, top: 44, bottom: 56 }} + margin={{ left: 64, right: 24, top: 44, bottom: 56 }} slotProps={{ legend: { position: { vertical: "top", horizontal: "middle" }, From 1302a41cfe707408e4e4e02b859891eccb74e7ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Aug 2026 21:45:55 +0000 Subject: [PATCH 5/5] chore(muix): update quality score 88 and review feedback for streamgraph-basic --- .../implementations/javascript/muix.tsx | 2 +- .../metadata/javascript/muix.yaml | 259 ++++++++---------- 2 files changed, 114 insertions(+), 147 deletions(-) diff --git a/plots/streamgraph-basic/implementations/javascript/muix.tsx b/plots/streamgraph-basic/implementations/javascript/muix.tsx index 305b3405bd..d5ea07cd0a 100644 --- a/plots/streamgraph-basic/implementations/javascript/muix.tsx +++ b/plots/streamgraph-basic/implementations/javascript/muix.tsx @@ -1,7 +1,7 @@ // anyplot.ai // streamgraph-basic: Basic Stream Graph // Library: muix 7.29.1 | JavaScript 22.23.1 -// Quality: 0/100 | Created: 2026-08-05 +// Quality: 88/100 | Created: 2026-08-05 import { LineChart } from "@mui/x-charts/LineChart"; import Box from "@mui/material/Box"; diff --git a/plots/streamgraph-basic/metadata/javascript/muix.yaml b/plots/streamgraph-basic/metadata/javascript/muix.yaml index 6389ac68e5..120cb3302d 100644 --- a/plots/streamgraph-basic/metadata/javascript/muix.yaml +++ b/plots/streamgraph-basic/metadata/javascript/muix.yaml @@ -2,7 +2,7 @@ library: muix language: javascript specification_id: streamgraph-basic created: '2026-08-05T11:47:11Z' -updated: '2026-08-05T21:38:42Z' +updated: '2026-08-05T21:45:55Z' generated_by: claude-sonnet workflow_run: 31002324488 issue: 856 @@ -12,257 +12,224 @@ preview_url_light: https://storage.googleapis.com/anyplot-images/plots/streamgra preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-dark.png preview_html_light: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-light.html preview_html_dark: https://storage.googleapis.com/anyplot-images/plots/streamgraph-basic/javascript/muix/plot-dark.html -quality_score: 0 +quality_score: 88 review: strengths: - - 'Correct streamgraph technique: area+stack with stackOrder="insideOut" and stackOffset="wiggle" - is the textbook Byron/Wattenberg streamgraph algorithm, paired with catmullRom - curve interpolation for smooth flowing bands.' - - 'Imprint categorical palette applied in exact canonical order (t.palette[0..5]): - brand green first (Pop), then lavender, blue, ochre, matte red, cyan — identical - hues in light and dark renders, only chrome flips.' - - 'Deliberate, theme-appropriate chrome: y-axis and gridlines hidden (appropriate - for a streamgraph where shape/proportion is the message, not exact magnitude), - thin single x-axis baseline, decluttered tick labels via tickLabelInterval to - avoid crowding.' - - Title follows the mandated `{Descriptive Title} · {spec-id} · {language} · {library} - · anyplot.ai` format and both renders keep title/legend text fully legible against - their respective backgrounds. + - Correct, idiomatic MUI X streamgraph implementation (wiggle offset + insideOut + order + catmullRom curve) matching the library's documented recipe + - 'Both renders are fully theme-correct: identical data colors, correctly flipped + chrome, no dark-on-dark or light-on-light legibility failures' + - Canonical Imprint palette order across all 6 categories with brand green correctly + first + - Deterministic, realistic monthly genre-listening data well within the spec's size/category + ranges weaknesses: - - 'AR-09 (auto-reject): the first x-axis tick label "Jan 2024" is clipped at the - left canvas edge in BOTH plot-light.png and plot-dark.png — pixel inspection confirms - ink-colored pixels at column x=0, and a 6x zoom crop shows the left hook/curve - of the "J" glyph is missing, not just close to the border. Root cause: xAxis uses - scaleType="point" with margin={{left: 24, ...}}, so the first point sits at x=24 - in the plot''s local coordinate space and MUI X centers the point-scale tick label - under that position — a label this wide ("Jan 2024") needs far more than 24px - of left margin to avoid its centered text starting before x=0. Fix: increase margin.left - substantially (e.g. to ~60-80px) so the first tick''s label box fits within the - canvas, or keep the small margin but suppress/adjust the very first shown label - so its centered text doesn''t overflow the left edge.' - - 'Minor, not a required fix: the spec describes a ''baseline centered symmetrically - around the x-axis'' — stackOffset="wiggle" (the standard streamgraph minimize-wiggle - algorithm) is the correct and expected choice here, but note that it does not - produce a perfectly mirror-symmetric envelope like stackOffset="silhouette" would; - both are valid readings of ''streamgraph'', no deduction taken.' + - Y-axis is fully hidden with no numeric scale or unit reference anywhere in the + chart - the title mentions Streaming Hours but the actual magnitude (in thousands, + per the code comment) is never surfaced to the viewer + - No explicit x-axis title (only bare month/year tick labels) - a short axis label + would remove ambiguity + - Design Excellence stays close to library defaults beyond the palette/curve choices + - no annotation or emphasis calls out the clearest trend to strengthen data storytelling image_description: |- Light render (plot-light.png): - Background: Warm off-white, matches #FAF8F1 target (sampled corner pixel = (250,248,241)). - Chrome: Title "Genre Streaming Hours · streamgraph-basic · javascript · muix · anyplot.ai" centered at top in dark ink, clearly legible. Horizontal legend below title with 6 color swatches (Pop, Hip-Hop, Electronic, Rock, Jazz, Classical), all labels legible. X-axis shows a single baseline with month/year tick labels (Jan 2024, Apr 2024, ... Oct 2025) at every 3rd month; y-axis is intentionally hidden. Grid lines are off. - Data: Six stacked, smoothly-curved bands using the Imprint palette in canonical order — Pop = #009E73 (brand green, first series, confirmed), Hip-Hop = lavender, Electronic = blue, Rock = ochre, Jazz = matte red, Classical = cyan. Bands are stacked with insideOut ordering and wiggle offset, giving an organic river-like silhouette that trends: Electronic/Hip-Hop growing, Rock/Jazz/Classical shrinking, Pop roughly flat — consistent with the code's programmed trends. - Legibility verdict: FAIL — pixel-level inspection (6x zoomed crop of the bottom-left corner) shows the first x-axis tick label "Jan 2024" has its leading "J" clipped at the canvas' left edge (ink-colored pixels present at column x=0, left hook of the J missing). This is AR-09 edge clipping. All other text (title, legend, remaining tick labels) is fully readable and not clipped. + Background: Warm off-white, matches #FAF8F1, not pure white. + Chrome: Title ("Genre Streaming Hours · streamgraph-basic · javascript · muix · anyplot.ai") and legend (6 swatches: Pop, Hip-Hop, Electronic, Rock, Jazz, Classical) in dark ink, clearly readable. X-axis tick labels (Jan 2024 ... Oct 2025, every 3rd month) in soft dark gray, readable. No y-axis (intentionally hidden). + Data: Six-band streamgraph with wiggle-centered baseline and smooth catmullRom curves. First series (Pop) is brand green #009E73. Full order: green, lavender, blue, ochre, red, cyan - canonical Imprint order. + Legibility verdict: PASS Dark render (plot-dark.png): - Background: Warm near-black, matches #1A1A17 target. - Chrome: Same title and legend text now rendered in light ink, clearly legible against the dark surface — no dark-on-dark failures observed. Tick labels likewise readable. - Data: Colors are pixel-identical to the light render (same six Imprint hues) — only the background/text/axis-line chrome flipped, as required. Confirmed via direct comparison of swatch colors between renders. - Legibility verdict: FAIL — the same "Jan 2024" left-edge clipping reproduces identically in the dark render (confirmed via the same 6x zoomed crop); the left hook of the "J" is missing in this render too. No other legibility issues (no dark-on-dark text) were found. + Background: Warm near-black, matches #1A1A17, not pure black. + Chrome: Title and legend text rendered in light ink, clearly readable against dark background. X-axis tick labels in soft light gray, readable. No dark-on-dark failures observed. + Data: Colors identical to light render (green, lavender, blue, ochre, red, cyan) - only chrome (background, text ink, axis line) flipped, as required. Brand green clearly visible. + Legibility verdict: PASS criteria_checklist: visual_quality: - score: 0 + score: 28 max: 30 items: - id: VQ-01 name: Text Legibility - score: 0 + score: 7 max: 8 - passed: false - comment: 'AR-09 auto-reject caps score to 0: first x-axis tick label ''Jan - 2024'' clipped at left canvas edge in both themes; all other text otherwise - legible.' + passed: true + comment: Title/legend/ticks readable in both themes; tick label size (14px) + on the small side - id: VQ-02 name: No Overlap - score: 0 + score: 6 max: 6 - passed: false - comment: AR-09 auto-reject caps score to 0. No overlap issues observed otherwise. + passed: true + comment: No collisions between title, legend, bands, or tick labels - id: VQ-03 name: Element Visibility - score: 0 + score: 6 max: 6 - passed: false - comment: AR-09 auto-reject caps score to 0. Bands, curves, and legend swatches - otherwise clearly visible. + passed: true + comment: 24 monthly points per band render as smooth, clearly visible shapes - id: VQ-04 name: Color Accessibility - score: 0 + score: 2 max: 2 - passed: false - comment: AR-09 auto-reject caps score to 0. Six distinct Imprint hues otherwise - provide adequate contrast. + passed: true + comment: CVD-safe Imprint palette; identity carried by color+position+legend - id: VQ-05 name: Layout & Canvas - score: 0 + score: 4 max: 4 - passed: false - comment: 'AR-09 auto-reject caps score to 0: clipped tick label is the direct - Layout & Canvas defect.' + passed: true + comment: Clean margins, nothing clipped, title width matches expected range - id: VQ-06 name: Axis Labels & Title - score: 0 + score: 1 max: 2 passed: false - comment: AR-09 auto-reject caps score to 0. Title format otherwise correct. + comment: Y-axis fully suppressed with no numeric/unit reference; no explicit + x-axis title - id: VQ-07 name: Palette Compliance - score: 0 + score: 2 max: 2 - passed: false - comment: AR-09 auto-reject caps score to 0. Palette usage otherwise fully - canonical (t.palette[0..5] in order, correct light/dark backgrounds). + passed: true + comment: Canonical Imprint order, correct backgrounds, identical data colors + across themes design_excellence: - score: 0 + score: 12 max: 20 items: - id: DE-01 name: Aesthetic Sophistication - score: 0 + score: 5 max: 8 - passed: false - comment: AR-09 auto-reject caps score to 0. Otherwise a well-considered streamgraph - (hidden y-axis, insideOut ordering, wiggle offset, decluttered ticks). + passed: true + comment: Harmonious palette, smooth curves, stroke separators; otherwise close + to defaults - id: DE-02 name: Visual Refinement - score: 0 + score: 4 max: 6 - passed: false - comment: AR-09 auto-reject caps score to 0. Grid removed, generous whitespace - otherwise present. + passed: true + comment: Deliberately minimal chrome (no y-axis, grid, ticks), generous whitespace - id: DE-03 name: Data Storytelling - score: 0 + score: 3 max: 6 passed: false - comment: AR-09 auto-reject caps score to 0. insideOut ordering places dominant - genres centrally, giving a legible focal hierarchy otherwise. + comment: Shapes convey trends but no explicit emphasis or annotation spec_compliance: - score: 0 + score: 14 max: 15 items: - id: SC-01 name: Plot Type - score: 0 + score: 5 max: 5 - passed: false - comment: AR-09 auto-reject caps score to 0. Correct streamgraph (area+stack+wiggle+insideOut+catmullRom) - otherwise. + passed: true + comment: Correct streamgraph via wiggle offset + insideOut order - id: SC-02 name: Required Features - score: 0 + score: 4 max: 4 - passed: false - comment: AR-09 auto-reject caps score to 0. Smooth curves, near-centered baseline, - legend, distinct colors all otherwise present. + passed: true + comment: Smooth curves, wiggle-centered baseline, distinct colors, legend + present - id: SC-03 name: Data Mapping - score: 0 + score: 2 max: 3 passed: false - comment: AR-09 auto-reject caps score to 0. Time on x, stacked genre values - on y, all 24 months represented otherwise. + comment: X and stacked values correctly mapped but y-axis fully hidden, no + scale shown - id: SC-04 name: Title & Legend - score: 0 + score: 3 max: 3 - passed: false - comment: AR-09 auto-reject caps score to 0. Title format and legend labels - otherwise correct. + passed: true + comment: Title format correct, legend labels match genres data_quality: - score: 0 + score: 15 max: 15 items: - id: DQ-01 name: Feature Coverage - score: 0 + score: 6 max: 6 - passed: false - comment: AR-09 auto-reject caps score to 0. 6 genres over 24 months, within - spec's 3-8 categories / 10-100 points range, with distinct growth/decline - trajectories, otherwise a good coverage. + passed: true + comment: 24 points, 6 categories - within spec range - id: DQ-02 name: Realistic Context - score: 0 + score: 5 max: 5 - passed: false - comment: AR-09 auto-reject caps score to 0. Music genre listening hours is - plausible and neutral otherwise. + passed: true + comment: Plausible, neutral genre-listening trends - id: DQ-03 name: Appropriate Scale - score: 0 + score: 4 max: 4 - passed: false - comment: AR-09 auto-reject caps score to 0. Values (roughly 30-500 'thousand - hours') are sensible for the domain otherwise. + passed: true + comment: Sensible streaming-hours magnitudes code_quality: - score: 0 + score: 10 max: 10 items: - id: CQ-01 name: KISS Structure - score: 0 + score: 3 max: 3 - passed: false - comment: AR-09 auto-reject caps score to 0. Flat script, one small deterministic-RNG - helper, otherwise KISS-compliant. + passed: true + comment: No unnecessary functions/classes - id: CQ-02 name: Reproducibility - score: 0 + score: 2 max: 2 - passed: false - comment: AR-09 auto-reject caps score to 0. Fixed-seed LCG makes data fully - deterministic otherwise. + passed: true + comment: Deterministic fixed-seed LCG - id: CQ-03 name: Clean Imports - score: 0 + score: 2 max: 2 - passed: false - comment: AR-09 auto-reject caps score to 0. Only LineChart, Box, Typography - imported and all used. + passed: true + comment: Only used imports - id: CQ-04 name: Code Elegance - score: 0 + score: 2 max: 2 - passed: false - comment: AR-09 auto-reject caps score to 0. No fake UI/interactivity; appropriate - complexity otherwise. + passed: true + comment: Appropriate complexity, no fake UI - id: CQ-05 name: Output & API - score: 0 + score: 1 max: 1 - passed: false - comment: AR-09 auto-reject caps score to 0. Correct default-export component - contract, skipAnimation set, harness handles output otherwise. + passed: true + comment: Correct harness contract, current MUI X API library_mastery: - score: 0 + score: 9 max: 10 items: - id: LM-01 name: Idiomatic Usage - score: 0 + score: 5 max: 5 - passed: false - comment: AR-09 auto-reject caps score to 0. Correct area/stack/stackOrder/stackOffset/curve - combination is idiomatic MUI X streamgraph usage otherwise. + passed: true + comment: wiggle + insideOut + catmullRom is MUI X's documented streamgraph + pattern - id: LM-02 name: Distinctive Features - score: 0 + score: 4 max: 5 - passed: false - comment: AR-09 auto-reject caps score to 0. stackOrder="insideOut" + stackOffset="wiggle" - is a lesser-used, distinctive MUI X LineChart capability otherwise. - verdict: REJECTED + passed: true + comment: Custom tickLabelInterval, disableTicks, legend positioning, per-series + overrides + verdict: APPROVED impl_tags: dependencies: [] techniques: - stacked-area - - streamgraph-wiggle-offset - - smooth-curve-interpolation - - legend + - wiggle-offset patterns: - data-generation - - seeded-rng - dataprep: [] + dataprep: + - time-series styling: - - theme-adaptive - - hidden-axis - minimal-chrome + - alpha-blending