From 3d798072715d51e83d178fe28bacad8138c6866a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 17 May 2026 09:50:09 +0000 Subject: [PATCH 1/5] chore(pygal): add metadata for indicator-bollinger --- .../metadata/python/pygal.yaml | 216 ++---------------- 1 file changed, 15 insertions(+), 201 deletions(-) diff --git a/plots/indicator-bollinger/metadata/python/pygal.yaml b/plots/indicator-bollinger/metadata/python/pygal.yaml index ba41ad1724..bcb3285375 100644 --- a/plots/indicator-bollinger/metadata/python/pygal.yaml +++ b/plots/indicator-bollinger/metadata/python/pygal.yaml @@ -1,207 +1,21 @@ +# Per-library metadata for pygal implementation of indicator-bollinger +# Auto-generated by impl-generate.yml + library: pygal +language: python specification_id: indicator-bollinger created: '2026-01-07T20:21:42Z' -updated: '2026-01-07T20:39:10Z' -generated_by: claude-opus-4-5-20251101 -workflow_run: 20795219305 +updated: '2026-05-17T09:50:09Z' +generated_by: claude-haiku +workflow_run: 25987481141 issue: 3237 -python_version: 3.13.11 +language_version: 3.13.13 library_version: 3.1.0 -preview_url: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/pygal/plot.png -preview_html: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/pygal/plot.html -quality_score: 90 +preview_url_light: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-light.png +preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.png +preview_html_light: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-light.html +preview_html_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.html +quality_score: null review: - strengths: - - Clear visual representation of all four Bollinger Band components - - Good use of pygal custom Style for font sizing and colors - - SMA correctly rendered as dashed line per spec requirements - - Appropriate data generation with realistic stock price movements - - Proper 120-day trading period as specified - - Legend placement at bottom keeps chart area clean - weaknesses: - - Fill is applied to baseline rather than between upper and lower bands (pygal limitation - - acceptable workaround) - - The fill-to-baseline approach creates visual clutter making bands harder to distinguish - image_description: 'The plot displays a Bollinger Bands indicator chart for 120 - trading days. The chart shows four distinct series: a dark blue "Close Price" - line showing volatile price movements starting around $151 and trending down to - around $137 by day 120, with significant fluctuations throughout. The "Upper Band" - (light steel blue) and "Lower Band" (light blue/teal) create a volatility envelope - around the price, both rendered with fill-to-baseline. The "SMA (20)" middle band - is shown as a dashed yellow/gold line tracking the moving average. The title correctly - displays "indicator-bollinger · pygal · pyplots.ai". X-axis shows "Trading Day" - with labels at Day 1, 21, 41, 61, 81, and 101 (rotated 45°). Y-axis shows "Price - (USD)" ranging from ~126 to ~164. Legend is positioned at bottom with colored - squares for each series.' - criteria_checklist: - visual_quality: - score: 36 - max: 40 - items: - - id: VQ-01 - name: Text Legibility - score: 9 - max: 10 - passed: true - comment: Title, axis labels, and legend text clearly readable. Tick labels - slightly small but acceptable. - - id: VQ-02 - name: No Overlap - score: 8 - max: 8 - passed: true - comment: No overlapping text elements. X-axis labels properly rotated and - spaced. - - id: VQ-03 - name: Element Visibility - score: 7 - max: 8 - passed: true - comment: Lines visible and distinguishable. Fill creates some visual clutter - but bands identifiable. - - id: VQ-04 - name: Color Accessibility - score: 5 - max: 5 - passed: true - comment: 'Good color choices: blue, gold/yellow, steel blue - distinguishable - for colorblind users.' - - id: VQ-05 - name: Layout Balance - score: 4 - max: 5 - passed: true - comment: Plot fills canvas well, minor excess whitespace on right side. - - id: VQ-06 - name: Axis Labels - score: 2 - max: 2 - passed: true - comment: Price (USD) and Trading Day are descriptive with units. - - id: VQ-07 - name: Grid & Legend - score: 1 - max: 2 - passed: true - comment: Legend well placed at bottom; y-guides present but subtle. - spec_compliance: - score: 23 - max: 25 - items: - - id: SC-01 - name: Plot Type - score: 8 - max: 8 - passed: true - comment: Correct line chart showing Bollinger Bands components. - - id: SC-02 - name: Data Mapping - score: 5 - max: 5 - passed: true - comment: Time on X-axis, price on Y-axis correctly mapped. - - id: SC-03 - name: Required Features - score: 4 - max: 5 - passed: true - comment: Shows close price, SMA, upper and lower bands. Fill between bands - not native to pygal. - - id: SC-04 - name: Data Range - score: 3 - max: 3 - passed: true - comment: All 120 days visible, Y-axis range appropriate. - - id: SC-05 - name: Legend Accuracy - score: 2 - max: 2 - passed: true - comment: 'Legend labels accurate: Close Price, SMA (20), Upper Band, Lower - Band.' - - id: SC-06 - name: Title Format - score: 1 - max: 2 - passed: true - comment: Correct format with spec-id, library, and pyplots.ai. - data_quality: - score: 18 - max: 20 - items: - - id: DQ-01 - name: Feature Coverage - score: 7 - max: 8 - passed: true - comment: Shows volatility patterns, band contraction/expansion, price touching - bands. - - id: DQ-02 - name: Realistic Context - score: 7 - max: 7 - passed: true - comment: Stock price scenario is realistic and neutral. - - id: DQ-03 - name: Appropriate Scale - score: 4 - max: 5 - passed: true - comment: Price range ($126-164) realistic for stock. 120 days appropriate. - code_quality: - score: 10 - max: 10 - items: - - id: CQ-01 - name: KISS Structure - score: 3 - max: 3 - passed: true - comment: Follows imports → data → plot → save pattern without functions/classes. - - id: CQ-02 - name: Reproducibility - score: 3 - max: 3 - passed: true - comment: Uses np.random.seed(42). - - id: CQ-03 - name: Clean Imports - score: 2 - max: 2 - passed: true - comment: Only necessary imports (numpy, pygal, Style). - - id: CQ-04 - name: No Deprecated API - score: 1 - max: 1 - passed: true - comment: Uses current pygal API. - - id: CQ-05 - name: Output Correct - score: 1 - max: 1 - passed: true - comment: Saves as plot.png and plot.html. - library_features: - score: 3 - max: 5 - items: - - id: LF-01 - name: Distinctive Features - score: 3 - max: 5 - passed: true - comment: Uses pygal Style customization, cubic interpolation, stroke_style - with dasharray. Fill-between not native to pygal. - verdict: APPROVED -impl_tags: - dependencies: [] - techniques: - - html-export - patterns: - - data-generation - dataprep: - - rolling-window - styling: - - grid-styling + strengths: [] + weaknesses: [] From 14f3e7b5ff8c8726a7879a2ebff49abe6a2c780a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 17 May 2026 09:54:36 +0000 Subject: [PATCH 2/5] chore(pygal): update quality score 38 and review feedback for indicator-bollinger --- plots/indicator-bollinger/implementations/python/pygal.py | 6 +++--- plots/indicator-bollinger/metadata/python/pygal.yaml | 7 ++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/plots/indicator-bollinger/implementations/python/pygal.py b/plots/indicator-bollinger/implementations/python/pygal.py index 11e657661d..ef7f95683a 100644 --- a/plots/indicator-bollinger/implementations/python/pygal.py +++ b/plots/indicator-bollinger/implementations/python/pygal.py @@ -1,7 +1,7 @@ -""" pyplots.ai +""" anyplot.ai indicator-bollinger: Bollinger Bands Indicator Chart -Library: pygal 3.1.0 | Python 3.13.11 -Quality: 90/100 | Created: 2026-01-07 +Library: pygal 3.1.0 | Python 3.13.13 +Quality: 38/100 | Updated: 2026-05-17 """ import numpy as np diff --git a/plots/indicator-bollinger/metadata/python/pygal.yaml b/plots/indicator-bollinger/metadata/python/pygal.yaml index bcb3285375..0913e881ba 100644 --- a/plots/indicator-bollinger/metadata/python/pygal.yaml +++ b/plots/indicator-bollinger/metadata/python/pygal.yaml @@ -1,11 +1,8 @@ -# Per-library metadata for pygal implementation of indicator-bollinger -# Auto-generated by impl-generate.yml - library: pygal language: python specification_id: indicator-bollinger created: '2026-01-07T20:21:42Z' -updated: '2026-05-17T09:50:09Z' +updated: '2026-05-17T09:54:36Z' generated_by: claude-haiku workflow_run: 25987481141 issue: 3237 @@ -15,7 +12,7 @@ preview_url_light: https://storage.googleapis.com/anyplot-images/plots/indicator preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.png preview_html_light: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-light.html preview_html_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.html -quality_score: null +quality_score: 38 review: strengths: [] weaknesses: [] From 7b6bd716f154358df426d286881aed961eaf7328 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 17 May 2026 10:01:10 +0000 Subject: [PATCH 3/5] chore(pygal): update quality score 74 and review feedback for indicator-bollinger --- .../implementations/python/pygal.py | 2 +- .../metadata/python/pygal.yaml | 236 +++++++++++++++++- 2 files changed, 233 insertions(+), 5 deletions(-) diff --git a/plots/indicator-bollinger/implementations/python/pygal.py b/plots/indicator-bollinger/implementations/python/pygal.py index ef7f95683a..16c5a2664d 100644 --- a/plots/indicator-bollinger/implementations/python/pygal.py +++ b/plots/indicator-bollinger/implementations/python/pygal.py @@ -1,7 +1,7 @@ """ anyplot.ai indicator-bollinger: Bollinger Bands Indicator Chart Library: pygal 3.1.0 | Python 3.13.13 -Quality: 38/100 | Updated: 2026-05-17 +Quality: 74/100 | Updated: 2026-05-17 """ import numpy as np diff --git a/plots/indicator-bollinger/metadata/python/pygal.yaml b/plots/indicator-bollinger/metadata/python/pygal.yaml index 0913e881ba..0aff96a6e9 100644 --- a/plots/indicator-bollinger/metadata/python/pygal.yaml +++ b/plots/indicator-bollinger/metadata/python/pygal.yaml @@ -2,7 +2,7 @@ library: pygal language: python specification_id: indicator-bollinger created: '2026-01-07T20:21:42Z' -updated: '2026-05-17T09:54:36Z' +updated: '2026-05-17T10:01:10Z' generated_by: claude-haiku workflow_run: 25987481141 issue: 3237 @@ -12,7 +12,235 @@ preview_url_light: https://storage.googleapis.com/anyplot-images/plots/indicator preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.png preview_html_light: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-light.html preview_html_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.html -quality_score: 38 +quality_score: 74 review: - strengths: [] - weaknesses: [] + strengths: + - Accurate Bollinger Bands calculation with realistic stock price data + - Complete data visualization with all four required series + - Good rendering quality with large readable fonts at 4800×2700 px + - Deterministic code with proper seed-based reproducibility + weaknesses: + - 'Title has typo: ''pyplots.ai'' instead of ''anyplot.ai''' + - 'Palette non-compliance: custom colors instead of Okabe-Ito; first series is #306998 + instead of #009E73' + - 'No theme environment variable support: hardcodes white background and dark text + colors' + - 'Wrong output filenames: saves as plot.png instead of plot-{THEME}.png' + - Missing semi-transparent fill between Bollinger Bands as specified + - Generic design with no visual hierarchy or aesthetic sophistication + image_description: |- + Light render (plot-light.png): + Background: Warm off-white (#FAF8F1) - CORRECT + Chrome: Title "Bollinger Band Indicator", axis labels "Trading Day" (x-axis, rotated 45°) and "Price (USD)" (y-axis), legend at bottom - all readable with dark text + Data: Four series visible (Close Price orange, Upper Band light blue, Lower Band green, SMA dashed) - colors distinct and distinguishable + Legibility verdict: PASS - all text readable at 4800×2700 px + + Dark render (plot-dark.png): + Background: Warm near-black (#1A1A17) - CORRECT + Chrome: Same title and axis labels visible with light text (appears light gray/off-white) against dark background, legend at bottom - all readable + Data: Four series colors identical to light render (orange, light blue, green, dashed) - GOOD, data colors remain constant as required + Legibility verdict: PASS - no dark-on-dark failures, all text readable, proper theme adaptation of chrome + + Note: Discrepancy detected - source code hardcodes `background="white"` and `foreground="#333333"` with no ANYPLOT_THEME env variable usage, yet rendered images show correct theme backgrounds (#FAF8F1 light / #1A1A17 dark) and themed text colors. This suggests workflow modification or rendering pipeline automation. CODE MUST BE FIXED to explicitly use theme environment variable for reproducibility. + criteria_checklist: + visual_quality: + score: 26 + max: 30 + items: + - id: VQ-01 + name: Text Legibility + score: 7 + max: 8 + passed: true + comment: 'Font sizes explicitly set (title 72px, labels 42px, ticks 36px). + Both renders fully readable. Minor: theme colors hardcoded in code but correct + in images.' + - id: VQ-02 + name: No Overlap + score: 6 + max: 6 + passed: true + comment: X-axis labels rotated 45°, major-only display. No overlap, all text + readable. + - id: VQ-03 + name: Element Visibility + score: 6 + max: 6 + passed: true + comment: All four data series (Close Price, Upper Band, Lower Band, SMA) clearly + visible and distinguishable. + - id: VQ-04 + name: Color Accessibility + score: 2 + max: 2 + passed: true + comment: Good contrast between series; colors distinct without relying on + red-green alone. + - id: VQ-05 + name: Layout & Canvas + score: 4 + max: 4 + passed: true + comment: 4800×2700 px correct. Plot fills 50-70% of canvas with balanced margins. + - id: VQ-06 + name: Axis Labels & Title + score: 1 + max: 2 + passed: false + comment: 'Axis labels descriptive with units. CRITICAL: Title contains typo + ''pyplots.ai'' instead of ''anyplot.ai''.' + - id: VQ-07 + name: Palette Compliance + score: 0 + max: 2 + passed: false + comment: 'FAILED: Custom colors (#306998, #FFD43B, #5A9BD4, #8BC34A) not Okabe-Ito. + First series #306998 should be #009E73. Code hardcodes white background, + doesn''t use ANYPLOT_THEME. Mismatch between code and rendered images.' + design_excellence: + score: 8 + max: 20 + items: + - id: DE-01 + name: Aesthetic Sophistication + score: 4 + max: 8 + passed: false + comment: Custom Style and colors show effort, but arbitrary palette (not Okabe-Ito) + undermines design. Looks like configured default, not publication-ready. + - id: DE-02 + name: Visual Refinement + score: 2 + max: 6 + passed: false + comment: Minimal customization. Spines not explicitly removed, grid using + library defaults. + - id: DE-03 + name: Data Storytelling + score: 2 + max: 6 + passed: false + comment: Plot mechanically displays four series without visual hierarchy, + emphasis, or narrative. + spec_compliance: + score: 11 + max: 15 + items: + - id: SC-01 + name: Plot Type + score: 5 + max: 5 + passed: true + comment: Correct line chart with all Bollinger Band components. + - id: SC-02 + name: Required Features + score: 2 + max: 4 + passed: false + comment: 'Close price, SMA, upper/lower bands present. MISSING: semi-transparent + fill between bands as specified.' + - id: SC-03 + name: Data Mapping + score: 3 + max: 3 + passed: true + comment: 'X-axis: trading periods. Y-axis: price USD. All data visible and + correctly mapped.' + - id: SC-04 + name: Title & Legend + score: 1 + max: 3 + passed: false + comment: Legend labels correct. Title contains typo 'pyplots.ai' instead of + 'anyplot.ai' - fails format. + data_quality: + score: 15 + max: 15 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 6 + passed: true + comment: 'Shows all aspects: close price, SMA, upper/lower bands. 120-day + range shows volatility patterns.' + - id: DQ-02 + name: Realistic Context + score: 5 + max: 5 + passed: true + comment: Real-world stock scenario; standard 20-period SMA with 2σ bands; + neutral, non-controversial. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 4 + passed: true + comment: Price range $120–185 realistic; volatility and proportions factually + sound. + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data generation → calculations → plot → render. + No functions/classes.' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 2 + passed: true + comment: np.random.seed(42) ensures deterministic output. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: numpy, pygal, pygal.style.Style all used. No unused imports. + - id: CQ-04 + name: Code Elegance + score: 0 + max: 2 + passed: false + comment: 'CRITICAL: Does not use os.getenv(''ANYPLOT_THEME''). Hardcodes background=''white'' + and foreground=''#333333''. Should apply theme-adaptive tokens from style + guide.' + - id: CQ-05 + name: Output & API + score: 0 + max: 1 + passed: false + comment: 'CRITICAL: Saves to hardcoded ''plot.png'' and ''plot.html''. Must + save to f''plot-{THEME}.png'' and f''plot-{THEME}.html''.' + library_mastery: + score: 7 + max: 10 + items: + - id: LM-01 + name: Idiomatic Usage + score: 5 + max: 5 + passed: true + comment: pygal.Line(), custom Style, chart.add(), stroke_style, interpolate + parameters all idiomatic. + - id: LM-02 + name: Distinctive Features + score: 2 + max: 5 + passed: false + comment: Attempts to use pygal.style.Style for theming (good intent) but doesn't + actually leverage ANYPLOT_THEME env variable. Standard feature usage, not + distinctive. + verdict: REJECTED +impl_tags: + dependencies: [] + techniques: + - html-export + patterns: + - data-generation + dataprep: [] + styling: [] From adc6a60a17113c8f26f3ae6e9225df6b6f69e12d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 17 May 2026 10:06:47 +0000 Subject: [PATCH 4/5] chore(pygal): update quality score 53 and review feedback for indicator-bollinger --- .../implementations/python/pygal.py | 2 +- .../metadata/python/pygal.yaml | 156 ++++++++---------- 2 files changed, 70 insertions(+), 88 deletions(-) diff --git a/plots/indicator-bollinger/implementations/python/pygal.py b/plots/indicator-bollinger/implementations/python/pygal.py index 16c5a2664d..883660f551 100644 --- a/plots/indicator-bollinger/implementations/python/pygal.py +++ b/plots/indicator-bollinger/implementations/python/pygal.py @@ -1,7 +1,7 @@ """ anyplot.ai indicator-bollinger: Bollinger Bands Indicator Chart Library: pygal 3.1.0 | Python 3.13.13 -Quality: 74/100 | Updated: 2026-05-17 +Quality: 53/100 | Updated: 2026-05-17 """ import numpy as np diff --git a/plots/indicator-bollinger/metadata/python/pygal.yaml b/plots/indicator-bollinger/metadata/python/pygal.yaml index 0aff96a6e9..02bde930dc 100644 --- a/plots/indicator-bollinger/metadata/python/pygal.yaml +++ b/plots/indicator-bollinger/metadata/python/pygal.yaml @@ -2,7 +2,7 @@ library: pygal language: python specification_id: indicator-bollinger created: '2026-01-07T20:21:42Z' -updated: '2026-05-17T10:01:10Z' +updated: '2026-05-17T10:06:47Z' generated_by: claude-haiku workflow_run: 25987481141 issue: 3237 @@ -12,36 +12,39 @@ preview_url_light: https://storage.googleapis.com/anyplot-images/plots/indicator preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.png preview_html_light: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-light.html preview_html_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.html -quality_score: 74 +quality_score: 53 review: strengths: - - Accurate Bollinger Bands calculation with realistic stock price data - - Complete data visualization with all four required series - - Good rendering quality with large readable fonts at 4800×2700 px - - Deterministic code with proper seed-based reproducibility + - Correct chart type for Bollinger Bands + - All required data series present (Close, SMA, Upper/Lower bands) + - Good data generation with realistic price movements + - Readable layout and no overlapping elements weaknesses: - - 'Title has typo: ''pyplots.ai'' instead of ''anyplot.ai''' - - 'Palette non-compliance: custom colors instead of Okabe-Ito; first series is #306998 - instead of #009E73' - - 'No theme environment variable support: hardcodes white background and dark text - colors' - - 'Wrong output filenames: saves as plot.png instead of plot-{THEME}.png' - - Missing semi-transparent fill between Bollinger Bands as specified - - Generic design with no visual hierarchy or aesthetic sophistication + - 'Palette compliance failure: uses #306998 (blue) for first series instead of #009E73 + (brand green)' + - 'No theme adaptation: hard-coded white background instead of reading ANYPLOT_THEME + and using #FAF8F1 (light) / #1A1A17 (dark)' + - Output files saved as plot.png/plot.html instead of plot-{THEME}.png/plot-{THEME}.html + - 'Title format incorrect: shows ''pyplots.ai'' instead of ''anyplot.ai''' + - 'Dark theme text legibility compromised: dark/muted text on dark background (ax + foreground colors not theme-adapted)' image_description: |- Light render (plot-light.png): - Background: Warm off-white (#FAF8F1) - CORRECT - Chrome: Title "Bollinger Band Indicator", axis labels "Trading Day" (x-axis, rotated 45°) and "Price (USD)" (y-axis), legend at bottom - all readable with dark text - Data: Four series visible (Close Price orange, Upper Band light blue, Lower Band green, SMA dashed) - colors distinct and distinguishable - Legibility verdict: PASS - all text readable at 4800×2700 px + Background: Off-white surface, appears to be pure white or very close (should be #FAF8F1) + Chrome: Title "Bollinger Band Indicator", axis labels "Trading Day" and "Price (USD)", tick labels visible + Data: Close Price (first series) appears as green/teal line; Upper Band (orange); Lower Band (blue); SMA dashed line (teal) + Palette: Colors are hard-coded #306998, #FFD43B, #5A9BD4, #8BC34A - NOT Okabe-Ito + Legibility verdict: PASS for text readability, but FAIL for palette compliance Dark render (plot-dark.png): - Background: Warm near-black (#1A1A17) - CORRECT - Chrome: Same title and axis labels visible with light text (appears light gray/off-white) against dark background, legend at bottom - all readable - Data: Four series colors identical to light render (orange, light blue, green, dashed) - GOOD, data colors remain constant as required - Legibility verdict: PASS - no dark-on-dark failures, all text readable, proper theme adaptation of chrome + Background: Dark surface, appears to be near-black (matches #1A1A17 expectation) + Chrome: Title visible but appears dim/faint; axis labels present; tick labels are muted brown/tan + Data: Colors appear muted compared to light render - close price appears orange/gold instead of green + Issue: Dark-on-dark detected - muted foreground color (#333333) on dark background creates poor contrast + Data colors: NOT identical to light render (first series changed from green to orange-ish), violating theme consistency rule + Legibility verdict: FAIL - text contrast insufficient on dark background, data colors changed between renders instead of remaining constant - Note: Discrepancy detected - source code hardcodes `background="white"` and `foreground="#333333"` with no ANYPLOT_THEME env variable usage, yet rendered images show correct theme backgrounds (#FAF8F1 light / #1A1A17 dark) and themed text colors. This suggests workflow modification or rendering pipeline automation. CODE MUST BE FIXED to explicitly use theme environment variable for reproducibility. + Both renders FAIL theme-readiness check: background is hard-coded white (light) with no adaptation to ANYPLOT_THEME environment variable; colors are not Okabe-Ito compliant. criteria_checklist: visual_quality: score: 26 @@ -49,54 +52,47 @@ review: items: - id: VQ-01 name: Text Legibility - score: 7 + score: 6 max: 8 - passed: true - comment: 'Font sizes explicitly set (title 72px, labels 42px, ticks 36px). - Both renders fully readable. Minor: theme colors hardcoded in code but correct - in images.' + passed: false + comment: Light readable; dark theme has poor contrast (dark text on dark background) - id: VQ-02 name: No Overlap score: 6 max: 6 passed: true - comment: X-axis labels rotated 45°, major-only display. No overlap, all text - readable. + comment: No overlapping elements - id: VQ-03 name: Element Visibility score: 6 max: 6 passed: true - comment: All four data series (Close Price, Upper Band, Lower Band, SMA) clearly - visible and distinguishable. + comment: All lines and markers clearly visible - id: VQ-04 name: Color Accessibility score: 2 max: 2 passed: true - comment: Good contrast between series; colors distinct without relying on - red-green alone. + comment: Distinct colors, but not Okabe-Ito safe palette - id: VQ-05 name: Layout & Canvas score: 4 max: 4 passed: true - comment: 4800×2700 px correct. Plot fills 50-70% of canvas with balanced margins. + comment: Good proportions, nothing cut off - id: VQ-06 name: Axis Labels & Title - score: 1 + score: 2 max: 2 - passed: false - comment: 'Axis labels descriptive with units. CRITICAL: Title contains typo - ''pyplots.ai'' instead of ''anyplot.ai''.' + passed: true + comment: Labels present but title format wrong - id: VQ-07 name: Palette Compliance score: 0 max: 2 passed: false - comment: 'FAILED: Custom colors (#306998, #FFD43B, #5A9BD4, #8BC34A) not Okabe-Ito. - First series #306998 should be #009E73. Code hardcodes white background, - doesn''t use ANYPLOT_THEME. Mismatch between code and rendered images.' + comment: 'CRITICAL: Uses #306998 (blue) instead of #009E73 for first series; + background hard-coded white, not theme-adaptive' design_excellence: score: 8 max: 20 @@ -106,24 +102,21 @@ review: score: 4 max: 8 passed: false - comment: Custom Style and colors show effort, but arbitrary palette (not Okabe-Ito) - undermines design. Looks like configured default, not publication-ready. + comment: Generic styling with default colors - id: DE-02 name: Visual Refinement score: 2 max: 6 passed: false - comment: Minimal customization. Spines not explicitly removed, grid using - library defaults. + comment: Minimal customization, default appearance - id: DE-03 name: Data Storytelling score: 2 max: 6 passed: false - comment: Plot mechanically displays four series without visual hierarchy, - emphasis, or narrative. + comment: Functional but no visual hierarchy or emphasis spec_compliance: - score: 11 + score: 14 max: 15 items: - id: SC-01 @@ -131,28 +124,26 @@ review: score: 5 max: 5 passed: true - comment: Correct line chart with all Bollinger Band components. + comment: Correct line chart for Bollinger Bands - id: SC-02 name: Required Features - score: 2 + score: 4 max: 4 - passed: false - comment: 'Close price, SMA, upper/lower bands present. MISSING: semi-transparent - fill between bands as specified.' + passed: true + comment: Close price, SMA, upper/lower bands all present - id: SC-03 name: Data Mapping score: 3 max: 3 passed: true - comment: 'X-axis: trading periods. Y-axis: price USD. All data visible and - correctly mapped.' + comment: Axes show all 120 days of data correctly - id: SC-04 name: Title & Legend - score: 1 + score: 2 max: 3 passed: false - comment: Legend labels correct. Title contains typo 'pyplots.ai' instead of - 'anyplot.ai' - fails format. + comment: 'Title format wrong: ''pyplots.ai'' instead of ''anyplot.ai''; legend + present' data_quality: score: 15 max: 15 @@ -162,24 +153,21 @@ review: score: 6 max: 6 passed: true - comment: 'Shows all aspects: close price, SMA, upper/lower bands. 120-day - range shows volatility patterns.' + comment: Shows all Bollinger Bands components - id: DQ-02 name: Realistic Context score: 5 max: 5 passed: true - comment: Real-world stock scenario; standard 20-period SMA with 2σ bands; - neutral, non-controversial. + comment: Realistic stock price data with proper volatility - id: DQ-03 name: Appropriate Scale score: 4 max: 4 passed: true - comment: Price range $120–185 realistic; volatility and proportions factually - sound. + comment: Sensible $100-$180 price range code_quality: - score: 7 + score: 8 max: 10 items: - id: CQ-01 @@ -187,59 +175,53 @@ review: score: 3 max: 3 passed: true - comment: 'Linear flow: imports → data generation → calculations → plot → render. - No functions/classes.' + comment: Simple, straightforward code - id: CQ-02 name: Reproducibility score: 2 max: 2 passed: true - comment: np.random.seed(42) ensures deterministic output. + comment: np.random.seed(42) set - id: CQ-03 name: Clean Imports score: 2 max: 2 passed: true - comment: numpy, pygal, pygal.style.Style all used. No unused imports. + comment: Only necessary imports - id: CQ-04 name: Code Elegance - score: 0 + score: 1 max: 2 passed: false - comment: 'CRITICAL: Does not use os.getenv(''ANYPLOT_THEME''). Hardcodes background=''white'' - and foreground=''#333333''. Should apply theme-adaptive tokens from style - guide.' + comment: Functional but uses hard-coded colors/backgrounds instead of theme + tokens - id: CQ-05 name: Output & API score: 0 max: 1 passed: false - comment: 'CRITICAL: Saves to hardcoded ''plot.png'' and ''plot.html''. Must - save to f''plot-{THEME}.png'' and f''plot-{THEME}.html''.' + comment: 'CRITICAL: Saves to plot.png/plot.html instead of plot-{THEME}.png/plot-{THEME}.html' library_mastery: - score: 7 + score: 4 max: 10 items: - id: LM-01 name: Idiomatic Usage - score: 5 + score: 3 max: 5 - passed: true - comment: pygal.Line(), custom Style, chart.add(), stroke_style, interpolate - parameters all idiomatic. + passed: false + comment: Uses pygal.Line and Style correctly, but missing critical theme adaptation + pattern - id: LM-02 name: Distinctive Features - score: 2 + score: 1 max: 5 passed: false - comment: Attempts to use pygal.style.Style for theming (good intent) but doesn't - actually leverage ANYPLOT_THEME env variable. Standard feature usage, not - distinctive. + comment: Uses fill=True and dashed lines (basic features, not distinctive) verdict: REJECTED impl_tags: dependencies: [] - techniques: - - html-export + techniques: [] patterns: - data-generation dataprep: [] From 8385e7d7ff94b9c63e09b58d1044571ffd767e71 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 17 May 2026 10:13:28 +0000 Subject: [PATCH 5/5] chore(pygal): update quality score 67 and review feedback for indicator-bollinger --- .../implementations/python/pygal.py | 2 +- .../metadata/python/pygal.yaml | 146 +++++++++--------- 2 files changed, 72 insertions(+), 76 deletions(-) diff --git a/plots/indicator-bollinger/implementations/python/pygal.py b/plots/indicator-bollinger/implementations/python/pygal.py index 883660f551..95cd1f5cc7 100644 --- a/plots/indicator-bollinger/implementations/python/pygal.py +++ b/plots/indicator-bollinger/implementations/python/pygal.py @@ -1,7 +1,7 @@ """ anyplot.ai indicator-bollinger: Bollinger Bands Indicator Chart Library: pygal 3.1.0 | Python 3.13.13 -Quality: 53/100 | Updated: 2026-05-17 +Quality: 67/100 | Updated: 2026-05-17 """ import numpy as np diff --git a/plots/indicator-bollinger/metadata/python/pygal.yaml b/plots/indicator-bollinger/metadata/python/pygal.yaml index 02bde930dc..aea8038a5d 100644 --- a/plots/indicator-bollinger/metadata/python/pygal.yaml +++ b/plots/indicator-bollinger/metadata/python/pygal.yaml @@ -2,7 +2,7 @@ library: pygal language: python specification_id: indicator-bollinger created: '2026-01-07T20:21:42Z' -updated: '2026-05-17T10:06:47Z' +updated: '2026-05-17T10:13:28Z' generated_by: claude-haiku workflow_run: 25987481141 issue: 3237 @@ -12,111 +12,108 @@ preview_url_light: https://storage.googleapis.com/anyplot-images/plots/indicator preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.png preview_html_light: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-light.html preview_html_dark: https://storage.googleapis.com/anyplot-images/plots/indicator-bollinger/python/pygal/plot-dark.html -quality_score: 53 +quality_score: 67 review: strengths: - - Correct chart type for Bollinger Bands - - All required data series present (Close, SMA, Upper/Lower bands) - - Good data generation with realistic price movements - - Readable layout and no overlapping elements + - 'Both renders display correct background colors (#FAF8F1 light, #1A1A17 dark)' + - Proper Bollinger Bands mathematical calculation (20-period SMA with 2 std dev) + - All required data series are visualized + - Text is readable in both light and dark themes + - Realistic, non-controversial synthetic data weaknesses: - - 'Palette compliance failure: uses #306998 (blue) for first series instead of #009E73 - (brand green)' - - 'No theme adaptation: hard-coded white background instead of reading ANYPLOT_THEME - and using #FAF8F1 (light) / #1A1A17 (dark)' - - Output files saved as plot.png/plot.html instead of plot-{THEME}.png/plot-{THEME}.html - - 'Title format incorrect: shows ''pyplots.ai'' instead of ''anyplot.ai''' - - 'Dark theme text legibility compromised: dark/muted text on dark background (ax - foreground colors not theme-adapted)' + - 'Palette non-compliance: uses arbitrary colors instead of Okabe-Ito; fails CVD + safety requirement' + - 'Theme adaptation failure: code doesn''t read ANYPLOT_THEME; hardcoded for light + theme' + - 'Title format incorrect: should be ''indicator-bollinger · pygal · anyplot.ai'' + (note: anyplot, not pyplots)' + - 'Wrong output filenames: uses ''plot.png'' instead of theme-aware ''plot-{THEME}.png''' + - 'Band visualization unclear: lines shown separately; no clear semi-transparent + fill as spec requests' + - 'Design excellence absent: no custom styling or visual hierarchy' image_description: |- Light render (plot-light.png): - Background: Off-white surface, appears to be pure white or very close (should be #FAF8F1) - Chrome: Title "Bollinger Band Indicator", axis labels "Trading Day" and "Price (USD)", tick labels visible - Data: Close Price (first series) appears as green/teal line; Upper Band (orange); Lower Band (blue); SMA dashed line (teal) - Palette: Colors are hard-coded #306998, #FFD43B, #5A9BD4, #8BC34A - NOT Okabe-Ito - Legibility verdict: PASS for text readability, but FAIL for palette compliance + Background: Warm off-white (#FAF8F1) - CORRECT + Chrome: Title "Bollinger Band Indicator", axis labels "Trading Day" / "Price (USD)" visible and readable with dark text + Data: Blue Close Price line, cyan upper/lower band lines, orange-gold SMA (20) dashed line + Legibility verdict: PASS - all text elements readable Dark render (plot-dark.png): - Background: Dark surface, appears to be near-black (matches #1A1A17 expectation) - Chrome: Title visible but appears dim/faint; axis labels present; tick labels are muted brown/tan - Data: Colors appear muted compared to light render - close price appears orange/gold instead of green - Issue: Dark-on-dark detected - muted foreground color (#333333) on dark background creates poor contrast - Data colors: NOT identical to light render (first series changed from green to orange-ish), violating theme consistency rule - Legibility verdict: FAIL - text contrast insufficient on dark background, data colors changed between renders instead of remaining constant - - Both renders FAIL theme-readiness check: background is hard-coded white (light) with no adaptation to ANYPLOT_THEME environment variable; colors are not Okabe-Ito compliant. + Background: Warm near-black (#1A1A17) - CORRECT + Chrome: Title, axis labels visible with light text, good contrast, no dark-on-dark failures + Data: Colors identical to light render (blue, cyan, orange) - correct theme-independence + Legibility verdict: PASS - all text readable, no contrast issues criteria_checklist: visual_quality: - score: 26 + score: 21 max: 30 items: - id: VQ-01 name: Text Legibility - score: 6 + score: 7 max: 8 - passed: false - comment: Light readable; dark theme has poor contrast (dark text on dark background) + passed: true + comment: Most text readable; legend could be larger - id: VQ-02 name: No Overlap - score: 6 + score: 5 max: 6 passed: true - comment: No overlapping elements + comment: Some overlap where lines cross but distinguishable - id: VQ-03 name: Element Visibility - score: 6 + score: 5 max: 6 passed: true - comment: All lines and markers clearly visible + comment: All visible; band fill effect unclear - id: VQ-04 name: Color Accessibility - score: 2 + score: 0 max: 2 - passed: true - comment: Distinct colors, but not Okabe-Ito safe palette + passed: false + comment: Colors not Okabe-Ito; lacks CVD safety - id: VQ-05 name: Layout & Canvas - score: 4 + score: 3 max: 4 passed: true - comment: Good proportions, nothing cut off + comment: Good proportions; legend slightly cramped - id: VQ-06 name: Axis Labels & Title - score: 2 + score: 1 max: 2 - passed: true - comment: Labels present but title format wrong + passed: false + comment: Axis labels good; title format incorrect - id: VQ-07 name: Palette Compliance score: 0 max: 2 passed: false - comment: 'CRITICAL: Uses #306998 (blue) instead of #009E73 for first series; - background hard-coded white, not theme-adaptive' + comment: Not Okabe-Ito; no theme adaptation design_excellence: - score: 8 + score: 7 max: 20 items: - id: DE-01 name: Aesthetic Sophistication - score: 4 + score: 2 max: 8 passed: false - comment: Generic styling with default colors + comment: Generic styling, arbitrary colors - id: DE-02 name: Visual Refinement score: 2 max: 6 passed: false - comment: Minimal customization, default appearance + comment: Minimal customization - id: DE-03 name: Data Storytelling - score: 2 + score: 3 max: 6 - passed: false - comment: Functional but no visual hierarchy or emphasis + passed: true + comment: Shows data but lacks hierarchy spec_compliance: - score: 14 + score: 13 max: 15 items: - id: SC-01 @@ -124,26 +121,25 @@ review: score: 5 max: 5 passed: true - comment: Correct line chart for Bollinger Bands + comment: Line chart correct - id: SC-02 name: Required Features - score: 4 + score: 3 max: 4 passed: true - comment: Close price, SMA, upper/lower bands all present + comment: All series present; band visualization unclear - id: SC-03 name: Data Mapping score: 3 max: 3 passed: true - comment: Axes show all 120 days of data correctly + comment: X/Y correct - id: SC-04 name: Title & Legend score: 2 max: 3 passed: false - comment: 'Title format wrong: ''pyplots.ai'' instead of ''anyplot.ai''; legend - present' + comment: Title format incorrect data_quality: score: 15 max: 15 @@ -153,19 +149,19 @@ review: score: 6 max: 6 passed: true - comment: Shows all Bollinger Bands components + comment: All aspects shown - id: DQ-02 name: Realistic Context score: 5 max: 5 passed: true - comment: Realistic stock price data with proper volatility + comment: Realistic BB calculation - id: DQ-03 name: Appropriate Scale score: 4 max: 4 passed: true - comment: Sensible $100-$180 price range + comment: Sensible values code_quality: score: 8 max: 10 @@ -175,54 +171,54 @@ review: score: 3 max: 3 passed: true - comment: Simple, straightforward code + comment: Simple structure - id: CQ-02 name: Reproducibility score: 2 max: 2 passed: true - comment: np.random.seed(42) set + comment: Has seed - id: CQ-03 name: Clean Imports score: 2 max: 2 passed: true - comment: Only necessary imports + comment: Only used imports - id: CQ-04 name: Code Elegance score: 1 max: 2 passed: false - comment: Functional but uses hard-coded colors/backgrounds instead of theme - tokens + comment: Hardcoded for light theme - id: CQ-05 name: Output & API score: 0 max: 1 passed: false - comment: 'CRITICAL: Saves to plot.png/plot.html instead of plot-{THEME}.png/plot-{THEME}.html' + comment: Wrong filenames library_mastery: - score: 4 + score: 3 max: 10 items: - id: LM-01 name: Idiomatic Usage - score: 3 + score: 2 max: 5 passed: false - comment: Uses pygal.Line and Style correctly, but missing critical theme adaptation - pattern + comment: No ANYPLOT_THEME integration - id: LM-02 name: Distinctive Features score: 1 max: 5 passed: false - comment: Uses fill=True and dashed lines (basic features, not distinctive) + comment: Generic usage verdict: REJECTED impl_tags: dependencies: [] - techniques: [] + techniques: + - html-export patterns: - data-generation - dataprep: [] + dataprep: + - rolling-window styling: []