AI Slop Code RIsk Monitor

Kanaries/pygwalker

PyGWalker: Turn your dataframe into an interactive UI for visual analysis

22.0 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for Kanaries/pygwalker, a Python project with 15,983 GitHub stars. SynthScan examined 27,408 lines of code across 240 source files, recording 500 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 22.0 (Elevated 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.

22.0
Adjusted Signal
22.0
Raw Pattern Score
100%
Time Factor
2026-09-05
Last Push
16.0K
Stars
Python
Language
27.4K
Lines of Code
240
Files
500
Pattern Hits
2026-10-12
Scan Date
0.08
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 53.3/100 · HIGH

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

Hallucinated Dependency & Supply Chain Risk 8.6/100 · LOW

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

Agent Over-Engineering Ratio 61.1/100 · HIGH

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

PR Review Velocity Impact 68.2/100 · HIGH

Which changes need focused human review? 500 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 1HIGH 19MEDIUM 12LOW 468

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 500 distinct pattern matches across 13 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 Identifiers362 hits · 360 pts
SeverityFileLineSnippetContext
LOWapp/src/dataSource/index.tsx171export function getDatasFromKernelByPayload(comm: ICommunication | null) {CODE
LOWapp/src/tools/saveTool.tsx18function DocumentTextIconWithRedPoint(iconProps) {CODE
LOWtests/test_dsl_transform.py15def test_dsl_to_workflow_returns_valid_workflow():CODE
LOWtests/test_dsl_transform.py22def test_dsl_to_workflow_with_fields():CODE
LOWtests/test_dsl_transform.py34def test_vega_to_dsl_returns_expected_keys():CODE
LOWtests/test_dsl_transform.py52def test_import_error_when_no_js_runtime():CODE
LOWtests/test_dsl_transform.py66def test_runtime_initialized_only_once():CODE
LOWtests/test_dsl_transform.py82def test_reset_runtime_closes_existing_contexts():CODE
LOW⚡tests/test_frontend_contracts.py192def test_frontend_props_interface_covers_python_props_builder():CODE
LOW⚡tests/test_frontend_contracts.py198def test_python_props_builder_stringifies_frontend_id():CODE
LOW⚡tests/test_frontend_contracts.py205def test_frontend_comm_maps_cover_python_comm_handler_endpoints():CODE
LOW⚡tests/test_frontend_contracts.py215def test_frontend_comm_request_map_uses_types_matching_python_request_models():CODE
LOW⚡tests/test_frontend_contracts.py225def test_frontend_protocol_interfaces_match_pydantic_aliases():CODE
LOW⚡tests/test_frontend_contracts.py232def test_generated_frontend_protocol_types_are_fresh():CODE
LOW⚡tests/test_frontend_contracts.py239def test_comm_handler_register_uses_typed_request_models():CODE
LOW⚡tests/test_frontend_contracts.py258def test_frontend_dev_typescript_source_maps_are_enabled():CODE
LOW⚡tests/test_frontend_contracts.py266def test_frontend_tracker_loads_segment_only_after_events_opt_in():CODE
LOW⚡tests/test_frontend_contracts.py276def test_frontend_http_integrations_initialize_communication():CODE
LOWtests/test_frontend_contracts.py107def _comm_handler_request_models(repo_root: Path) -> dict[str, str]:CODE
LOWtests/test_frontend_contracts.py133def _comm_handler_register_calls(repo_root: Path) -> list[ast.Call]:CODE
LOWtests/test_frontend_contracts.py146def _typescript_interface_keys(repo_root: Path, interface_name: str) -> set[str]:CODE
LOWtests/test_frontend_contracts.py287def test_streamlit_entrypoint_refreshes_props_on_reruns():CODE
LOWtests/test_frontend_contracts.py302def test_frontend_component_state_refreshes_when_props_change():CODE
LOWtests/test_frontend_contracts.py310def test_frontend_pure_renderer_uses_local_data_without_kernel_computation():CODE
LOWtests/test_frontend_contracts.py327def test_frontend_modals_are_lazy_loaded_from_entrypoint():CODE
LOWtests/test_frontend_contracts.py346def test_frontend_save_payload_strips_graphic_walker_export_fields():CODE
LOWtests/test_frontend_assets.py16def test_read_frontend_asset_reads_from_templates_dist(monkeypatch, tmp_path):CODE
LOWtests/test_frontend_assets.py25def test_read_frontend_asset_reports_compile_command(monkeypatch, tmp_path):CODE
LOWtests/test_frontend_assets.py36def test_read_frontend_asset_report_uses_stable_posix_path_with_windows_paths(monkeypatch, tmp_path):CODE
LOWtests/test_readme_api_reference.py19def _read_walk_api_table_rows() -> list[dict[str, str]]:CODE
LOWtests/test_readme_api_reference.py47def _read_walk_api_table_params() -> list[str]:CODE
LOWtests/test_readme_api_reference.py51def _format_signature_default(parameter: inspect.Parameter) -> str:CODE
LOWtests/test_readme_api_reference.py82def test_readme_walk_api_table_matches_jupyter_walk_signature():CODE
LOWtests/test_readme_api_reference.py93def test_readme_walk_api_table_defaults_match_jupyter_walk_signature():CODE
LOWtests/test_readme_api_reference.py103def test_readme_walk_api_table_documents_reusable_walker_input():CODE
LOWtests/test_readme_api_reference.py136def test_public_api_docstrings_document_current_dataset_inputs(relative_path, qualified_name, expected_fragments):CODE
LOWtests/test_readme_api_reference.py144def test_readme_walk_api_table_marks_legacy_jupyter_envs_deprecated():CODE
LOWtests/test_readme_api_reference.py176def test_translated_readmes_defer_api_reference_to_english_readme():CODE
LOWtests/test_readme_api_reference.py185def test_translated_readmes_do_not_repeat_stale_api_parameters():CODE
LOWtests/test_preview_image.py4def test_preview_image_tool_renders_on_daemon_thread(monkeypatch):CODE
LOWtests/test_preview_image.py34def test_preview_image_tool_keeps_worker_alive_after_render_error(monkeypatch):CODE
LOW⚡tests/test_pygwalker_core.py1746def test_to_html_rejects_live_computation_modes(kwargs):CODE
LOW⚡tests/test_pygwalker_core.py1751def test_to_html_rejects_invalid_computation_mode():CODE
LOW⚡tests/test_pygwalker_core.py1756def test_to_html_allows_disabled_computation_kwargs(monkeypatch):CODE
LOWtests/test_pygwalker_core.py29def _expected_legacy_computation_warning(kwargs):CODE
LOWtests/test_pygwalker_core.py71def _patch_cloud_computation_parser(monkeypatch):CODE
LOWtests/test_pygwalker_core.py103 def fake_create_cloud_dataset(self, data_parser, name, is_public, temporary):CODE
LOWtests/test_pygwalker_core.py139def test_pygwalker_props_expose_browser_data_path(monkeypatch):CODE
LOWtests/test_pygwalker_core.py158def test_pygwalker_props_expose_kernel_data_path(monkeypatch):CODE
LOWtests/test_pygwalker_core.py169def test_pygwalker_get_props_falls_back_without_props_builder(monkeypatch):CODE
LOWtests/test_pygwalker_core.py211def test_props_tracker_tracks_expected_invocation_fields():CODE
LOWtests/test_pygwalker_core.py267def test_render_manager_preview_handles_parser_exception_and_manual_gid(monkeypatch):CODE
LOWtests/test_pygwalker_core.py312def test_render_manager_chart_preview_uses_chart_indexed_workflow(monkeypatch):CODE
LOWtests/test_pygwalker_core.py325 def fake_render_chart_preview(**kwargs):CODE
LOWtests/test_pygwalker_core.py357def test_render_manager_chart_preview_returns_empty_for_mismatched_workflow_list():CODE
LOWtests/test_pygwalker_core.py375def test_jupyter_display_manager_convert_html_displays_iframe():CODE
LOWtests/test_pygwalker_core.py387def test_jupyter_display_manager_uploads_large_classic_jupyter_data(monkeypatch):CODE
LOWtests/test_pygwalker_core.py426def test_chart_export_manager_exports_png(monkeypatch):CODE
LOWtests/test_pygwalker_core.py445def test_chart_export_manager_exports_svg_variants():CODE
LOWtests/test_pygwalker_core.py465def test_chart_export_manager_display_chart_uses_chart_name_as_default_title():CODE
302 more matches not shown…
Empty Error Handlers16 hits · 80 pts
SeverityFileLineSnippetContext
HIGHtests/test_data_parsers.py190except ImportError:CODE
HIGHpygwalker/_typing.py11except ModuleNotFoundError:CODE
HIGHpygwalker/_typing.py17except ModuleNotFoundError:CODE
HIGHpygwalker/_typing.py23except ModuleNotFoundError:CODE
HIGHpygwalker/_typing.py29except ModuleNotFoundError:CODE
HIGHpygwalker/_typing.py35except ModuleNotFoundError:CODE
HIGHpygwalker/data_parsers/base.py186except Exception:CODE
HIGHpygwalker/api/webserver.py210except KeyboardInterrupt:CODE
HIGHpygwalker/services/preview_image.py130except Exception:CODE
HIGHpygwalker/services/track.py70except Exception:CODE
HIGHpygwalker/services/kaggle.py16except Exception:CODE
HIGHpygwalker/services/data_bridge.py84except Exception:CODE
HIGHpygwalker/communications/streamlit_comm.py97except Exception:CODE
HIGHpygwalker/communications/streamlit_comm.py151except Exception:CODE
HIGHpygwalker/communications/base.py15except Exception:CODE
HIGHscripts/dev.py117except (ProcessLookupError, OSError):CODE
Excessive Try-Catch Wrapping35 hits · 43 pts
SeverityFileLineSnippetContext
LOWpygwalker/jupyter_extension.py187 except Exception as exc: # pragma: no cover - defensive import boundaryCODE
LOWpygwalker/data_parsers/base.py186 except Exception:CODE
LOWpygwalker/data_parsers/base.py230 except Exception:CODE
LOWpygwalker/utils/encode.py23 except Exception:CODE
LOWpygwalker/utils/runtime_env.py12 except Exception:CODE
MEDIUMpygwalker/utils/runtime_env.py4def _is_jupyter() -> bool:CODE
LOWpygwalker/api/webserver.py170 except Exception:CODE
LOWpygwalker/services/preview_image.py118 except Exception:CODE
LOW⚡pygwalker/services/preview_image.py130 except Exception:CODE
LOW⚡pygwalker/services/preview_image.py143 except Exception:CODE
MEDIUMpygwalker/services/preview_image.py140def _safe_render_next_preview(self):CODE
LOWpygwalker/services/config.py76 except Exception:STRING
LOWpygwalker/services/config.py151 except Exception:CODE
LOWpygwalker/services/track.py70 except Exception:CODE
LOWpygwalker/services/check_update.py109 except Exception as exc:CODE
LOW⚡pygwalker/services/kaggle.py16 except Exception:CODE
LOWpygwalker/services/kaggle.py32 except Exception:CODE
LOWpygwalker/services/data_bridge.py84 except Exception:CODE
MEDIUMpygwalker/services/data_bridge.py81def warm_kernel_table(self) -> None:CODE
LOW⚡pygwalker/services/format_invoke_walk_code.py68 except Exception:CODE
LOWpygwalker/services/cloud_service.py80 except Exception as e:CODE
LOWpygwalker/communications/reflex_comm.py37 except Exception as e:CODE
LOWpygwalker/communications/reflex_comm.py77 except Exception as e:CODE
LOWpygwalker/communications/streamlit_comm.py97 except Exception:CODE
LOWpygwalker/communications/streamlit_comm.py151 except Exception:CODE
LOWpygwalker/communications/base.py15 except Exception:CODE
LOWpygwalker/communications/base.py50 except Exception as e:CODE
LOWpygwalker/communications/base.py66 except Exception as e:CODE
LOWexamples/reflex_demo/app/app.py34except Exception as e:CODE
LOWexamples/reflex_demo/app/app.py83 except Exception as e:CODE
MEDIUMexamples/reflex_demo/app/app.py84 print(f"Error in pygwalker_demo: {e}")CODE
LOWexamples/reflex_demo/app/app.py162 except Exception as e:CODE
LOWexamples/reflex_demo/app/app.py174except Exception as e:CODE
LOW⚡scripts/test-init.py17except Exception as e:CODE
MEDIUM⚡scripts/test-init.py18 print(f"Error: could not download the file\n{e}", file=sys.stderr)CODE
Unused Imports26 hits · 26 pts
SeverityFileLineSnippetContext
LOWpygwalker/__init__.py16CODE
LOWpygwalker/__init__.py16CODE
LOWpygwalker/__init__.py16CODE
LOWpygwalker/__init__.py17CODE
LOWpygwalker/__init__.py18CODE
LOWpygwalker/__init__.py19CODE
LOWpygwalker/__init__.py20CODE
LOWpygwalker/__init__.py21CODE
LOWpygwalker/jupyter_extension.py8CODE
LOWpygwalker/api/streamlit.py31CODE
LOWpygwalker/api/webserver.py30CODE
LOWpygwalker/api/adapter.py13CODE
LOWpygwalker/api/marimo.py24CODE
LOWpygwalker/api/anywidget.py23CODE
LOWpygwalker/api/jupyter.py25CODE
LOWpygwalker/services/data_upload_communication.py7CODE
LOWpygwalker/services/data_communication.py17CODE
LOWpygwalker/services/desktop_communication.py7CODE
LOWpygwalker/services/comm_handler.py34CODE
LOWpygwalker/services/spec_communication.py15CODE
LOWpygwalker/services/cloud_communication.py21CODE
LOWscripts/generate_comm_protocol_ts.py1CODE
LOWscripts/dev.py24CODE
LOWscripts/local_ci.py3CODE
LOWpygwalker_tools/metrics/__init__.py1CODE
LOWpygwalker_tools/metrics/__init__.py1CODE
AI Structural Patterns21 hits · 21 pts
SeverityFileLineSnippetContext
LOWpygwalker/data_parsers/database_parser.py212CODE
LOWpygwalker/data_parsers/database_parser.py221CODE
LOWpygwalker/data_parsers/cloud_dataset_parser.py70CODE
LOWpygwalker/api/streamlit.py356CODE
LOWpygwalker/api/streamlit.py104CODE
LOWpygwalker/api/reflex.py22CODE
LOWpygwalker/api/webserver.py214CODE
LOWpygwalker/api/webserver.py314CODE
LOWpygwalker/api/webserver.py376CODE
LOWpygwalker/api/adapter.py16CODE
LOWpygwalker/api/walker.py60CODE
LOWpygwalker/api/html.py25CODE
LOWpygwalker/api/html.py79CODE
LOWpygwalker/api/html.py142CODE
LOWpygwalker/api/marimo.py64CODE
LOWpygwalker/api/component.py426CODE
LOWpygwalker/api/component.py309CODE
LOWpygwalker/api/gradio.py15CODE
LOWpygwalker/api/anywidget.py63CODE
LOWpygwalker/api/jupyter.py119CODE
LOWpygwalker/services/comm_handler.py43CODE
Self-Referential Comments6 hits · 20 pts
SeverityFileLineSnippetContext
MEDIUMpygwalker/communications/reflex_comm.py49# Create a FastAPI sub-application for PyGWalker APICOMMENT
MEDIUMpygwalker/communications/reflex_comm.py85 # Create a sub-application for PyGWalker routesCOMMENT
MEDIUMexamples/reflex_demo/app/app.py66 # Create a PyGWalker componentCOMMENT
MEDIUMexamples/reflex_demo/app/app.py156# Create a Reflex app with the fixed PyGWalker API transformerCOMMENT
MEDIUMscripts/test-init.sh14# Create the directory if it doesn't existCOMMENT
MEDIUM⚡scripts/test-init.py11# Create the directory if it doesn't existCOMMENT
Modern Structural Boilerplate14 hits · 14 pts
SeverityFileLineSnippetContext
LOWpygwalker/__init__.py31__all__ = ["walk", "render", "table", "to_html", "FieldSpec", "GlobalVarManager", "component", "Walker", "spec"]CODE
LOWpygwalker/jupyter_extension.py207__all__ = [CODE
LOWpygwalker/data_parsers/database_parser.py21logger = logging.getLogger(__name__)CODE
LOWpygwalker/data_parsers/spark_parser.py15logger = logging.getLogger(__name__)CODE
LOWpygwalker/data_parsers/cloud_dataset_parser.py14logger = logging.getLogger(__name__)CODE
LOWpygwalker/utils/check_walker_params.py4logger = logging.getLogger(__name__)CODE
LOWpygwalker/api/html.py22logger = logging.getLogger(__name__)CODE
LOWpygwalker/services/spec_manager.py28 def update_vis_spec(self, vis_spec: List[Dict[str, Any]]) -> None:CODE
LOWpygwalker/services/preview_image.py15logger = logging.getLogger(__name__)CODE
LOWpygwalker/services/check_update.py25logger = logging.getLogger(__name__)CODE
LOWpygwalker/services/format_invoke_walk_code.py12logger = logging.getLogger(__name__)CODE
LOWpygwalker/services/cloud_service.py16logger = logging.getLogger(__name__)CODE
LOW…ckages/pygwalker-jupyter/pygwalker_jupyter/__init__.py16__all__ = ["__version__", "_jupyter_labextension_paths"]CODE
LOWpygwalker_tools/metrics/__init__.py3__all__ = ["get_metrics_datas", "MetricsChart"]CODE
Deep Nesting13 hits · 12 pts
SeverityFileLineSnippetContext
LOWtests/test_frontend_contracts.py55CODE
LOWtests/test_frontend_contracts.py83CODE
LOWtests/test_frontend_contracts.py107CODE
LOWtests/test_readme_api_reference.py59CODE
LOWpygwalker/api/_walker_reuse.py23CODE
LOWpygwalker/api/component.py161CODE
LOWpygwalker/api/component.py309CODE
LOWpygwalker/services/spec.py110CODE
LOWpygwalker/services/spec.py132CODE
LOWpygwalker/communications/gradio_comm.py51CODE
LOWpygwalker/communications/streamlit_comm.py121CODE
LOWscripts/dev.py186CODE
LOWpygwalker_tools/metrics/core.py177CODE
Cross-Language Confusion3 hits · 12 pts
SeverityFileLineSnippetContext
HIGHpygwalker/utils/frontend_assets.py25 "or `cd app && yarn build` before enabling dev mode."CODE
HIGHscripts/dev.py7 * frontend -> ``cd app && yarn dev:build`` (``vite build --watch``) rebuildsSTRING
HIGHscripts/dev.py222 yarn = _resolve_exe("yarn", "Install Node.js 22.x and Yarn 1.x, then run `cd app && yarn install`.")CODE
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICALapp/src/utils/communication.tsx232 const domain = window.parent.document.location.host.split(".").slice(-2).join('.');CODE
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMdocs/JUPYTER_EXTENSION_ROADMAP.md309## 9. Release and dependency guardrailsCOMMENT
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWscripts/test-init.sh37# Check if the file was downloaded successfullyCOMMENT
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOWapp/src/utils/communication.tsx185 attributeFilter: ["placeholder"],CODE