AI Slop Code RIsk Monitor

Usagi-org/ai-goofish-monitor

基于 Playwright 和AI实现的闲鱼多任务实时/定时监控与智能分析系统,配备了功能完善的后台管理UI。帮助用户从闲鱼海量商品中,找到心仪产品。

11.9 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for Usagi-org/ai-goofish-monitor, a Python project with 14,765 GitHub stars. SynthScan examined 35,361 lines of code across 275 source files, recording 378 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 11.9 (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.

11.9
Adjusted Signal
11.9
Raw Pattern Score
100%
Time Factor
2026-10-10
Last Push
14.8K
Stars
Python
Language
35.4K
Lines of Code
275
Files
378
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 29.3/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 8.5/100 · LOW

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

Agent Over-Engineering Ratio 38.5/100 · MEDIUM

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

PR Review Velocity Impact 46.1/100 · MEDIUM

Which changes need focused human review? 378 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

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

No multi-scan history yet — run the scanner again to build trend data.

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 11MEDIUM 2LOW 365

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 378 distinct pattern matches across 8 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 Identifiers223 hits · 230 pts
SeverityFileLineSnippetContext
LOWweb-ui/src/components/tasks/TaskForm.vue177function handleAccountStrategyChange(event: Event) {CODE
LOWweb-ui/src/components/tasks/TaskForm.vue182function handleAccountStateFileChange(event: Event) {CODE
LOWweb-ui/src/components/results/ResultsFilterBar.vue79function handleToggleAiRecommended(value: boolean) {CODE
LOWweb-ui/src/components/results/ResultsFilterBar.vue86function handleToggleKeywordRecommended(value: boolean) {CODE
LOWweb-ui/src/api/settings.ts114export async function updateNotificationSettings(settings: NotificationSettingsUpdate): Promise<{ message: string; confiCODE
LOWweb-ui/src/api/results.ts39export async function updateResultBlacklistRules(filename: string, keywords: string[]): Promise<{ message: string; keywoCODE
LOWweb-ui/src/i18n/index.ts66export function formatRelativeTimeFromNow(value: string | null | undefined) {CODE
LOW⚡tests/conftest.py120 def override_get_task_service():CODE
LOW⚡tests/conftest.py123 def override_get_process_service():CODE
LOW⚡tests/conftest.py126 def override_get_scheduler_service():CODE
LOW⚡tests/conftest.py129 def override_get_task_generation_service():CODE
LOWtests/test_failure_guard.py8def test_failure_guard_opens_circuit_after_threshold_and_rate_limits(tmp_path):CODE
LOWtests/test_failure_guard.py49def test_failure_guard_auto_recovers_on_cookie_change(tmp_path):CODE
LOWtests/test_frontend_build_paths.py14def test_frontend_build_output_path_is_consistent_across_configs():CODE
LOWtests/unit/test_utils.py12def test_safe_get_nested_and_default():CODE
LOWtests/unit/test_utils.py18def test_format_registration_days():CODE
LOWtests/unit/test_search_pagination.py36 async def scroll_into_view_if_needed(self) -> None:CODE
LOWtests/unit/test_search_pagination.py94def test_advance_search_page_stops_when_no_next_button() -> None:CODE
LOWtests/unit/test_search_pagination.py115def test_advance_search_page_stops_after_timeout_retries() -> None:CODE
LOWtests/unit/test_search_pagination.py146def test_advance_search_page_returns_new_response_on_success() -> None:CODE
LOWtests/unit/test_search_pagination.py170def test_advance_search_page_stops_when_click_times_out() -> None:CODE
LOW⚡tests/unit/test_search_pagination.py195def test_is_search_results_response_matches_exact_search_api() -> None:CODE
LOW⚡tests/unit/test_search_pagination.py204def test_is_search_results_response_rejects_search_shade_api() -> None:CODE
LOW⚡tests/unit/test_search_pagination.py213def test_is_search_results_response_rejects_non_post_request() -> None:CODE
LOWtests/unit/test_item_analysis_dispatcher.py9def test_item_analysis_dispatcher_uses_bounded_concurrency():CODE
LOWtests/unit/test_item_analysis_dispatcher.py81def test_item_analysis_dispatcher_supports_keyword_mode_without_ai():CODE
LOWtests/unit/test_task_log_cleanup_service.py23def test_cleanup_task_logs_removes_only_expired_top_level_logs(tmp_path):CODE
LOWtests/unit/test_task_log_cleanup_service.py50def test_cleanup_task_logs_skips_when_retention_is_invalid(tmp_path):CODE
LOWtests/unit/test_ai_handler_analysis.py18def test_get_ai_analysis_stops_after_internal_retries_when_content_is_none(CODE
LOWtests/unit/test_ai_handler_analysis.py45def test_get_ai_analysis_returns_parsed_json(monkeypatch, tmp_path):CODE
LOWtests/unit/test_ai_handler_analysis.py75def test_get_ai_analysis_retries_without_structured_output_when_model_rejects_it(CODE
LOWtests/unit/test_ai_handler_analysis.py123def test_get_ai_analysis_falls_back_to_responses_when_chat_completions_api_is_missing(CODE
LOWtests/unit/test_ai_handler_analysis.py175def test_get_ai_analysis_retries_without_temperature_when_gateway_rejects_it(CODE
LOWtests/unit/test_ai_handler_analysis.py216def test_get_ai_analysis_uses_first_json_object_when_model_returns_multiple_objects(CODE
LOWtests/unit/test_seller_profile_cache.py6def test_seller_profile_cache_reuses_value_and_returns_copy():CODE
LOWtests/unit/test_seller_profile_cache.py27def test_seller_profile_cache_coalesces_inflight_requests():CODE
LOWtests/unit/test_domain_task.py4def test_task_can_start_and_stop():CODE
LOWtests/unit/test_domain_task.py54def test_legacy_keyword_groups_are_flattened_to_keyword_rules():CODE
LOWtests/unit/test_domain_task.py79def test_generate_request_accepts_legacy_group_payload():CODE
LOWtests/unit/test_domain_task.py90def test_generate_request_enables_image_analysis_by_default():CODE
LOWtests/unit/test_domain_task.py100def test_generate_request_infers_fixed_account_strategy_from_state_file():CODE
LOWtests/unit/test_domain_task.py112def test_generate_request_requires_state_file_for_fixed_account_strategy():CODE
LOWtests/unit/test_result_blacklist_service.py13def test_regex_blacklist_rule_matches_aliases_case_insensitively():CODE
LOWtests/unit/test_result_blacklist_service.py22def test_regex_blacklist_rule_does_not_hide_plain_pro_models():CODE
LOWtests/unit/test_ai_handler_downloads.py7def test_download_all_images_runs_with_concurrency(tmp_path, monkeypatch):CODE
LOWtests/unit/test_scraper_region_filter.py9def test_region_selectors_ignore_stale_css_module_hashes():CODE
LOWtests/unit/test_scraper_region_filter.py18def test_region_submit_text_matches_live_button_label():CODE
LOWtests/unit/test_prompt_utils.py9def test_generate_criteria_closes_ai_client_after_success(monkeypatch, tmp_path):CODE
LOWtests/unit/test_prompt_utils.py37def test_generate_criteria_drops_think_blocks_and_raises_output_limit(monkeypatch, tmp_path):CODE
LOWtests/unit/test_prompt_utils.py67def test_generate_criteria_rejects_truncated_think_block(monkeypatch, tmp_path):CODE
LOWtests/unit/test_prompt_utils.py90def test_generate_criteria_closes_ai_client_after_ai_failure(monkeypatch, tmp_path):CODE
LOWtests/unit/test_env_manager.py4def test_get_value_prefers_env_file_when_key_present(tmp_path, monkeypatch):CODE
LOWtests/unit/test_env_manager.py14def test_get_value_falls_back_to_runtime_when_key_missing_from_env_file(tmp_path, monkeypatch):CODE
LOW⚡tests/unit/test_scraper_browser_channel.py17def test_resolve_browser_channel_uses_chromium_in_docker_even_when_edge_requested(monkeypatch, capsys):CODE
LOW⚡tests/unit/test_scraper_browser_channel.py24def test_resolve_browser_channel_uses_msedge_locally_when_requested(monkeypatch):CODE
LOW⚡tests/unit/test_scraper_browser_channel.py30def test_chromium_launch_args_disable_crashpad_and_pin_dump_dir():CODE
LOWtests/unit/test_ai_client.py22def test_build_messages_without_images_uses_text_only_content():CODE
LOWtests/unit/test_ai_client.py37def test_build_messages_with_images_uses_multimodal_content(monkeypatch):CODE
LOWtests/unit/test_ai_client.py53def test_build_responses_input_converts_multimodal_messages():CODE
LOWtests/unit/test_ai_client.py81def test_call_ai_retries_without_structured_output_when_model_rejects_it():CODE
163 more matches not shown…
Excessive Try-Catch Wrapping76 hits · 70 pts
SeverityFileLineSnippetContext
LOWspider_v2.py136 except Exception as e:STRING
LOWspider_v2.py147 except Exception as e:STRING
LOWtests/live/conftest.py78 except Exception:CODE
LOWsrc/scraper.py201 except Exception as e:CODE
LOWsrc/scraper.py425 except Exception as e:CODE
LOWsrc/scraper.py437 except Exception as e:CODE
LOWsrc/scraper.py448 except Exception as e:CODE
LOWsrc/scraper.py496 except Exception as e:CODE
LOWsrc/scraper.py610 except Exception as e:CODE
LOWsrc/scraper.py811 except Exception as e:STRING
LOWsrc/scraper.py833 except Exception as e:STRING
LOWsrc/scraper.py935 except Exception as e:STRING
LOWsrc/scraper.py1178 except Exception as e:STRING
LOWsrc/scraper.py1186 except Exception as e:STRING
LOWsrc/scraper.py1210 except Exception as e:STRING
LOWsrc/scraper.py1273 except Exception as e:STRING
LOWsrc/scraper.py1332 except Exception as e:STRING
LOWsrc/config.py78 except Exception as e:CODE
LOWsrc/ai_handler.py193 except Exception as e:CODE
LOWsrc/ai_handler.py206 except Exception as e:CODE
LOWsrc/ai_handler.py224 except Exception as e:CODE
LOWsrc/ai_handler.py235 except Exception as e:CODE
LOWsrc/ai_handler.py368 except Exception as e:CODE
LOWsrc/ai_handler.py445 except Exception as e:CODE
LOWsrc/parsers.py64 except Exception as e:CODE
LOWsrc/utils.py38 except Exception as e:CODE
LOWsrc/utils.py72 except Exception:CODE
LOWsrc/utils.py126 except Exception as e:CODE
LOWsrc/prompt_utils.py87 except Exception as exc:STRING
LOWsrc/prompt_utils.py102 except Exception as close_error:STRING
LOWsrc/prompt_utils.py137 except Exception as exc:STRING
LOWsrc/prompt_utils.py186 except Exception as e:STRING
LOWsrc/failure_guard.py29except Exception: # pragma: no coverCODE
LOWsrc/failure_guard.py99 except Exception:CODE
LOWsrc/failure_guard.py108 except Exception:CODE
LOWsrc/failure_guard.py126 except Exception:CODE
LOWsrc/failure_guard.py131 except Exception:CODE
MEDIUMsrc/failure_guard.py94def __enter__(self):CODE
MEDIUMsrc/failure_guard.py103def __exit__(self, exc_type, exc, tb):CODE
LOWsrc/api/routes/tasks.py124 except Exception as e:CODE
LOWsrc/api/routes/tasks.py203 except Exception as e:CODE
LOWsrc/api/routes/tasks.py242 except Exception as e:CODE
LOWsrc/api/routes/tasks.py249 except Exception as e:CODE
LOWsrc/api/routes/results.py115 except Exception as exc:CODE
LOWsrc/api/routes/results.py170 except Exception as exc:CODE
LOWsrc/api/routes/login_state.py36 except Exception as e:CODE
LOWsrc/api/routes/prompts.py65 except Exception as e:CODE
LOWsrc/api/routes/dashboard.py21 except Exception as exc:CODE
LOWsrc/api/routes/logs.py97 except Exception as e:CODE
LOWsrc/api/routes/logs.py152 except Exception as e:CODE
LOWsrc/api/routes/logs.py186 except Exception as e:CODE
LOWsrc/api/routes/logs.py199 except Exception as e:CODE
LOWsrc/api/routes/settings.py325 except Exception as exc:CODE
LOWsrc/api/routes/settings.py345 except Exception as exc:CODE
LOWsrc/api/routes/websocket.py33 except Exception as e:CODE
LOWsrc/api/routes/websocket.py52 except Exception:CODE
LOWsrc/infrastructure/config/env_manager.py68 except Exception as e:CODE
LOWsrc/infrastructure/config/env_manager.py83 except Exception as e:CODE
LOWsrc/infrastructure/config/env_manager.py94 except Exception as e:CODE
LOWsrc/infrastructure/external/ai_client.py119 except Exception as e:CODE
16 more matches not shown…
Unused Imports48 hits · 48 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py2CODE
LOWtests/test_failure_guard.py1CODE
LOWtests/test_frontend_build_paths.py1CODE
LOWtests/unit/test_task_log_cleanup_service.py1CODE
LOWtests/live/conftest.py1CODE
LOWtests/live/_support.py1CODE
LOWtests/live/test_live_smoke.py1CODE
LOWsrc/ai_handler.py10CODE
LOWsrc/ai_handler.py10CODE
LOWsrc/ai_handler.py10CODE
LOWsrc/ai_handler.py10CODE
LOWsrc/ai_handler.py50CODE
LOWsrc/app.py8CODE
LOWsrc/failure_guard.py12CODE
LOWsrc/core/cron_utils.py4CODE
LOWsrc/api/dependencies.py5CODE
LOWsrc/api/routes/settings.py18CODE
LOWsrc/infrastructure/config/__init__.py1CODE
LOWsrc/infrastructure/config/__init__.py1CODE
LOWsrc/infrastructure/config/__init__.py1CODE
LOWsrc/infrastructure/config/__init__.py1CODE
LOW…c/infrastructure/persistence/sqlite_task_repository.py4CODE
LOWsrc/infrastructure/persistence/sqlite_bootstrap.py4CODE
LOWsrc/infrastructure/persistence/sqlite_connection.py4CODE
LOWsrc/infrastructure/persistence/storage_names.py4CODE
LOWsrc/infrastructure/external/ai_client.py10CODE
LOW…frastructure/external/notification_clients/__init__.py1CODE
LOW…frastructure/external/notification_clients/__init__.py1CODE
LOW…frastructure/external/notification_clients/__init__.py2CODE
LOW…frastructure/external/notification_clients/__init__.py3CODE
LOW…frastructure/external/notification_clients/__init__.py4CODE
LOW…frastructure/external/notification_clients/__init__.py5CODE
LOW…frastructure/external/notification_clients/__init__.py6CODE
LOW…frastructure/external/notification_clients/__init__.py7CODE
LOW…frastructure/external/notification_clients/__init__.py8CODE
LOWsrc/domain/repositories/task_repository.py7CODE
LOWsrc/domain/repositories/task_repository.py8CODE
LOWsrc/domain/models/__init__.py1CODE
LOWsrc/domain/models/__init__.py1CODE
LOWsrc/domain/models/__init__.py1CODE
LOWsrc/domain/models/__init__.py1CODE
LOWsrc/services/price_history_service.py4CODE
LOWsrc/services/dashboard_payloads.py4CODE
LOWsrc/services/dashboard_service.py5CODE
LOWsrc/services/result_blacklist_service.py4CODE
LOWsrc/services/result_storage_service.py4CODE
LOWsrc/services/task_payloads.py4CODE
LOWsrc/services/task_log_cleanup_service.py4CODE
Empty Error Handlers8 hits · 40 pts
SeverityFileLineSnippetContext
HIGHspider_v2.py186except NotImplementedError:CODE
HIGHsrc/scraper.py760except PlaywrightTimeoutError:CODE
HIGHsrc/scraper.py783except PlaywrightTimeoutError:CODE
HIGHsrc/scraper.py892except PlaywrightTimeoutError:CODE
HIGHsrc/failure_guard.py99except Exception:CODE
HIGHsrc/failure_guard.py108except Exception:CODE
HIGHsrc/failure_guard.py131except Exception:CODE
HIGHsrc/services/process_service.py60except Exception:CODE
Deep Nesting15 hits · 15 pts
SeverityFileLineSnippetContext
LOWspider_v2.py15CODE
LOWsrc/scraper.py402CODE
LOWsrc/scraper.py506CODE
LOWsrc/scraper.py416CODE
LOWsrc/scraper.py599CODE
LOWsrc/ai_handler.py298CODE
LOWsrc/parsers.py8CODE
LOWsrc/parsers.py69CODE
LOWsrc/parsers.py147CODE
LOWsrc/prompt_utils.py144CODE
LOWsrc/api/routes/tasks.py141CODE
LOWsrc/infrastructure/persistence/sqlite_bootstrap.py116CODE
LOWsrc/infrastructure/persistence/sqlite_bootstrap.py146CODE
LOWsrc/infrastructure/external/ai_client.py197CODE
LOWsrc/services/task_generation_service.py69CODE
Cross-Language Confusion3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHsrc/scraper.py666 Object.defineProperty(navigator, 'webdriver', {get: () => undefined});CODE
HIGHsrc/app.py163 content={"error": "前端构建产物不存在,请先运行 cd web-ui && npm run build"}CODE
HIGHsrc/app.py184 content={"error": "前端构建产物不存在,请先运行 cd web-ui && npm run build"}CODE
Modern Structural Boilerplate4 hits · 4 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_task_log_cleanup_service.py14def _set_mtime(path: Path, when: datetime) -> None:CODE
LOWsrc/infrastructure/config/__init__.py3__all__ = ["settings", "AppSettings", "AISettings", "NotificationSettings"]CODE
LOW…frastructure/external/notification_clients/__init__.py10__all__ = [CODE
LOWsrc/domain/models/__init__.py3__all__ = ["Task", "TaskCreate", "TaskUpdate", "TaskStatus"]CODE
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWsrc/api/routes/results.py83CODE