AI Slop Code RIsk Monitor

pyecharts/pyecharts

🎨 Python Echarts Plotting Library

12.8 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for pyecharts/pyecharts, a Python project with 15,776 GitHub stars. SynthScan examined 35,527 lines of code across 162 source files, recording 504 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 12.8 (Moderate pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

12.8
Adjusted Signal
12.8
Raw Pattern Score
100%
Time Factor
2026-08-04
Last Push
15.8K
Stars
Python
Language
35.5K
Lines of Code
162
Files
504
Pattern Hits
2026-10-12
Scan Date
0.04
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 32.0/100 · MEDIUM

Can maintainers explain intent, assumptions, and trade-offs? 276 finding(s).

Hallucinated Dependency & Supply Chain Risk 18.9/100 · LOW

Are imports declared and package/API names verified? 220 finding(s).

Agent Over-Engineering Ratio 33.7/100 · MEDIUM

Are wrappers, guards, and repeated structures necessary? 270 finding(s).

PR Review Velocity Impact 53.2/100 · HIGH

Which changes need focused human review? 504 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 7MEDIUM 0LOW 497

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 504 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Hyper-Verbose Identifiers152 hits · 160 pts
SeverityFileLineSnippetContext
LOWAGENTS.md199 def test_chart_line_style_opts(self):CODE
LOWpyecharts/commons/utils.py56def replace_placeholder_with_quotes(html: str) -> str:CODE
LOWpyecharts/commons/utils.py109def remove_key_with_none_value(incoming_dict):CODE
LOWpyecharts/charts/basic_charts/wordcloud.py43 def _create_mask_image_variable(self, data: str) -> JsCode:CODE
LOWtest/test_amap.py35 def test_amap_map_control_panel(self, fake_writer):CODE
LOWtest/test_amap.py56 def test_amap_polyline_and_large(self, fake_writer):CODE
LOWtest/test_series_options.py21 def test_label_options_defaults(self):CODE
LOWtest/test_series_options.py63 def test_label_options_custom(self):CODE
LOW⚡test/test_series_options.py116 def test_mark_point_item_remove_none(self):CODE
LOW⚡test/test_series_options.py121 def test_mark_line_item_remove_none(self):CODE
LOW⚡test/test_series_options.py126 def test_mark_area_item_remove_none(self):CODE
LOWtest/test_series_options.py149 def test_mark_area_options_remove_none(self):CODE
LOWtest/test_series_options.py158 def test_tree_map_breadcrumb_options_remove_none(self):CODE
LOW⚡test/test_series_options.py173 def test_minor_tick_options_remove_none(self):CODE
LOW⚡test/test_series_options.py182 def test_minor_split_line_options_remove_none(self):CODE
LOW⚡test/test_series_options.py191 def test_area_color_in_item_styles(self):CODE
LOW⚡test/test_series_options.py195 def test_mark_point_opts_with_animation(self):CODE
LOW⚡test/test_series_options.py199 def test_mark_line_opts_with_animation(self):CODE
LOW⚡test/test_series_options.py203 def test_mark_area_opts_with_animation(self):CODE
LOWtest/test_engine.py51 def test_import_iterable_new_location(self):CODE
LOWtest/test_engine.py61 def test_import_iterable_old_location(self):CODE
LOWtest/test_utils.py8 def test_utils_produce_require_dict(self):CODE
LOWtest/test_utils.py37 def test_utils_produce_require_dict_with_extra(self):CODE
LOWtest/test_utils.py58 def test_utils_remove_key_with_none_value(self):CODE
LOWtest/test_utils.py67 def test_utils_remove_key_with_none_value_raise_value_error(self):CODE
LOWtest/test_effectscatter.py19 def test_effectscatter_item_base(self, fake_writer):CODE
LOWtest/test_grid.py11 def _verify_instance_for_datazoom_and_visualmap(self, chart, key):CODE
LOWtest/test_grid.py62 def _chart_for_set_grid_index(self, gird_index=None) -> Bar:CODE
LOWtest/test_grid.py74 def _chart_for_grid_with_datazoom_and_visualmap(self) -> Bar:CODE
LOWtest/test_grid.py95 def _chart_for_grid_with_multiple_datazoom_and_visualmap(self) -> Bar:CODE
LOWtest/test_grid.py143 def test_grid_set_grid_index_priority(self):CODE
LOWtest/test_grid.py170 def test_grid_set_grid_out_of_order(self):CODE
LOWtest/test_grid.py184 def test_grid_control_axis_index(self):CODE
LOWtest/test_grid.py195 def test_grid_do_not_control_axis_index(self):CODE
LOWtest/test_grid.py202 def test_grid_with_more_datazoom_and_visualmap_opts(self):CODE
LOWtest/test_tree.py38 def test_tree_collapse_interval(self, fake_writer):CODE
LOWtest/test_gmap.py35 def test_gmap_map_control_panel(self, fake_writer):CODE
LOWtest/test_gmap.py52 def test_gmap_polyline_and_large(self, fake_writer):CODE
LOWtest/test_chart_options.py30 def test_bar_background_style_options_remove_none(self):CODE
LOWtest/test_chart_options.py43 def test_globe_layers_options_remove_none(self):CODE
LOW⚡test/test_chart_options.py54 def test_theme_river_item_remove_none(self):CODE
LOW⚡test/test_chart_options.py59 def test_tree_river_item_remove_none(self):CODE
LOW⚡test/test_chart_options.py64 def test_timeline_check_pointer_style_options_remove_none(self):CODE
LOWtest/test_chart_options.py80 def test_timeline_control_style_options_remove_none(self):CODE
LOW⚡test/test_chart_options.py96 def test_graph_category_item_remove_none(self):CODE
LOW⚡test/test_chart_options.py101 def test_tree_map_item_style_options_remove_none(self):CODE
LOW⚡test/test_chart_options.py109 def test_graphic_image_style_opts_remove_none(self):CODE
LOWtest/test_chart_options.py121 def test_graphic_text_style_opts_remove_none(self):CODE
LOWtest/test_chart_options.py132 def test_geo_region_opts_remove_none(self):CODE
LOW⚡test/test_chart_options.py143 def test_sunburst_label_line_opts_remove_none(self):CODE
LOW⚡test/test_chart_options.py148 def test_sunburst_label_layout_opts_remove_none(self):CODE
LOW⚡test/test_chart_options.py153 def test_sunburst_level_opts_remove_none(self):CODE
LOW⚡test/test_chart_options.py158 def test_custom_item_payload_opts_remove_none(self):CODE
LOWtest/test_datasets.py64 def test_fuzzy_search_key_error(self):CODE
LOWtest/test_datasets.py76 def test_type_error_with_non_string_key(self):CODE
LOWtest/test_datasets.py84 def test_type_error_with_non_string_lookfor(self):CODE
LOWtest/test_wordcloud.py47 def test_wordcloud_mask_image(self, fake_writer):CODE
LOWtest/test_geo.py127 def test_extra_geo_parameters(self, fake_writer):CODE
LOWtest/test_geo.py157 def test_geo_dump_options_with_quotes(self):CODE
LOWtest/test_bmap.py51 def test_bmap_effect_trail_length(self, fake_writer):CODE
92 more matches not shown…
Unused Imports219 hits · 144 pts
SeverityFileLineSnippetContext
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py2CODE
LOWpyecharts/__init__.py2CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py16CODE
LOWpyecharts/types.py16CODE
LOWpyecharts/types.py16CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
159 more matches not shown…
AI Structural Patterns110 hits · 100 pts
SeverityFileLineSnippetContext
LOWpyecharts/options/global_options.py23CODE
LOWpyecharts/options/global_options.py85CODE
LOWpyecharts/options/global_options.py131CODE
LOWpyecharts/options/global_options.py170CODE
LOWpyecharts/options/global_options.py224CODE
LOWpyecharts/options/global_options.py260CODE
LOWpyecharts/options/global_options.py294CODE
LOWpyecharts/options/global_options.py316CODE
LOWpyecharts/options/global_options.py351CODE
LOWpyecharts/options/global_options.py417CODE
LOWpyecharts/options/global_options.py467CODE
LOWpyecharts/options/global_options.py517CODE
LOWpyecharts/options/global_options.py577CODE
LOWpyecharts/options/global_options.py682CODE
LOWpyecharts/options/global_options.py782CODE
LOWpyecharts/options/global_options.py927CODE
LOWpyecharts/options/global_options.py999CODE
LOWpyecharts/options/global_options.py1117CODE
LOWpyecharts/options/global_options.py1181CODE
LOWpyecharts/options/global_options.py1241CODE
LOWpyecharts/options/global_options.py1285CODE
LOWpyecharts/options/global_options.py1335CODE
LOWpyecharts/options/global_options.py1394CODE
LOWpyecharts/options/global_options.py1426CODE
LOWpyecharts/options/global_options.py1458CODE
LOWpyecharts/options/global_options.py1488CODE
LOWpyecharts/options/global_options.py1530CODE
LOWpyecharts/options/global_options.py1596CODE
LOWpyecharts/options/global_options.py1661CODE
LOWpyecharts/options/global_options.py1734CODE
LOWpyecharts/options/global_options.py1832CODE
LOWpyecharts/options/global_options.py1878CODE
LOWpyecharts/options/global_options.py1946CODE
LOWpyecharts/options/global_options.py1980CODE
LOWpyecharts/options/global_options.py2018CODE
LOWpyecharts/options/global_options.py2052CODE
LOWpyecharts/options/charts_options.py46CODE
LOWpyecharts/options/charts_options.py100CODE
LOWpyecharts/options/charts_options.py418CODE
LOWpyecharts/options/charts_options.py449CODE
LOWpyecharts/options/charts_options.py603CODE
LOWpyecharts/options/charts_options.py667CODE
LOWpyecharts/options/charts_options.py719CODE
LOWpyecharts/options/charts_options.py752CODE
LOWpyecharts/options/charts_options.py803CODE
LOWpyecharts/options/charts_options.py865CODE
LOWpyecharts/options/charts_options.py889CODE
LOWpyecharts/options/charts_options.py917CODE
LOWpyecharts/options/charts_options.py965CODE
LOWpyecharts/options/charts_options.py1075CODE
LOWpyecharts/options/charts_options.py1099CODE
LOWpyecharts/options/charts_options.py1125CODE
LOWpyecharts/options/charts_options.py1158CODE
LOWpyecharts/options/charts_options.py1246CODE
LOWpyecharts/options/charts_options.py1304CODE
LOWpyecharts/options/charts_options.py1412CODE
LOWpyecharts/options/charts_options.py1468CODE
LOWpyecharts/options/charts_options.py1535CODE
LOWpyecharts/options/charts_options.py1565CODE
LOWpyecharts/options/charts_options.py1589CODE
50 more matches not shown…
Empty Error Handlers6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHsetup.py56except OSError:CODE
HIGHtest/test_engine.py58except (AttributeError, AssertionError):CODE
HIGHtest/test_utils.py77except ValueError:CODE
HIGHtest/test_utils.py82except ValueError:CODE
HIGHtest/test_display.py52except RuntimeError:CODE
HIGHtest/test_custom.py51except ValueError:CODE
Deep Nesting13 hits · 13 pts
SeverityFileLineSnippetContext
LOWpyecharts/commons/utils.py29CODE
LOWpyecharts/commons/utils.py74CODE
LOWpyecharts/charts/basic_charts/geo.py45CODE
LOWpyecharts/charts/basic_charts/tree.py17CODE
LOWpyecharts/charts/basic_charts/gmap.py31CODE
LOWpyecharts/charts/basic_charts/boxplot.py93CODE
LOWpyecharts/charts/basic_charts/amap.py31CODE
LOWpyecharts/charts/basic_charts/bmap.py32CODE
LOWpyecharts/charts/basic_charts/wordcloud.py56CODE
LOWpyecharts/charts/basic_charts/lmap.py31CODE
LOWpyecharts/charts/basic_charts/scatter.py19CODE
LOWpyecharts/charts/three_axis_charts/map3D.py21CODE
LOWpyecharts/render/engine.py30CODE
Cross-Language Confusion1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHpyecharts/charts/composite_charts/page.py25 result.push({CODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWpyecharts/datasets/__init__.py33 # if the item is in the dictionary then just return itCOMMENT
Excessive Try-Catch Wrapping1 hit · 1 pts
SeverityFileLineSnippetContext
LOWpyecharts/datasets/__init__.py109 except Exception as e:CODE
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOWpyecharts/render/snapshot.py9logger = logging.getLogger(__name__)CODE