AI Slop Code Risk Monitor

kitao/pyxel

SlopCodeMonitor badge for kitao/pyxel Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

A retro game engine for Python

7.1 Moderate pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for kitao/pyxel, a Rust project with 18,480 GitHub stars. SynthScan examined 158,899 lines of code across 372 source files, recording 956 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 7.1 (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.

7.1
Adjusted Signal
7.1
Raw Pattern Score
100%
Time Factor
2026-10-28
Last Push
18.5K
Stars
Rust
Language
158.9K
Lines of Code
372
Files
956
Pattern Hits
2026-10-31
Scan Date
0.10
HC Hit Rate

Risk Review · Payload v1

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

Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.

Cognitive Ownership Risk 23.4/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 7.6/100 · LOW

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

Agent Over-Engineering Ratio 23.0/100 · LOW

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

PR Review Velocity Impact 30.5/100 · MEDIUM

Which changes need focused human review? 956 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 38MEDIUM 5LOW 913

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 956 distinct pattern matches across 11 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 Identifiers863 hits · 810 pts
SeverityFileLineSnippetContext
LOWpython/pyxel/cli.py90def watch_and_run_python_script(watch_dir: str, python_script_file: str) -> None:CODE
LOWpython/pyxel/cli.py246def create_executable_from_pyxel_app(pyxel_app_file: str) -> None:CODE
LOWpython/pyxel/cli.py304def create_html_from_pyxel_app(pyxel_app_file: str) -> None:CODE
LOWpython/pyxel/cli.py396def _resolve_pyxel_app_startup_path(CODE
LOWpython/pyxel/cli.py473def _run_python_script_in_separate_process(python_script_file):CODE
LOWpython/pyxel/editor/tilemap_editor.py112 def __on_tilemap_picker_change(self, value):CODE
LOWpython/pyxel/editor/tilemap_editor.py115 def __on_tilemap_picker_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/sound_editor.py202 def __on_sound_picker_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/sound_editor.py211 def __on_play_button_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/sound_editor.py217 def __on_stop_button_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/sound_editor.py220 def __on_loop_button_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/music_editor.py150 def __on_music_picker_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/music_editor.py156 def __on_play_button_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/music_editor.py162 def __on_stop_button_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/music_editor.py165 def __on_loop_button_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/app.py138 def __on_editor_button_change(self, value):CODE
LOW⚡python/pyxel/editor/app.py142 def __on_editor_button_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/app.py148 def __on_undo_button_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/app.py154 def __on_redo_button_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/app.py166 def __on_save_button_mouse_hover(self, _x, _y):CODE
LOWpython/pyxel/editor/image_editor.py94 def __on_color_picker_mouse_hover(self, _x, _y):CODE
LOWpython/pyxel/editor/image_editor.py97 def __on_image_picker_mouse_hover(self, _x, _y):CODE
LOWpython/pyxel/editor/editor_base.py83 def check_tool_button_shortcuts(self):CODE
LOW⚡python/pyxel/editor/editor_base.py107 def __on_number_picker_dec_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/editor_base.py110 def __on_number_picker_inc_mouse_hover(self, _x, _y):CODE
LOW⚡python/pyxel/editor/editor_base.py113 def __on_tool_button_mouse_hover(self, x, y):CODE
LOWpython/pyxel/editor/widgets/widget.py270 def remove_var_event_listener(self, name, event, listener):CODE
LOWpython/tests/test_music.py24 def test_set_preserves_data_and_pads_channels(self, seqs, expected):CODE
LOWpython/tests/test_music.py34 def test_save_is_byte_deterministic(self, tmp_path):CODE
LOWpython/tests/test_music.py72 def test_set_overwrites_previous(self):CODE
LOWpython/tests/test_music.py79 def test_snds_list_aliases_seqs_deprecated(self, capfd):CODE
LOW⚡python/tests/test_music.py121 def test_removed_channel_view_raises(self, method, args):CODE
LOW⚡python/tests/test_music.py129 def test_comparison_with_removed_channel_view_raises(self):CODE
LOW⚡python/tests/test_music.py138 def test_index_conversion_can_remove_channel(self, slice_key):CODE
LOWpython/tests/test_music.py152 def test_value_conversion_can_remove_channel(self):CODE
LOW⚡python/tests/test_music.py171 def test_seqs_inner_seq_access(self):CODE
LOW⚡python/tests/test_music.py180 def test_seqs_inner_seq_setitem(self):CODE
LOW⚡python/tests/test_music.py187 def test_seqs_inner_seq_append(self):CODE
LOW⚡python/tests/test_music.py195 def test_seqs_inner_seq_delitem(self):CODE
LOW⚡python/tests/test_music.py202 def test_seqs_append_new_channel(self):CODE
LOW⚡python/tests/test_music.py210 def test_seqs_setitem_channel(self):CODE
LOW⚡python/tests/test_music.py219 def test_seqs_self_assignment(self):CODE
LOWpython/tests/test_music.py255 def test_seqs_reversed_step_one_slice_assignment_inserts(self):STRING
LOWpython/tests/test_music.py304 def test_seqs_result_allows_garbage_collection_reentry(self, operation, expected):STRING
LOWpython/tests/test_music.py371 def test_seqs_from_list_deprecated(self, capfd):STRING
LOWpython/tests/test_music.py378 def test_seqs_to_list_deprecated(self, capfd):STRING
LOW⚡python/tests/test_tilemap.py15 def test_new_with_image_instance(self):CODE
LOW⚡python/tests/test_tilemap.py21 def test_imgsrc_read_write_int(self):CODE
LOW⚡python/tests/test_tilemap.py28 def test_imgsrc_read_write_image(self):CODE
LOW⚡python/tests/test_tilemap.py34 def test_pset_pget_returns_tuple(self):CODE
LOWpython/tests/test_tilemap.py70 def test_empty_draw_does_not_resolve_imgsrc(self, operation, use_bank):CODE
LOWpython/tests/test_tilemap.py162 def test_empty_self_blit_preserves_tiles(self, bank_source, extent, zero_height):CODE
LOWpython/tests/test_tilemap.py181 def test_self_blit_matches_source_snapshot(self, rotate, source_pos):CODE
LOWpython/tests/test_tilemap.py201 def test_blt_with_tilemap_instance(self):CODE
LOWpython/tests/test_tilemap.py244 def test_clip_restricts_drawing(self):CODE
LOWpython/tests/test_tilemap.py253 def test_camera_offsets_drawing(self):CODE
LOWpython/tests/test_tilemap.py270 def test_from_tmx_masks_tile_flip_flags(self, tmp_path):CODE
LOWpython/tests/test_tilemap.py296 def test_from_tmx_rejects_invalid_configuration(CODE
LOW⚡python/tests/test_tilemap.py435 def test_collide_entering_map(self, x, y, width, height, dx, dy, expected):STRING
LOW⚡python/tests/test_tilemap.py445 def test_collide_horizontal_wall(self):STRING
803 more matches not shown…
Cross-Language Confusion35 hits · 232 pts
SeverityFileLineSnippetContext
HIGHpython/pyxel/examples/cube/c03_custom_shapes.py161 side = side.normalize() if side.length() > 1e-6 else rightCODE
HIGHpython/pyxel/examples/cube/c05_3d_collision.py88 if move.length() > 0:CODE
HIGHpython/pyxel/examples/cube/c05_3d_collision.py107 self.animate(move.length() > 0)CODE
HIGH⚡python/pyxel/examples/cube/c05_3d_collision.py242 if candidate.length() > offset.length():CODE
HIGH⚡python/pyxel/examples/cube/c05_3d_collision.py244 if offset.length() >= CAMERA_MIN_DISTANCE:CODE
HIGH⚡python/pyxel/examples/cube/c05_3d_collision.py252 distance = previous.length() + (offset.length() - previous.length()) * 0.25CODE
HIGH⚡python/pyxel/examples/cube/c05_3d_collision.py255 if clipped.length() >= CAMERA_MIN_DISTANCE:CODE
HIGH⚡python/pyxel/examples/cube/c05_3d_collision.py263 hit = self.raycast(start, delta, delta.length(), tags={"ground"})CODE
HIGH⚡python/pyxel/examples/cube/c05_3d_collision.py273 hit = self.raycast(focus, offset, offset.length(), tags={"ground"})CODE
HIGHpython/pyxel/examples/cube/c05_3d_collision.py286 if self.player.on_floor and self.player.move.length() > 0:CODE
HIGHpython/tests/test_examples.py714 assert offset.length() >= 48CODE
HIGHpython/tests/test_examples.py715 assert scene.raycast(focus, offset, offset.length(), tags={"ground"}) is NoneCODE
HIGH⚡python/tests/test_examples.py749 assert offset.length() >= 48CODE
HIGH⚡python/tests/test_examples.py753 if scene.raycast(focus, offset, offset.length(), tags={"ground"}):CODE
HIGH⚡python/tests/test_examples.py758 hit = scene.raycast(eye, -offset, offset.length(), tags={"ground"})CODE
HIGH⚡python/tests/test_examples.py765 assert scene.raycast(focus, offset, offset.length(), tags={"ground"}) is NoneCODE
HIGHpython/tests/test_examples.py783 assert offset.length() >= 48CODE
HIGHpython/tests/test_examples.py790 scene.raycast(player.transform.pos, offset, offset.length(), tags={"ground"})CODE
HIGHpython/tests/test_examples.py810 assert offset.length() >= 48CODE
HIGHpython/tests/test_examples.py811 assert scene.raycast(focus, offset, offset.length(), tags={"ground"}) is NoneCODE
HIGH⚡python/tests/cube/test_primitive.py128 assert normal.length() == pytest.approx(1, abs=1e-6)CODE
HIGH⚡python/tests/cube/test_mat4.py119 assert isclose(m.rot.length(), 1, abs_tol=1e-6)CODE
HIGHpython/tests/cube/test_mat4.py88 assert isclose(m.rot.length(), 1, abs_tol=1e-6)CODE
HIGH⚡python/tests/cube/test_quat.py209 assert quat.length() == pytest.approx(5 * scale, rel=2e-6, abs=0)CODE
HIGH⚡python/tests/cube/test_quat.py219 assert quat.length() == pytest.approx(1, abs=1e-6)CODE
HIGH⚡python/tests/cube/test_quat.py227 assert quat.length() == pytest.approx(1, abs=1e-6)CODE
HIGH⚡python/tests/cube/test_quat.py235 assert quat.length() == pytest.approx(1, abs=1e-6)CODE
HIGH⚡python/tests/cube/test_quat.py242 assert quat.length() == pytest.approx(1, abs=1e-6)CODE
HIGH⚡python/tests/cube/test_quat.py255 assert rotation.length() == pytest.approx(1, abs=1e-6)CODE
HIGH⚡python/tests/cube/test_quat.py266 assert rotation.length() == pytest.approx(1, abs=1e-6)CODE
HIGH⚡python/tests/cube/test_vec3.py146 assert n.length() == 1.0CODE
HIGH⚡python/tests/cube/test_vec3.py220 assert vector.length() == pytest.approx(5 * scale, rel=2e-6, abs=0)CODE
HIGH⚡python/tests/cube/test_vec3.py251 assert isinf(vector.length())CODE
HIGH⚡python/tests/cube/test_vec3.py259 assert target.length() == 1CODE
HIGHpython/tests/cube/test_vec3.py183 assert isclose(v.length(), 1.0, abs_tol=1e-5)CODE
Deep Nesting22 hits · 22 pts
SeverityFileLineSnippetContext
LOWpython/pyxel/cli.py90CODE
LOWpython/pyxel/cli.py182CODE
LOWpython/pyxel/cli.py508CODE
LOWpython/pyxel/utils.py23CODE
LOWpython/pyxel/examples/10_platformer.py44CODE
LOWpython/pyxel/examples/06_click_game.py59CODE
LOWpython/pyxel/examples/07_snake.py123CODE
LOWpython/pyxel/examples/cube/c05_3d_collision.py221CODE
LOWpython/pyxel/examples/cube/c06_3d_physics.py18CODE
LOWpython/pyxel/examples/cube/c06_3d_physics.py119CODE
LOWpython/pyxel/editor/canvas_panel.py181CODE
LOWpython/pyxel/editor/canvas_panel.py291CODE
LOWpython/pyxel/editor/piano_keyboard.py159CODE
LOWpython/pyxel/editor/app.py169CODE
LOWpython/pyxel/editor/image_editor.py120CODE
LOWpython/pyxel/editor/editor_base.py83CODE
LOWpython/tests/test_tilemap.py70CODE
LOWpython/tests/test_api_reference.py17CODE
LOWpython/tests/test_api_reference.py66CODE
LOWpython/tests/_runner.py22CODE
LOWpython/tests/_runner.py107CODE
LOWpython/tests/cube/test_scene.py871CODE
Unused Imports14 hits · 14 pts
SeverityFileLineSnippetContext
LOWpython/pyxel/__init__.py19CODE
LOWpython/pyxel/editor/__init__.py1CODE
LOWpython/pyxel/editor/__init__.py2CODE
LOWpython/pyxel/editor/widgets/__init__.py1CODE
LOWpython/pyxel/editor/widgets/__init__.py2CODE
LOWpython/pyxel/editor/widgets/__init__.py3CODE
LOWpython/pyxel/editor/widgets/__init__.py4CODE
LOWpython/pyxel/editor/widgets/__init__.py5CODE
LOWpython/pyxel/editor/widgets/__init__.py6CODE
LOWpython/pyxel/editor/widgets/__init__.py7CODE
LOWpython/pyxel/editor/widgets/__init__.py8CODE
LOWpython/pyxel/editor/widgets/__init__.py9CODE
LOWpython/pyxel/editor/widgets/__init__.py10CODE
LOWpython/tests/cube/_glb_fixtures.py1CODE
Empty Error Handlers2 hits · 10 pts
SeverityFileLineSnippetContext
HIGHpython/pyxel/__init__.py15except OSError:CODE
HIGHpython/tests/_runner.py79except _FlipCapture:CODE
Self-Referential Comments3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMpython/pyxel/examples/09_shooter.py188 # Create the player spriteCOMMENT
MEDIUMpython/pyxel/examples/09_shooter.py204 # Create the enemy spriteCOMMENT
MEDIUMpython/pyxel/examples/04_sound_api.py8 # Create the note icon spriteCOMMENT
Excessive Try-Catch Wrapping6 hits · 8 pts
SeverityFileLineSnippetContext
LOWpython/pyxel/editor/tilemap_editor.py132 except Exception as e: # noqa: BLE001 - Native loaders raise plain Exception.CODE
MEDIUMpython/pyxel/editor/tilemap_editor.py127def __on_drop(self, filename):CODE
LOW⚡python/pyxel/editor/app.py160 except Exception as e: # noqa: BLE001 - Native savers raise plain Exception.CODE
LOWpython/pyxel/editor/app.py190 except Exception as e: # noqa: BLE001 - Native loaders raise plain Exception.CODE
MEDIUMpython/pyxel/editor/app.py157def __on_save_button_press(self):CODE
LOWpython/pyxel/editor/image_editor.py115 except Exception as e: # noqa: BLE001 - Native loaders raise plain Exception.CODE
Over-Commented Block6 hits · 6 pts
SeverityFileLineSnippetContext
LOWcrates/pyxel-core/src/bgm_generator.rs21// Struct field names form the Pyxel Composer JSON wire contract.COMMENT
LOWcrates/pyxel-core/src/bgm_generator.rs61 // Optional 12-digit per-semitone weight string.COMMENT
LOWcrates/pyxel-core/src/cube/collision.rs2921 }COMMENT
LOWpython/pyxel/editor/canvas_panel.py21 # Variables:COMMENT
LOWpython/pyxel/editor/sound_editor.py21COMMENT
LOWpython/pyxel/editor/widgets/widget.py21COMMENT
Cross-Language Confusion (JS/TS)1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHweb/tests/browser/app2html.spec.js38print(json.dumps(pages))CODE
Modern Structural Boilerplate3 hits · 3 pts
SeverityFileLineSnippetContext
LOWpython/pyxel/cube/__init__.py21__all__ = [CODE
LOWpython/pyxel/editor/__init__.py4__all__ = ["App", "extensions"]CODE
LOWpython/pyxel/editor/widgets/__init__.py12__all__ = [CODE
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWpython/tests/cube/_glb_fixtures.py324CODE