AI Slop Code RIsk Monitor

yutto-dev/yutto

:ice_cube: 一个可爱且任性的 B 站视频下载器

15.4 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for yutto-dev/yutto, a Python project with 2,064 GitHub stars. SynthScan examined 37,665 lines of code across 260 source files, recording 538 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 15.4 (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.

15.4
Adjusted Signal
15.4
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
2.1K
Stars
Python
Language
37.7K
Lines of Code
260
Files
538
Pattern Hits
2026-10-12
Scan Date
0.02
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 37.1/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 24.0/100 · LOW

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

Agent Over-Engineering Ratio 38.0/100 · MEDIUM

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

PR Review Velocity Impact 52.5/100 · HIGH

Which changes need focused human review? 538 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 4MEDIUM 1LOW 533

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 538 distinct pattern matches across 10 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 Identifiers312 hits · 336 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_auth.py14def test_parse_auth_inline_handles_case_and_spaces():CODE
LOW⚡tests/test_auth.py18def test_parse_auth_inline_requires_sessdata():CODE
LOW⚡tests/test_auth.py22def test_format_auth_inline_omits_empty_bili_jct():CODE
LOW⚡tests/test_auth.py26def test_resolve_auth_prefers_inline_auth(tmp_path: Path):CODE
LOWtests/test_auth.py39def test_resolve_auth_rejects_invalid_auth_file(tmp_path: Path):CODE
LOW⚡tests/test_auth.py53def test_save_and_load_auth_round_trip(tmp_path: Path):CODE
LOW⚡tests/test_auth.py61def test_save_auth_clears_stale_bili_jct(tmp_path: Path):CODE
LOW⚡tests/test_auth.py71def test_load_auth_returns_none_for_invalid_file(tmp_path: Path):CODE
LOW⚡tests/test_auth.py78def test_load_auth_rejects_invalid_profile(tmp_path: Path):CODE
LOW⚡tests/test_auth.py83def test_remove_auth_removes_target_profile_only(tmp_path: Path):CODE
LOW⚡tests/test_auth.py94def test_remove_auth_deletes_empty_auth_file(tmp_path: Path):CODE
LOW⚡tests/test_auth.py103def test_remove_auth_returns_false_when_profile_missing(tmp_path: Path):CODE
LOW⚡tests/test_auth.py109def test_remove_auth_rejects_invalid_existing_auth_file(tmp_path: Path):CODE
LOWtests/test_login.py22async def test_validate_saved_auth_uses_yutto_session_with_auth_cookies(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py56def test_run_login_saves_and_validates_auth(CODE
LOWtests/test_login.py113async def test_poll_qr_login_reports_status_changes_and_returns_redirect(CODE
LOWtests/test_login.py153async def test_poll_qr_login_rejects_invalid_intervals():CODE
LOWtests/test_login.py165async def test_complete_login_falls_back_to_redirect_query(capsys: pytest.CaptureFixture[str]):CODE
LOWtests/test_login.py183def test_get_cookie_value_probes_bilibili_domains_in_priority_order():CODE
LOWtests/test_login.py244def test_auth_logout_removes_only_selected_profile_and_is_idempotent(CODE
LOWtests/test_login.py260def test_auth_logout_rejects_invalid_auth(tmp_path: Path, capsys: pytest.CaptureFixture[str], inline_auth: bool):CODE
LOW⚡tests/test_cli.py65def test_download_parser_accepts_auth_file(tmp_path: Path):CODE
LOW⚡tests/test_cli.py73def test_download_parser_rejects_auth_config(tmp_path: Path):CODE
LOW⚡tests/test_cli.py82def test_download_parser_accepts_ffmpeg_path():CODE
LOW⚡tests/test_cli.py92def test_download_configures_ffmpeg_path_at_command_boundary(monkeypatch: pytest.MonkeyPatch):CODE
LOW⚡tests/test_cli.py147def test_login_parser_accepts_auth_file(tmp_path: Path):CODE
LOW⚡tests/test_cli.py155def test_login_parser_rejects_auth_config(tmp_path: Path):CODE
LOW⚡tests/test_cli.py164def test_auth_status_parser_accepts_auth_file(tmp_path: Path):CODE
LOW⚡tests/test_cli.py172def test_auth_logout_parser_accepts_auth_file(tmp_path: Path):CODE
LOW⚡tests/test_cli.py180def test_root_parser_accepts_auth_login(tmp_path: Path):CODE
LOW⚡tests/test_cli.py190def test_root_parser_accepts_auth_status(tmp_path: Path):CODE
LOW⚡tests/test_cli.py200def test_root_parser_accepts_auth_logout(tmp_path: Path):CODE
LOWtests/test_cli.py119def test_download_validation_rejects_non_positive_num_workers(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py132def test_download_jobs_default_to_one_and_reject_non_positive_values(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py211def test_get_download_subparser_reports_missing_download(subcommand: str | None):CODE
LOWtests/test_cli.py219def test_progress_renderer_respects_no_progress(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py244def test_progress_bar_renders_committed_buffered_and_remaining_segments(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py297def test_progress_renderer_turns_only_buffered_segment_red(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py319def test_progress_renderer_tracks_multiple_items_and_removes_completed_rows(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py338def test_progress_renderer_aligns_and_truncates_labels(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py368def test_progress_renderer_compresses_bar_before_label(CODE
LOWtests/test_cli.py388def test_progress_renderer_avoids_wrapping_for_wide_stats(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py401def test_run_download_scopes_report_renderer_and_cleans_up_on_cancel(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_server/test_command.py22def test_serve_is_an_explicit_subcommand():CODE
LOWtests/test_server/test_command.py31def test_serve_jobs_configures_download_runtime_workers():CODE
LOWtests/test_server/test_command.py43def test_serve_accepts_ffmpeg_path():CODE
LOWtests/test_server/test_command.py48def test_serve_configures_ffmpeg_path_at_command_boundary(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_server/test_command.py65def test_serve_argument_error_is_rendered_without_traceback(CODE
LOWtests/test_server/test_command.py104def test_environment_token_takes_precedence(tmp_path):CODE
LOWtests/test_server/test_command.py115def test_missing_token_file_is_created_with_a_generated_token(tmp_path):CODE
LOWtests/test_server/test_command.py127def test_empty_token_file_is_rejected(tmp_path):CODE
LOWtests/test_server/test_command.py138def test_existing_token_file_must_be_private_and_cannot_be_a_symlink(tmp_path):CODE
LOW⚡tests/test_server/test_service.py120def test_prepare_request_rejects_subpath_template_escape(tmp_path: Path, template: str):CODE
LOW⚡tests/test_server/test_service.py128def test_prepare_request_rejects_advanced_format_template_escape(tmp_path: Path, template: str):CODE
LOW⚡tests/test_server/test_service.py135def test_prepare_request_marks_final_output_path_for_boundary_enforcement(tmp_path: Path):CODE
LOW⚡tests/test_server/test_service.py155def test_policy_rejects_worker_counts_outside_configured_limits(tmp_path: Path, network: object):CODE
LOW⚡tests/test_server/test_service.py162def test_prepare_request_rejects_invalid_auth_profile(tmp_path: Path):CODE
LOW⚡tests/test_server/test_service.py170def test_policy_rejects_unsafe_block_sizes(tmp_path: Path, block_size: int):CODE
LOW⚡tests/test_server/test_service.py177def test_policy_rejects_ffmpeg_save_codecs_outside_server_capabilities(tmp_path: Path):CODE
LOWtests/test_server/test_service.py66def test_prepare_request_resolves_output_paths_under_server_roots(tmp_path: Path):CODE
252 more matches not shown…
Unused Imports203 hits · 202 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py1CODE
LOWtests/test_auth.py1CODE
LOWtests/test_login.py1CODE
LOWtests/test_e2e.py1CODE
LOWtests/test_cli.py1CODE
LOWtests/test_server/test_command.py1CODE
LOWtests/test_server/test_command.py5CODE
LOWtests/test_server/test_command.py17CODE
LOWtests/test_server/test_service.py1CODE
LOWtests/test_server/test_websocket.py1CODE
LOWtests/test_server/__init__.py1CODE
LOWtests/test_server/test_rpc.py1CODE
LOWtests/test_utils/test_filter.py1CODE
LOWtests/test_utils/test_formatter.py1CODE
LOWtests/test_utils/test_asynclib.py1CODE
LOWtests/test_utils/test_status_bar.py1CODE
LOWtests/test_utils/test_data_access.py1CODE
LOWtests/test_utils/test_fetcher.py1CODE
LOWtests/test_utils/test_ffmpeg.py1CODE
LOWtests/test_utils/test_ffmpeg.py23CODE
LOWtests/test_runtime/test_tasks.py1CODE
LOWtests/test_core/test_result.py1CODE
LOWtests/test_core/test_request.py1CODE
LOWtests/test_core/test_task_service.py1CODE
LOWtests/test_core/test_execution.py1CODE
LOWtests/test_core/test_application.py1CODE
LOWtests/test_core/test_native_session.py1CODE
LOWtests/test_api/test_user_info.py1CODE
LOWtests/test_api/test_cheese.py1CODE
LOWtests/test_api/test_space.py1CODE
LOWtests/test_api/test_bangumi.py1CODE
LOWtests/test_api/test_bangumi.py3CODE
LOWtests/test_api/test_bangumi.py8CODE
LOWtests/test_api/test_collection.py1CODE
LOWtests/test_api/test_ugc_video.py1CODE
LOWtests/test_api/test_danmaku.py1CODE
LOWtests/test_processor/test_resolve.py1CODE
LOWtests/test_processor/test_selector.py1CODE
LOWtests/test_processor/test_subtitle_languages.py1CODE
LOWtests/test_processor/test_download_result.py1CODE
LOWtests/test_processor/test_download_result.py6CODE
LOWtests/test_processor/test_download_result.py25CODE
LOWtests/test_processor/test_download_result.py25CODE
LOWtests/test_processor/test_path_leases.py1CODE
LOWtests/test_processor/test_audio_save_codec.py1CODE
LOWtests/test_processor/test_download_planner.py1CODE
LOWtests/test_processor/test_structured_errors.py1CODE
LOWtests/test_processor/test_batch_resolve.py1CODE
LOWtests/test_processor/test_downloader.py1CODE
LOWtests/test_processor/test_manager_semantics.py1CODE
LOWtests/test_processor/test_path_resolver.py1CODE
LOWtests/test_processor/test_download_lifecycle.py1CODE
LOWtests/helpers/http_range_server.py1CODE
LOWscripts/prepare-ci-cache.py1CODE
LOWscripts/get-version.py1CODE
LOWscripts/generate-schema.py1CODE
LOWpackages/biliass/src/biliass/__init__.py1CODE
LOWpackages/biliass/src/biliass/__init__.py3CODE
LOWpackages/biliass/src/biliass/__init__.py3CODE
LOWpackages/biliass/src/biliass/__init__.py8CODE
143 more matches not shown…
Empty Error Handlers3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHsrc/yutto/server/command.py51except FileNotFoundError:CODE
HIGHsrc/yutto/utils/ffmpeg.py104except ProcessLookupError:CODE
HIGHsrc/yutto/utils/console/attributes.py27except (AttributeError, ValueError, OSError):CODE
Deep Nesting8 hits · 8 pts
SeverityFileLineSnippetContext
LOWtests/test_server/test_websocket.py464CODE
LOWtests/test_server/test_websocket.py553CODE
LOWpackages/biliass/src/biliass/biliass.py18CODE
LOWsrc/yutto/input_parser.py65CODE
LOWsrc/yutto/login.py179CODE
LOWsrc/yutto/runtime/tasks.py529CODE
LOWsrc/yutto/downloader/executor.py30CODE
LOWsrc/yutto/utils/danmaku.py78CODE
Excessive Try-Catch Wrapping7 hits · 7 pts
SeverityFileLineSnippetContext
LOWsrc/yutto/login.py105 except Exception as e:CODE
LOWsrc/yutto/login.py174 except Exception as e:CODE
LOWsrc/yutto/login.py303 except Exception as e:CODE
LOWsrc/yutto/runtime/tasks.py557 except Exception as error:CODE
LOWsrc/yutto/server/rpc.py129 except Exception:CODE
LOWsrc/yutto/utils/asynclib.py50 except Exception as error:CODE
LOWsrc/yutto/utils/console/formatter.py68 except Exception:CODE
Cross-Language Confusion1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHtests/test_server/test_rpc.py58 response = await dispatcher.dispatch('{"jsonrpc":"2.0","method":"record","params":{"value":"request"},"id":null}')CODE
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMskills/bilibili-video-download/SKILL.md157## Input validation and security guardrailsCOMMENT
Over-Commented Block1 hit · 1 pts
SeverityFileLineSnippetContext
LOWdocs/guide/cli/batch.md41# 如果我们只想下载第 3 话,只需要这样COMMENT
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWpackages/biliass/src/biliass/biliass.py18CODE
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOWsrc/yutto/_native.py20__all__ = [CODE