From d421255b9602c4abe17a40b05b144ae9f70aa17f Mon Sep 17 00:00:00 2001 From: Markus Neusinger <2921697+MarkusNeusinger@users.noreply.github.com> Date: Tue, 7 Apr 2026 19:50:04 +0200 Subject: [PATCH 1/7] =?UTF-8?q?update(qrcode-basic):=20plotly=20=E2=80=94?= =?UTF-8?q?=20use=20real=20qrcode=20library=20for=20scannable=20QR=20codes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #3413: Replace manual QR matrix construction with proper qrcode library encoding. --- plots/qrcode-basic/implementations/plotly.py | 47 +++++++------------- plots/qrcode-basic/metadata/plotly.yaml | 10 ++--- plots/qrcode-basic/specification.md | 3 +- plots/qrcode-basic/specification.yaml | 3 +- 4 files changed, 24 insertions(+), 39 deletions(-) diff --git a/plots/qrcode-basic/implementations/plotly.py b/plots/qrcode-basic/implementations/plotly.py index d0f154cb0f..c7c29a10b1 100644 --- a/plots/qrcode-basic/implementations/plotly.py +++ b/plots/qrcode-basic/implementations/plotly.py @@ -1,7 +1,7 @@ -""" pyplots.ai +"""pyplots.ai qrcode-basic: Basic QR Code Generator -Library: plotly 6.5.0 | Python 3.13.11 -Quality: 91/100 | Created: 2026-01-07 +Library: plotly 6.6.0 | Python 3.14.3 +Quality: /100 | Updated: 2026-04-07 """ import numpy as np @@ -11,58 +11,43 @@ # Data - Generate QR code for pyplots.ai content = "https://pyplots.ai" -error_correction = qrcode.constants.ERROR_CORRECT_M # 15% error correction -qr = qrcode.QRCode( - version=1, - error_correction=error_correction, - box_size=1, - border=4, # Quiet zone -) +qr = qrcode.QRCode(version=None, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=1, border=4) qr.add_data(content) qr.make(fit=True) -# Convert QR code to numpy array (0=white, 1=black) +# Convert QR matrix to numpy array (True=black module, False=white) qr_matrix = np.array(qr.get_matrix(), dtype=int) -# Invert so black=1, white=0 for proper display -qr_display = 1 - qr_matrix - -# Create figure with heatmap +# Plot - Render as heatmap (1=black, 0=white) fig = go.Figure( - data=go.Heatmap(z=qr_display, colorscale=[[0, "#000000"], [1, "#FFFFFF"]], showscale=False, xgap=0, ygap=0) + data=go.Heatmap(z=qr_matrix, colorscale=[[0, "#FFFFFF"], [1, "#000000"]], showscale=False, xgap=0, ygap=0) ) -# Layout for square display +# Style fig.update_layout( title={ "text": "qrcode-basic · plotly · pyplots.ai", - "font": {"size": 28, "color": "#306998"}, + "font": {"size": 32, "color": "#306998"}, "x": 0.5, "xanchor": "center", }, xaxis={"showticklabels": False, "showgrid": False, "zeroline": False, "scaleanchor": "y", "scaleratio": 1}, - yaxis={ - "showticklabels": False, - "showgrid": False, - "zeroline": False, - "autorange": "reversed", # Flip to show QR code correctly - }, + yaxis={"showticklabels": False, "showgrid": False, "zeroline": False, "autorange": "reversed"}, template="plotly_white", - margin={"l": 150, "r": 150, "t": 200, "b": 350}, + margin={"l": 80, "r": 80, "t": 160, "b": 240}, paper_bgcolor="white", plot_bgcolor="white", ) -# Add annotations below the plot fig.add_annotation( text=f"Content: {content}", xref="paper", yref="paper", x=0.5, - y=-0.05, + y=-0.04, showarrow=False, - font={"size": 28, "color": "#666666"}, + font={"size": 32, "color": "#666666"}, xanchor="center", yanchor="top", ) @@ -71,13 +56,13 @@ xref="paper", yref="paper", x=0.5, - y=-0.10, + y=-0.09, showarrow=False, - font={"size": 24, "color": "#888888"}, + font={"size": 28, "color": "#888888"}, xanchor="center", yanchor="top", ) -# Save outputs +# Save fig.write_image("plot.png", width=3600, height=3600, scale=1) fig.write_html("plot.html") diff --git a/plots/qrcode-basic/metadata/plotly.yaml b/plots/qrcode-basic/metadata/plotly.yaml index a86a041766..7e829cee47 100644 --- a/plots/qrcode-basic/metadata/plotly.yaml +++ b/plots/qrcode-basic/metadata/plotly.yaml @@ -1,15 +1,15 @@ library: plotly specification_id: qrcode-basic created: '2026-01-07T16:30:22Z' -updated: '2026-01-07T16:38:15Z' -generated_by: claude-opus-4-5-20251101 +updated: '2026-04-07T17:45:00+00:00' +generated_by: claude-opus-4-6 workflow_run: 20788378599 issue: 3184 -python_version: 3.13.11 -library_version: 6.5.0 +python_version: '3.14.3' +library_version: '6.6.0' preview_url: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.png preview_html: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.html -quality_score: 91 +quality_score: null review: strengths: - Excellent use of Plotly heatmap to render QR code matrix diff --git a/plots/qrcode-basic/specification.md b/plots/qrcode-basic/specification.md index fba398aae3..31d65df020 100644 --- a/plots/qrcode-basic/specification.md +++ b/plots/qrcode-basic/specification.md @@ -24,6 +24,7 @@ A QR (Quick Response) code visualization that encodes text or URL data into a sq - Include a quiet zone (white border) around the QR code for reliable scanning - Use high contrast black on white for maximum readability - Position detection patterns (finder patterns) in three corners are required -- Recommended libraries: `qrcode` (with PIL), `segno`, or `pyqrcode` +- Recommended libraries: `qrcode` (primary, with PIL for rendering), `segno`, or `pyqrcode` - Output should be printable at 300 DPI for physical media - Error correction level M (15%) is a good default balance between capacity and reliability +- The generated QR code MUST be scannable by standard QR code readers — use a proper QR encoding library (`qrcode` is the primary recommendation) instead of manually constructing the QR matrix diff --git a/plots/qrcode-basic/specification.yaml b/plots/qrcode-basic/specification.yaml index 210079fa92..88abee5a64 100644 --- a/plots/qrcode-basic/specification.yaml +++ b/plots/qrcode-basic/specification.yaml @@ -6,7 +6,7 @@ title: Basic QR Code Generator # Specification tracking created: 2026-01-07T16:13:24Z -updated: null +updated: 2026-04-07T17:30:00Z issue: 3184 suggested: MarkusNeusinger @@ -18,7 +18,6 @@ tags: - barcode data_type: - text - - categorical domain: - general - technology From d3d2425c26acebff7bacdab97c0509fc75affa85 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Apr 2026 17:54:49 +0000 Subject: [PATCH 2/7] chore(plotly): update quality score 80 and review feedback for qrcode-basic --- plots/qrcode-basic/implementations/plotly.py | 4 +- plots/qrcode-basic/metadata/plotly.yaml | 232 ++++++++++--------- 2 files changed, 127 insertions(+), 109 deletions(-) diff --git a/plots/qrcode-basic/implementations/plotly.py b/plots/qrcode-basic/implementations/plotly.py index c7c29a10b1..7006c67267 100644 --- a/plots/qrcode-basic/implementations/plotly.py +++ b/plots/qrcode-basic/implementations/plotly.py @@ -1,7 +1,7 @@ -"""pyplots.ai +""" pyplots.ai qrcode-basic: Basic QR Code Generator Library: plotly 6.6.0 | Python 3.14.3 -Quality: /100 | Updated: 2026-04-07 +Quality: 80/100 | Updated: 2026-04-07 """ import numpy as np diff --git a/plots/qrcode-basic/metadata/plotly.yaml b/plots/qrcode-basic/metadata/plotly.yaml index 7e829cee47..9442515be1 100644 --- a/plots/qrcode-basic/metadata/plotly.yaml +++ b/plots/qrcode-basic/metadata/plotly.yaml @@ -1,148 +1,161 @@ library: plotly specification_id: qrcode-basic created: '2026-01-07T16:30:22Z' -updated: '2026-04-07T17:45:00+00:00' +updated: '2026-04-07T17:54:49Z' generated_by: claude-opus-4-6 workflow_run: 20788378599 issue: 3184 -python_version: '3.14.3' -library_version: '6.6.0' +python_version: 3.14.3 +library_version: 6.6.0 preview_url: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.png preview_html: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.html -quality_score: null +quality_score: 80 review: strengths: - - Excellent use of Plotly heatmap to render QR code matrix - - Clean code structure with proper quiet zone (border=4) - - Appropriate square aspect ratio with scaleanchor for 1:1 ratio - - Good use of annotations to display encoded content and error correction level - - Generates both PNG and interactive HTML outputs - - High contrast black/white colorscale for maximum scanability + - Uses proper qrcode library producing a scannable QR code as spec requires + - Perfect spec compliance with correct title format, quiet zone, error correction + level M + - Clean, deterministic code with KISS structure and no unnecessary complexity + - Dual output (PNG + HTML) leverages Plotly interactive capability weaknesses: - - Annotation text font sizes (28pt, 24pt) are on the smaller side relative to 3600px - canvas - - Could use slightly tighter margins to make QR code larger on canvas - image_description: 'The plot displays a QR code encoding "https://pyplots.ai" rendered - as a black and white square matrix barcode. The QR code features the standard - three finder patterns (large squares) in the top-left, top-right, and bottom-left - corners. The title "qrcode-basic · plotly · pyplots.ai" appears at the top in - blue (#306998) color. Below the QR code, two annotation lines display: "Content: - https://pyplots.ai" in gray and "Error Correction: M (15%)" in lighter gray. The - QR code is centered on a white background with adequate quiet zone (white border) - around it. The overall layout is square (3600×3600 px).' + - Error Correction annotation cut off / not visible in rendered image due to margin/positioning + issue + - Title and annotation text appear small relative to 3600x3600 canvas + - Excessive whitespace between QR code and bottom of canvas with unbalanced margins + - Design is functional but lacks polish — no visual framing, hierarchy, or refinement + beyond defaults + image_description: 'The plot shows a QR code rendered as a black and white heatmap + on a square 3600x3600 canvas. The title "qrcode-basic · plotly · pyplots.ai" appears + at the top center in Python Blue (#306998) text, though it appears relatively + small for the canvas size. The QR code itself is well-rendered with three finder + patterns (large concentric squares) in the top-left, top-right, and bottom-left + corners, surrounded by a proper quiet zone (white border). The data pattern fills + the interior with a clear black-on-white grid. At the very bottom, "Content: https://pyplots.ai" + appears in small gray text. The "Error Correction: M (15%)" annotation from the + code is not visible in the rendered image — it appears to be cut off below the + visible area. There is significant whitespace between the QR code and the bottom + annotation, and above the QR code below the title.' criteria_checklist: visual_quality: - score: 37 - max: 40 + score: 25 + max: 30 items: - id: VQ-01 name: Text Legibility - score: 9 - max: 10 + score: 5 + max: 8 passed: true - comment: Title and annotations are readable, though annotation text could - be slightly larger + comment: Font sizes explicitly set (32, 28) but appear small relative to 3600x3600 + canvas - id: VQ-02 name: No Overlap - score: 8 - max: 8 + score: 6 + max: 6 passed: true - comment: No overlapping elements + comment: No overlapping text elements - id: VQ-03 name: Element Visibility - score: 8 - max: 8 + score: 6 + max: 6 passed: true - comment: QR code modules are clearly visible with crisp black/white contrast + comment: QR code modules crisp and clearly visible with maximum contrast - id: VQ-04 name: Color Accessibility - score: 5 - max: 5 + score: 4 + max: 4 passed: true - comment: Perfect black on white, maximum contrast + comment: Black on white provides maximum contrast, fully accessible - id: VQ-05 - name: Layout Balance - score: 5 - max: 5 - passed: true - comment: QR code well-centered with appropriate quiet zone, good canvas utilization + name: Layout & Canvas + score: 2 + max: 4 + passed: false + comment: Error correction annotation cut off, excessive whitespace below QR + code, unbalanced margins - id: VQ-06 - name: Axis Labels + name: Axis Labels & Title score: 2 max: 2 passed: true - comment: N/A for QR codes, axes hidden appropriately - - id: VQ-07 - name: Grid & Legend - score: 0 - max: 2 - passed: true - comment: N/A, no grid or legend needed + comment: Title in correct format, axes appropriately hidden for QR code + design_excellence: + score: 9 + max: 20 + items: + - id: DE-01 + name: Aesthetic Sophistication + score: 4 + max: 8 + passed: false + comment: 'Well-configured default: Python Blue title, clean B&W QR, but not + exceptional' + - id: DE-02 + name: Visual Refinement + score: 3 + max: 6 + passed: false + comment: Axes/grid hidden, plotly_white template, but large unbalanced whitespace + gaps + - id: DE-03 + name: Data Storytelling + score: 2 + max: 6 + passed: false + comment: Content annotation identifies encoding but no visual storytelling + or hierarchy spec_compliance: - score: 25 - max: 25 + score: 15 + max: 15 items: - id: SC-01 name: Plot Type - score: 8 - max: 8 - passed: true - comment: Correct QR code visualization - - id: SC-02 - name: Data Mapping score: 5 max: 5 passed: true - comment: URL correctly encoded into QR matrix - - id: SC-03 + comment: Correct QR code visualization using proper qrcode library + - id: SC-02 name: Required Features - score: 5 - max: 5 + score: 4 + max: 4 passed: true - comment: Quiet zone, high contrast, finder patterns present, error correction - M - - id: SC-04 - name: Data Range + comment: Quiet zone, high contrast B&W, finder patterns, error correction + M, scannable + - id: SC-03 + name: Data Mapping score: 3 max: 3 passed: true - comment: Full QR code visible with proper borders - - id: SC-05 - name: Legend Accuracy - score: 2 - max: 2 - passed: true - comment: Content and error correction level displayed correctly - - id: SC-06 - name: Title Format - score: 2 - max: 2 + comment: QR matrix correctly mapped to heatmap, y-axis reversed + - id: SC-04 + name: Title & Legend + score: 3 + max: 3 passed: true - comment: 'Correct format: qrcode-basic · plotly · pyplots.ai' + comment: Title format correct, no legend needed data_quality: - score: 17 - max: 20 + score: 14 + max: 15 items: - id: DQ-01 name: Feature Coverage - score: 6 - max: 8 + score: 5 + max: 6 passed: true - comment: Shows standard QR code, could demonstrate more complex content + comment: Shows QR code with all main features but only one content example - id: DQ-02 name: Realistic Context - score: 7 - max: 7 + score: 5 + max: 5 passed: true - comment: Real URL to pyplots.ai, practical use case + comment: Encodes real, relevant URL (https://pyplots.ai) - id: DQ-03 name: Appropriate Scale score: 4 - max: 5 + max: 4 passed: true - comment: Good size, though could be slightly larger + comment: QR version auto-fitted, appropriate for URL content length code_quality: - score: 9 + score: 10 max: 10 items: - id: CQ-01 @@ -150,43 +163,48 @@ review: score: 3 max: 3 passed: true - comment: Clean imports → data → plot → save structure + comment: Clean imports, data, plot, style, save structure - id: CQ-02 name: Reproducibility - score: 3 - max: 3 + score: 2 + max: 2 passed: true - comment: QR code generation is deterministic for same input + comment: 'Deterministic: same URL always produces identical QR code' - id: CQ-03 name: Clean Imports score: 2 max: 2 passed: true - comment: Only necessary imports (numpy, plotly, qrcode) + comment: All imports (numpy, plotly.graph_objects, qrcode) used - id: CQ-04 - name: No Deprecated API - score: 1 - max: 1 + name: Code Elegance + score: 2 + max: 2 passed: true - comment: Uses current plotly API + comment: Clean, Pythonic, appropriate complexity - id: CQ-05 - name: Output Correct - score: 0 + name: Output & API + score: 1 max: 1 passed: true - comment: Saves as plot.png AND plot.html (correct) - library_features: - score: 3 - max: 5 + comment: Saves plot.png and plot.html, current API + library_mastery: + score: 7 + max: 10 items: - - id: LF-01 + - id: LM-01 + name: Idiomatic Usage + score: 4 + max: 5 + passed: true + comment: Good use of go.Heatmap, update_layout, add_annotation, scaleanchor + - id: LM-02 name: Distinctive Features score: 3 max: 5 passed: true - comment: Uses Plotly heatmap and annotation features, generates interactive - HTML - verdict: APPROVED + comment: HTML export for interactive version, scaleanchor constraint + verdict: REJECTED impl_tags: dependencies: - qrcode From 971544cc54bfdca080b15b4a8e58e43f8ebc25d4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Apr 2026 18:01:46 +0000 Subject: [PATCH 3/7] fix(plotly): address review feedback for qrcode-basic Attempt 1/3 - fixes based on AI review --- plots/qrcode-basic/implementations/plotly.py | 62 +++++++++++++++----- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/plots/qrcode-basic/implementations/plotly.py b/plots/qrcode-basic/implementations/plotly.py index 7006c67267..ad4988f332 100644 --- a/plots/qrcode-basic/implementations/plotly.py +++ b/plots/qrcode-basic/implementations/plotly.py @@ -1,7 +1,6 @@ -""" pyplots.ai +"""pyplots.ai qrcode-basic: Basic QR Code Generator Library: plotly 6.6.0 | Python 3.14.3 -Quality: 80/100 | Updated: 2026-04-07 """ import numpy as np @@ -16,49 +15,82 @@ qr.add_data(content) qr.make(fit=True) -# Convert QR matrix to numpy array (True=black module, False=white) qr_matrix = np.array(qr.get_matrix(), dtype=int) +n_modules = qr_matrix.shape[0] # Plot - Render as heatmap (1=black, 0=white) fig = go.Figure( - data=go.Heatmap(z=qr_matrix, colorscale=[[0, "#FFFFFF"], [1, "#000000"]], showscale=False, xgap=0, ygap=0) + data=go.Heatmap(z=qr_matrix, colorscale=[[0, "#FFFFFF"], [1, "#1a1a2e"]], showscale=False, xgap=0.3, ygap=0.3) ) # Style fig.update_layout( title={ "text": "qrcode-basic · plotly · pyplots.ai", - "font": {"size": 32, "color": "#306998"}, + "font": {"size": 52, "color": "#306998", "family": "Arial Black, sans-serif"}, "x": 0.5, "xanchor": "center", + "y": 0.97, + }, + xaxis={ + "showticklabels": False, + "showgrid": False, + "zeroline": False, + "scaleanchor": "y", + "scaleratio": 1, + "constrain": "domain", + "showline": False, + "range": [-0.5, n_modules - 0.5], + }, + yaxis={ + "showticklabels": False, + "showgrid": False, + "zeroline": False, + "autorange": "reversed", + "constrain": "domain", + "showline": False, + "range": [-0.5, n_modules - 0.5], }, - xaxis={"showticklabels": False, "showgrid": False, "zeroline": False, "scaleanchor": "y", "scaleratio": 1}, - yaxis={"showticklabels": False, "showgrid": False, "zeroline": False, "autorange": "reversed"}, template="plotly_white", - margin={"l": 80, "r": 80, "t": 160, "b": 240}, - paper_bgcolor="white", + margin={"l": 60, "r": 60, "t": 200, "b": 320}, + paper_bgcolor="#f8f9fa", plot_bgcolor="white", ) +# Subtle divider line between QR code and annotations +fig.add_shape( + type="line", + xref="paper", + yref="paper", + x0=0.3, + y0=-0.015, + x1=0.7, + y1=-0.015, + line={"color": "#306998", "width": 1.5, "dash": "dot"}, +) + +# Content URL annotation - prominent, below plot area fig.add_annotation( - text=f"Content: {content}", + text=f"{content}", xref="paper", yref="paper", x=0.5, - y=-0.04, + y=-0.03, showarrow=False, - font={"size": 32, "color": "#666666"}, + font={"size": 44, "color": "#306998", "family": "Arial, sans-serif"}, xanchor="center", yanchor="top", ) + +# Error correction and version info fig.add_annotation( - text="Error Correction: M (15%)", + text=f"Error Correction: M (15%) · Version {qr.version} · {n_modules}×{n_modules} modules", xref="paper", yref="paper", x=0.5, - y=-0.09, + y=-0.06, showarrow=False, - font={"size": 28, "color": "#888888"}, + font={"size": 36, "color": "#888888", "family": "Arial, sans-serif"}, xanchor="center", yanchor="top", ) From 700551bcde85f5e792fca5e8343a51265f999142 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Apr 2026 18:04:56 +0000 Subject: [PATCH 4/7] chore(plotly): update quality score 86 and review feedback for qrcode-basic --- plots/qrcode-basic/implementations/plotly.py | 3 +- plots/qrcode-basic/metadata/plotly.yaml | 129 ++++++++++--------- 2 files changed, 67 insertions(+), 65 deletions(-) diff --git a/plots/qrcode-basic/implementations/plotly.py b/plots/qrcode-basic/implementations/plotly.py index ad4988f332..7471c8334e 100644 --- a/plots/qrcode-basic/implementations/plotly.py +++ b/plots/qrcode-basic/implementations/plotly.py @@ -1,6 +1,7 @@ -"""pyplots.ai +""" pyplots.ai qrcode-basic: Basic QR Code Generator Library: plotly 6.6.0 | Python 3.14.3 +Quality: 86/100 | Updated: 2026-04-07 """ import numpy as np diff --git a/plots/qrcode-basic/metadata/plotly.yaml b/plots/qrcode-basic/metadata/plotly.yaml index 9442515be1..ab08de9e2a 100644 --- a/plots/qrcode-basic/metadata/plotly.yaml +++ b/plots/qrcode-basic/metadata/plotly.yaml @@ -1,7 +1,7 @@ library: plotly specification_id: qrcode-basic created: '2026-01-07T16:30:22Z' -updated: '2026-04-07T17:54:49Z' +updated: '2026-04-07T18:04:55Z' generated_by: claude-opus-4-6 workflow_run: 20788378599 issue: 3184 @@ -9,100 +9,99 @@ python_version: 3.14.3 library_version: 6.6.0 preview_url: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.png preview_html: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.html -quality_score: 80 +quality_score: 86 review: strengths: - - Uses proper qrcode library producing a scannable QR code as spec requires - - Perfect spec compliance with correct title format, quiet zone, error correction - level M - - Clean, deterministic code with KISS structure and no unnecessary complexity - - Dual output (PNG + HTML) leverages Plotly interactive capability + - Uses qrcode library for genuine scannable QR code generation + - Clean design with dark navy modules, light gray background, and blue accent color + scheme + - Informative annotations showing encoded URL, error correction level, version, + and module count + - Produces both static PNG and interactive HTML output + - Perfect spec compliance with all required features present weaknesses: - - Error Correction annotation cut off / not visible in rendered image due to margin/positioning - issue - - Title and annotation text appear small relative to 3600x3600 canvas - - Excessive whitespace between QR code and bottom of canvas with unbalanced margins - - Design is functional but lacks polish — no visual framing, hierarchy, or refinement - beyond defaults - image_description: 'The plot shows a QR code rendered as a black and white heatmap - on a square 3600x3600 canvas. The title "qrcode-basic · plotly · pyplots.ai" appears - at the top center in Python Blue (#306998) text, though it appears relatively - small for the canvas size. The QR code itself is well-rendered with three finder - patterns (large concentric squares) in the top-left, top-right, and bottom-left - corners, surrounded by a proper quiet zone (white border). The data pattern fills - the interior with a clear black-on-white grid. At the very bottom, "Content: https://pyplots.ai" - appears in small gray text. The "Error Correction: M (15%)" annotation from the - code is not visible in the rendered image — it appears to be cut off below the - visible area. There is significant whitespace between the QR code and the bottom - annotation, and above the QR code below the title.' + - Bottom margin is excessive (b=320), creating too much empty space below the QR + code + - Module gap (xgap/ygap=0.3) introduces visible grid lines between modules reducing + clean QR appearance + - Design could be elevated further with more distinctive visual treatment + image_description: 'The plot displays a QR code rendered as a Plotly heatmap on + a 3600x3600 square canvas. The QR code uses dark navy (#1a1a2e) modules on a white + background, with three finder patterns clearly visible in the top-left, top-right, + and bottom-left corners. The paper background is light gray (#f8f9fa). The title + "qrcode-basic · plotly · pyplots.ai" appears at the top in blue (Arial Black). + Below the QR code area, a subtle dotted blue divider line separates the code from + annotations. The encoded URL "https://pyplots.ai" is displayed prominently in + bold blue text, followed by gray metadata text reading "Error Correction: M (15%) + · Version 2 · 33×33 modules". Small gaps between modules (xgap/ygap) give the + QR code a subtle grid texture.' criteria_checklist: visual_quality: - score: 25 + score: 28 max: 30 items: - id: VQ-01 name: Text Legibility - score: 5 + score: 7 max: 8 passed: true - comment: Font sizes explicitly set (32, 28) but appear small relative to 3600x3600 - canvas + comment: All font sizes explicitly set (title 52, URL 44, info 36). Info text + slightly small relative to canvas. - id: VQ-02 name: No Overlap score: 6 max: 6 passed: true - comment: No overlapping text elements + comment: No overlapping elements. - id: VQ-03 name: Element Visibility score: 6 max: 6 passed: true - comment: QR code modules crisp and clearly visible with maximum contrast + comment: QR modules crisp and clearly visible with excellent contrast. - id: VQ-04 name: Color Accessibility score: 4 max: 4 passed: true - comment: Black on white provides maximum contrast, fully accessible + comment: High contrast dark navy on white. - id: VQ-05 name: Layout & Canvas - score: 2 + score: 3 max: 4 - passed: false - comment: Error correction annotation cut off, excessive whitespace below QR - code, unbalanced margins + passed: true + comment: Good QR code size but excessive bottom margin (b=320) wastes space. - id: VQ-06 name: Axis Labels & Title score: 2 max: 2 passed: true - comment: Title in correct format, axes appropriately hidden for QR code + comment: Title correctly formatted. No axes needed for QR code. design_excellence: - score: 9 + score: 12 max: 20 items: - id: DE-01 name: Aesthetic Sophistication - score: 4 + score: 5 max: 8 - passed: false - comment: 'Well-configured default: Python Blue title, clean B&W QR, but not - exceptional' + passed: true + comment: Dark navy modules, light gray background, blue accents, dotted divider. + Above defaults but not publication-level. - id: DE-02 name: Visual Refinement - score: 3 + score: 4 max: 6 - passed: false - comment: Axes/grid hidden, plotly_white template, but large unbalanced whitespace - gaps + passed: true + comment: Axes/ticks/grid hidden, subtle module gaps, dotted divider, generous + whitespace. - id: DE-03 name: Data Storytelling - score: 2 + score: 3 max: 6 - passed: false - comment: Content annotation identifies encoding but no visual storytelling - or hierarchy + passed: true + comment: URL and metadata annotations create information hierarchy. Could + emphasize scan purpose more. spec_compliance: score: 15 max: 15 @@ -112,26 +111,26 @@ review: score: 5 max: 5 passed: true - comment: Correct QR code visualization using proper qrcode library + comment: Correct QR code visualization using qrcode library. - id: SC-02 name: Required Features score: 4 max: 4 passed: true - comment: Quiet zone, high contrast B&W, finder patterns, error correction - M, scannable + comment: Quiet zone, high contrast, finder patterns, error correction M, proper + qrcode library. - id: SC-03 name: Data Mapping score: 3 max: 3 passed: true - comment: QR matrix correctly mapped to heatmap, y-axis reversed + comment: QR matrix correctly mapped to heatmap with proper y-axis reversal. - id: SC-04 name: Title & Legend score: 3 max: 3 passed: true - comment: Title format correct, no legend needed + comment: Title matches required format. No legend needed. data_quality: score: 14 max: 15 @@ -141,19 +140,20 @@ review: score: 5 max: 6 passed: true - comment: Shows QR code with all main features but only one content example + comment: Complete valid QR code with all standard features. Could show more + QR features with higher version. - id: DQ-02 name: Realistic Context score: 5 max: 5 passed: true - comment: Encodes real, relevant URL (https://pyplots.ai) + comment: Encodes https://pyplots.ai - a real, meaningful, neutral URL. - id: DQ-03 name: Appropriate Scale score: 4 max: 4 passed: true - comment: QR version auto-fitted, appropriate for URL content length + comment: Version 2, 33x33 modules, error correction M - all appropriate. code_quality: score: 10 max: 10 @@ -163,31 +163,31 @@ review: score: 3 max: 3 passed: true - comment: Clean imports, data, plot, style, save structure + comment: Clean linear flow with no functions or classes. - id: CQ-02 name: Reproducibility score: 2 max: 2 passed: true - comment: 'Deterministic: same URL always produces identical QR code' + comment: Fully deterministic - same URL always produces identical QR code. - id: CQ-03 name: Clean Imports score: 2 max: 2 passed: true - comment: All imports (numpy, plotly.graph_objects, qrcode) used + comment: 'All imports used: numpy, plotly.graph_objects, qrcode.' - id: CQ-04 name: Code Elegance score: 2 max: 2 passed: true - comment: Clean, Pythonic, appropriate complexity + comment: Clean, appropriate complexity. - id: CQ-05 name: Output & API score: 1 max: 1 passed: true - comment: Saves plot.png and plot.html, current API + comment: Saves as plot.png and plot.html. Current API. library_mastery: score: 7 max: 10 @@ -197,13 +197,14 @@ review: score: 4 max: 5 passed: true - comment: Good use of go.Heatmap, update_layout, add_annotation, scaleanchor + comment: Good use of go.Heatmap, update_layout, add_annotation, add_shape, + scaleanchor. - id: LM-02 name: Distinctive Features score: 3 max: 5 passed: true - comment: HTML export for interactive version, scaleanchor constraint + comment: HTML export, annotations, shapes, heatmap with xgap/ygap. verdict: REJECTED impl_tags: dependencies: From cdce014649b09ecfee95280d6c1c4dee65abc09e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Apr 2026 18:14:17 +0000 Subject: [PATCH 5/7] chore(plotly): update quality score 89 and review feedback for qrcode-basic --- plots/qrcode-basic/implementations/plotly.py | 2 +- plots/qrcode-basic/metadata/plotly.yaml | 111 +++++++++---------- 2 files changed, 55 insertions(+), 58 deletions(-) diff --git a/plots/qrcode-basic/implementations/plotly.py b/plots/qrcode-basic/implementations/plotly.py index 7471c8334e..fad820af7e 100644 --- a/plots/qrcode-basic/implementations/plotly.py +++ b/plots/qrcode-basic/implementations/plotly.py @@ -1,7 +1,7 @@ """ pyplots.ai qrcode-basic: Basic QR Code Generator Library: plotly 6.6.0 | Python 3.14.3 -Quality: 86/100 | Updated: 2026-04-07 +Quality: 89/100 | Updated: 2026-04-07 """ import numpy as np diff --git a/plots/qrcode-basic/metadata/plotly.yaml b/plots/qrcode-basic/metadata/plotly.yaml index ab08de9e2a..e9e281c483 100644 --- a/plots/qrcode-basic/metadata/plotly.yaml +++ b/plots/qrcode-basic/metadata/plotly.yaml @@ -1,7 +1,7 @@ library: plotly specification_id: qrcode-basic created: '2026-01-07T16:30:22Z' -updated: '2026-04-07T18:04:55Z' +updated: '2026-04-07T18:14:16Z' generated_by: claude-opus-4-6 workflow_run: 20788378599 issue: 3184 @@ -9,32 +9,28 @@ python_version: 3.14.3 library_version: 6.6.0 preview_url: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.png preview_html: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.html -quality_score: 86 +quality_score: 89 review: strengths: - - Uses qrcode library for genuine scannable QR code generation - - Clean design with dark navy modules, light gray background, and blue accent color - scheme - - Informative annotations showing encoded URL, error correction level, version, - and module count - - Produces both static PNG and interactive HTML output - - Perfect spec compliance with all required features present + - Uses proper qrcode library for scannable QR code generation (spec requirement) + - Polished design with intentional color choices (dark navy, Python Blue accents, + light gray background) + - Clear visual hierarchy with title, QR code, divider, URL, and metadata + - Clean, deterministic code with KISS structure + - Dual output (PNG + HTML) leverages Plotly interactivity capability weaknesses: - - Bottom margin is excessive (b=320), creating too much empty space below the QR - code - - Module gap (xgap/ygap=0.3) introduces visible grid lines between modules reducing - clean QR appearance - - Design could be elevated further with more distinctive visual treatment + - Title appears slightly small relative to the 3600x3600 canvas + - Whitespace gap between bottom of QR code and annotations could be reduced for + tighter layout image_description: 'The plot displays a QR code rendered as a Plotly heatmap on - a 3600x3600 square canvas. The QR code uses dark navy (#1a1a2e) modules on a white - background, with three finder patterns clearly visible in the top-left, top-right, - and bottom-left corners. The paper background is light gray (#f8f9fa). The title - "qrcode-basic · plotly · pyplots.ai" appears at the top in blue (Arial Black). - Below the QR code area, a subtle dotted blue divider line separates the code from - annotations. The encoded URL "https://pyplots.ai" is displayed prominently in - bold blue text, followed by gray metadata text reading "Error Correction: M (15%) - · Version 2 · 33×33 modules". Small gaps between modules (xgap/ygap) give the - QR code a subtle grid texture.' + a 3600x3600 canvas. The QR code uses dark navy (#1a1a2e) modules on a white background + with slight gaps between modules (xgap/ygap=0.3). Three finder patterns are clearly + visible in the top-left, top-right, and bottom-left corners. The title "qrcode-basic + · plotly · pyplots.ai" appears at the top in blue (#306998) with an Arial Black + font against a light gray (#f8f9fa) paper background. Below the QR code, a subtle + dotted blue divider separates the code from annotations: the encoded URL "https://pyplots.ai" + in bold blue, and metadata "Error Correction M (15%) · Version 2 · 33×33 modules" + in gray (#888888).' criteria_checklist: visual_quality: score: 28 @@ -45,63 +41,64 @@ review: score: 7 max: 8 passed: true - comment: All font sizes explicitly set (title 52, URL 44, info 36). Info text - slightly small relative to canvas. + comment: All font sizes explicitly set (title 52pt, URL 44pt, metadata 36pt). + Title slightly small relative to canvas. - id: VQ-02 name: No Overlap score: 6 max: 6 passed: true - comment: No overlapping elements. + comment: No overlapping elements anywhere - id: VQ-03 name: Element Visibility score: 6 max: 6 passed: true - comment: QR modules crisp and clearly visible with excellent contrast. + comment: QR code modules crisp and clearly visible with good contrast - id: VQ-04 name: Color Accessibility score: 4 max: 4 passed: true - comment: High contrast dark navy on white. + comment: High contrast dark navy on white, fully colorblind-safe - id: VQ-05 name: Layout & Canvas score: 3 max: 4 passed: true - comment: Good QR code size but excessive bottom margin (b=320) wastes space. + comment: Good utilization but slightly excessive whitespace between QR code + and bottom annotations - id: VQ-06 name: Axis Labels & Title score: 2 max: 2 passed: true - comment: Title correctly formatted. No axes needed for QR code. + comment: Axes appropriately hidden; title and metadata descriptive design_excellence: - score: 12 + score: 15 max: 20 items: - id: DE-01 name: Aesthetic Sophistication - score: 5 + score: 6 max: 8 passed: true - comment: Dark navy modules, light gray background, blue accents, dotted divider. - Above defaults but not publication-level. + comment: Thoughtful design with custom dark navy palette, Python Blue accents, + light gray paper, intentional typographic hierarchy - id: DE-02 name: Visual Refinement - score: 4 + score: 5 max: 6 passed: true - comment: Axes/ticks/grid hidden, subtle module gaps, dotted divider, generous - whitespace. + comment: Axes/grid hidden, subtle dotted divider, generous whitespace, clean + layout - id: DE-03 name: Data Storytelling - score: 3 + score: 4 max: 6 passed: true - comment: URL and metadata annotations create information hierarchy. Could - emphasize scan purpose more. + comment: 'Clear visual hierarchy: QR code focal point, URL identification, + technical metadata' spec_compliance: score: 15 max: 15 @@ -111,26 +108,27 @@ review: score: 5 max: 5 passed: true - comment: Correct QR code visualization using qrcode library. + comment: Correct QR code visualization using proper qrcode library - id: SC-02 name: Required Features score: 4 max: 4 passed: true - comment: Quiet zone, high contrast, finder patterns, error correction M, proper - qrcode library. + comment: Quiet zone, high contrast, finder patterns, error correction M, qrcode + library - id: SC-03 name: Data Mapping score: 3 max: 3 passed: true - comment: QR matrix correctly mapped to heatmap with proper y-axis reversal. + comment: Matrix correctly rendered as heatmap with reversed y-axis and 1:1 + aspect ratio - id: SC-04 name: Title & Legend score: 3 max: 3 passed: true - comment: Title matches required format. No legend needed. + comment: Title matches required format; no legend needed data_quality: score: 14 max: 15 @@ -140,20 +138,20 @@ review: score: 5 max: 6 passed: true - comment: Complete valid QR code with all standard features. Could show more - QR features with higher version. + comment: Complete QR code with finder patterns, data modules, quiet zone, + timing patterns - id: DQ-02 name: Realistic Context score: 5 max: 5 passed: true - comment: Encodes https://pyplots.ai - a real, meaningful, neutral URL. + comment: Encodes https://pyplots.ai — a real, meaningful URL - id: DQ-03 name: Appropriate Scale score: 4 max: 4 passed: true - comment: Version 2, 33x33 modules, error correction M - all appropriate. + comment: Version 2, 33x33 modules — appropriate for URL content code_quality: score: 10 max: 10 @@ -163,31 +161,31 @@ review: score: 3 max: 3 passed: true - comment: Clean linear flow with no functions or classes. + comment: Clean imports, data, plot, style, save structure - id: CQ-02 name: Reproducibility score: 2 max: 2 passed: true - comment: Fully deterministic - same URL always produces identical QR code. + comment: Fully deterministic; qrcode library produces identical output - id: CQ-03 name: Clean Imports score: 2 max: 2 passed: true - comment: 'All imports used: numpy, plotly.graph_objects, qrcode.' + comment: All imports used (numpy, plotly.graph_objects, qrcode) - id: CQ-04 name: Code Elegance score: 2 max: 2 passed: true - comment: Clean, appropriate complexity. + comment: Appropriate complexity, clean Pythonic code - id: CQ-05 name: Output & API score: 1 max: 1 passed: true - comment: Saves as plot.png and plot.html. Current API. + comment: Saves as plot.png and plot.html, current API library_mastery: score: 7 max: 10 @@ -197,14 +195,13 @@ review: score: 4 max: 5 passed: true - comment: Good use of go.Heatmap, update_layout, add_annotation, add_shape, - scaleanchor. + comment: Good use of go.Heatmap, annotations, shapes, update_layout patterns - id: LM-02 name: Distinctive Features score: 3 max: 5 passed: true - comment: HTML export, annotations, shapes, heatmap with xgap/ygap. + comment: Plotly-specific xgap/ygap, HTML export, custom colorscale verdict: REJECTED impl_tags: dependencies: From bb9c38180d7a6f9b43141a4ebc7ab40c7f238ecb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Apr 2026 18:18:07 +0000 Subject: [PATCH 6/7] fix(plotly): address review feedback for qrcode-basic Attempt 3/3 - fixes based on AI review --- plots/qrcode-basic/implementations/plotly.py | 48 ++++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/plots/qrcode-basic/implementations/plotly.py b/plots/qrcode-basic/implementations/plotly.py index fad820af7e..29b694b6b1 100644 --- a/plots/qrcode-basic/implementations/plotly.py +++ b/plots/qrcode-basic/implementations/plotly.py @@ -1,7 +1,6 @@ -""" pyplots.ai +"""pyplots.ai qrcode-basic: Basic QR Code Generator Library: plotly 6.6.0 | Python 3.14.3 -Quality: 89/100 | Updated: 2026-04-07 """ import numpy as np @@ -19,16 +18,23 @@ qr_matrix = np.array(qr.get_matrix(), dtype=int) n_modules = qr_matrix.shape[0] -# Plot - Render as heatmap (1=black, 0=white) +# Plot - Render as heatmap with custom colorscale fig = go.Figure( - data=go.Heatmap(z=qr_matrix, colorscale=[[0, "#FFFFFF"], [1, "#1a1a2e"]], showscale=False, xgap=0.3, ygap=0.3) + data=go.Heatmap( + z=qr_matrix, + colorscale=[[0, "#FFFFFF"], [1, "#1a1a2e"]], + showscale=False, + xgap=0.3, + ygap=0.3, + hovertemplate="Module: (%{x}, %{y})
Value: %{z}", + ) ) -# Style +# Style - tighter layout for better canvas utilization fig.update_layout( title={ "text": "qrcode-basic · plotly · pyplots.ai", - "font": {"size": 52, "color": "#306998", "family": "Arial Black, sans-serif"}, + "font": {"size": 64, "color": "#306998", "family": "Arial Black, sans-serif"}, "x": 0.5, "xanchor": "center", "y": 0.97, @@ -53,20 +59,34 @@ "range": [-0.5, n_modules - 0.5], }, template="plotly_white", - margin={"l": 60, "r": 60, "t": 200, "b": 320}, + margin={"l": 60, "r": 60, "t": 220, "b": 260}, paper_bgcolor="#f8f9fa", plot_bgcolor="white", ) +# Decorative border around the QR code area +fig.add_shape( + type="rect", + xref="paper", + yref="paper", + x0=-0.01, + y0=-0.01, + x1=1.01, + y1=1.01, + line={"color": "#306998", "width": 1, "dash": "solid"}, + fillcolor="rgba(0,0,0,0)", + opacity=0.3, +) + # Subtle divider line between QR code and annotations fig.add_shape( type="line", xref="paper", yref="paper", x0=0.3, - y0=-0.015, + y0=-0.01, x1=0.7, - y1=-0.015, + y1=-0.01, line={"color": "#306998", "width": 1.5, "dash": "dot"}, ) @@ -76,9 +96,9 @@ xref="paper", yref="paper", x=0.5, - y=-0.03, + y=-0.025, showarrow=False, - font={"size": 44, "color": "#306998", "family": "Arial, sans-serif"}, + font={"size": 48, "color": "#306998", "family": "Arial, sans-serif"}, xanchor="center", yanchor="top", ) @@ -89,13 +109,13 @@ xref="paper", yref="paper", x=0.5, - y=-0.06, + y=-0.055, showarrow=False, - font={"size": 36, "color": "#888888", "family": "Arial, sans-serif"}, + font={"size": 38, "color": "#888888", "family": "Arial, sans-serif"}, xanchor="center", yanchor="top", ) # Save fig.write_image("plot.png", width=3600, height=3600, scale=1) -fig.write_html("plot.html") +fig.write_html("plot.html", include_plotlyjs="cdn") From 91ec194a68a1dcb910018d8485a89efae2a2a0eb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Apr 2026 18:21:24 +0000 Subject: [PATCH 7/7] chore(plotly): update quality score 90 and review feedback for qrcode-basic --- plots/qrcode-basic/implementations/plotly.py | 3 +- plots/qrcode-basic/metadata/plotly.yaml | 89 ++++++++++---------- 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/plots/qrcode-basic/implementations/plotly.py b/plots/qrcode-basic/implementations/plotly.py index 29b694b6b1..2eaeb618b5 100644 --- a/plots/qrcode-basic/implementations/plotly.py +++ b/plots/qrcode-basic/implementations/plotly.py @@ -1,6 +1,7 @@ -"""pyplots.ai +""" pyplots.ai qrcode-basic: Basic QR Code Generator Library: plotly 6.6.0 | Python 3.14.3 +Quality: 90/100 | Updated: 2026-04-07 """ import numpy as np diff --git a/plots/qrcode-basic/metadata/plotly.yaml b/plots/qrcode-basic/metadata/plotly.yaml index e9e281c483..f075c6fe13 100644 --- a/plots/qrcode-basic/metadata/plotly.yaml +++ b/plots/qrcode-basic/metadata/plotly.yaml @@ -1,7 +1,7 @@ library: plotly specification_id: qrcode-basic created: '2026-01-07T16:30:22Z' -updated: '2026-04-07T18:14:16Z' +updated: '2026-04-07T18:21:24Z' generated_by: claude-opus-4-6 workflow_run: 20788378599 issue: 3184 @@ -9,40 +9,44 @@ python_version: 3.14.3 library_version: 6.6.0 preview_url: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.png preview_html: https://storage.googleapis.com/pyplots-images/plots/qrcode-basic/plotly/plot.html -quality_score: 89 +quality_score: 90 review: strengths: - - Uses proper qrcode library for scannable QR code generation (spec requirement) - - Polished design with intentional color choices (dark navy, Python Blue accents, - light gray background) + - Uses proper qrcode library ensuring scannable QR code output (critical spec requirement) + - 'Polished design with intentional color choices: dark navy modules, Python Blue + accents, light gray paper background' - Clear visual hierarchy with title, QR code, divider, URL, and metadata - - Clean, deterministic code with KISS structure - - Dual output (PNG + HTML) leverages Plotly interactivity capability + - Clean deterministic code with KISS structure and dual output (PNG + interactive + HTML) + - Font sizes improved from prior attempts — all explicitly set and well-sized for + canvas weaknesses: - - Title appears slightly small relative to the 3600x3600 canvas - - Whitespace gap between bottom of QR code and annotations could be reduced for - tighter layout + - Minor whitespace gap between QR code bottom edge and annotation area + - Library mastery limited by the nature of QR code visualization (fewer opportunities + for distinctive Plotly features) image_description: 'The plot displays a QR code rendered as a Plotly heatmap on - a 3600x3600 canvas. The QR code uses dark navy (#1a1a2e) modules on a white background - with slight gaps between modules (xgap/ygap=0.3). Three finder patterns are clearly - visible in the top-left, top-right, and bottom-left corners. The title "qrcode-basic - · plotly · pyplots.ai" appears at the top in blue (#306998) with an Arial Black - font against a light gray (#f8f9fa) paper background. Below the QR code, a subtle - dotted blue divider separates the code from annotations: the encoded URL "https://pyplots.ai" - in bold blue, and metadata "Error Correction M (15%) · Version 2 · 33×33 modules" - in gray (#888888).' + a 3600×3600 square canvas. The QR code uses dark navy (#1a1a2e) modules on a white + background with subtle gaps between modules (xgap/ygap=0.3). Three finder patterns + are clearly visible in the top-left, top-right, and bottom-left corners with characteristic + nested squares. The title "qrcode-basic · plotly · pyplots.ai" appears at the + top in blue (#306998) Arial Black font against a light gray (#f8f9fa) paper background. + A subtle blue decorative border frames the plot area. Below the QR code, a dotted + blue divider line separates the code from annotations: the encoded URL "https://pyplots.ai" + in bold blue (48pt), and metadata "Error Correction M (15%) · Version 2 · 33×33 + modules" in gray (#888888, 38pt). The overall design is clean and professional + with intentional typographic hierarchy.' criteria_checklist: visual_quality: - score: 28 + score: 29 max: 30 items: - id: VQ-01 name: Text Legibility - score: 7 + score: 8 max: 8 passed: true - comment: All font sizes explicitly set (title 52pt, URL 44pt, metadata 36pt). - Title slightly small relative to canvas. + comment: 'All font sizes explicitly set: title 64pt, URL 48pt, metadata 38pt + — all well above minimums and perfectly readable' - id: VQ-02 name: No Overlap score: 6 @@ -54,7 +58,8 @@ review: score: 6 max: 6 passed: true - comment: QR code modules crisp and clearly visible with good contrast + comment: QR code modules crisp with clear dark navy on white contrast and + subtle module gaps - id: VQ-04 name: Color Accessibility score: 4 @@ -66,8 +71,8 @@ review: score: 3 max: 4 passed: true - comment: Good utilization but slightly excessive whitespace between QR code - and bottom annotations + comment: Good canvas utilization, minor whitespace gap between QR code and + annotations - id: VQ-06 name: Axis Labels & Title score: 2 @@ -90,15 +95,14 @@ review: score: 5 max: 6 passed: true - comment: Axes/grid hidden, subtle dotted divider, generous whitespace, clean - layout + comment: Axes/grid hidden, subtle dotted divider, decorative border, generous + whitespace - id: DE-03 name: Data Storytelling score: 4 max: 6 passed: true - comment: 'Clear visual hierarchy: QR code focal point, URL identification, - technical metadata' + comment: 'Clear visual hierarchy: QR code focal point → URL → metadata' spec_compliance: score: 15 max: 15 @@ -114,21 +118,20 @@ review: score: 4 max: 4 passed: true - comment: Quiet zone, high contrast, finder patterns, error correction M, qrcode - library + comment: Quiet zone, high contrast, finder patterns, error correction M, uses + qrcode library - id: SC-03 name: Data Mapping score: 3 max: 3 passed: true - comment: Matrix correctly rendered as heatmap with reversed y-axis and 1:1 - aspect ratio + comment: Matrix correctly rendered with reversed y-axis and 1:1 aspect ratio - id: SC-04 name: Title & Legend score: 3 max: 3 passed: true - comment: Title matches required format; no legend needed + comment: Title matches format, no legend needed data_quality: score: 14 max: 15 @@ -138,20 +141,19 @@ review: score: 5 max: 6 passed: true - comment: Complete QR code with finder patterns, data modules, quiet zone, - timing patterns + comment: Shows complete QR code with all structural elements - id: DQ-02 name: Realistic Context score: 5 max: 5 passed: true - comment: Encodes https://pyplots.ai — a real, meaningful URL + comment: Encodes https://pyplots.ai — real, meaningful URL - id: DQ-03 name: Appropriate Scale score: 4 max: 4 passed: true - comment: Version 2, 33x33 modules — appropriate for URL content + comment: Version 2, 33×33 modules — appropriate for URL content code_quality: score: 10 max: 10 @@ -161,7 +163,7 @@ review: score: 3 max: 3 passed: true - comment: Clean imports, data, plot, style, save structure + comment: Clean imports → data → plot → style → save structure - id: CQ-02 name: Reproducibility score: 2 @@ -173,7 +175,7 @@ review: score: 2 max: 2 passed: true - comment: All imports used (numpy, plotly.graph_objects, qrcode) + comment: 'All three imports used: numpy, plotly.graph_objects, qrcode' - id: CQ-04 name: Code Elegance score: 2 @@ -195,14 +197,15 @@ review: score: 4 max: 5 passed: true - comment: Good use of go.Heatmap, annotations, shapes, update_layout patterns + comment: Good use of go.Heatmap, annotations, shapes, scaleanchor for aspect + ratio - id: LM-02 name: Distinctive Features score: 3 max: 5 passed: true - comment: Plotly-specific xgap/ygap, HTML export, custom colorscale - verdict: REJECTED + comment: Plotly-specific xgap/ygap, hovertemplate, HTML export via write_html + verdict: APPROVED impl_tags: dependencies: - qrcode