AI Slop Code Risk Monitor

SaladDay/cc-switch-cli

SlopCodeMonitor badge for SaladDay/cc-switch-cli Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

⭐️ A cross-platform CLI All-in-One assistant tool for Claude Code, Codex & Gemini CLI.

0.8 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for SaladDay/cc-switch-cli, a Rust project with 5,421 GitHub stars. SynthScan examined 435,713 lines of code across 487 source files, recording 257 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 0.8 (Low 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.

0.8
Adjusted Signal
0.8
Raw Pattern Score
100%
Time Factor
2026-10-25
Last Push
5.4K
Stars
Rust
Language
435.7K
Lines of Code
487
Files
257
Pattern Hits
2026-10-31
Scan Date
0.03
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 2.3/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.5/100 · LOW

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

Agent Over-Engineering Ratio 1.5/100 · LOW

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

PR Review Velocity Impact 4.2/100 · LOW

Which changes need focused human review? 257 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 13MEDIUM 26LOW 218

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 257 distinct pattern matches across 14 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.

Over-Commented Block155 hits · 155 pts
SeverityFileLineSnippetContext
LOWsrc-tauri/tests/proxy_daemon.rs1//! End-to-end tests for the supervisor daemon.COMMENT
LOWsrc-tauri/tests/proxy_daemon.rs621 );COMMENT
LOWsrc-tauri/tests/proxy_daemon.rs721/// Concurrency reproducer for "daemon ensure worker failed: ResourceCOMMENT
LOWsrc-tauri/src/hermes_config.rs1//! Hermes Agent configuration read/write module (ported from upstream cc-switch).COMMENT
LOWsrc-tauri/src/hermes_config.rs21//! base_url: https://openrouter.ai/api/v1COMMENT
LOWsrc-tauri/src/hermes_config.rs121// Type DefinitionsCOMMENT
LOWsrc-tauri/src/hermes_config.rs641// Provider Public APICOMMENT
LOWsrc-tauri/src/provider.rs61// SSOT 模式:不再写供应商副本文件COMMENT
LOWsrc-tauri/src/provider.rs81 /// 备注信息COMMENT
LOWsrc-tauri/src/provider.rs341 #[serde(rename = "baseUrl")]COMMENT
LOWsrc-tauri/src/provider.rs361 #[serde(rename = "codingPlanProvider")]COMMENT
LOWsrc-tauri/src/provider.rs401pub struct ProviderTestConfig {COMMENT
LOWsrc-tauri/src/provider.rs421 #[serde(rename = "maxRetries", skip_serializing_if = "Option::is_none")]COMMENT
LOWsrc-tauri/src/provider.rs441 #[serde(rename = "proxyUsername", skip_serializing_if = "Option::is_none")]COMMENT
LOWsrc-tauri/src/provider.rs461pub struct AuthBinding {COMMENT
LOWsrc-tauri/src/provider.rs481 pub thinking_param: Option<String>,COMMENT
LOWsrc-tauri/src/provider.rs521 /// Codex 官方供应商标记(官方无需填写 API Key,使用 codex login 凭证)COMMENT
LOWsrc-tauri/src/provider.rs541 pub partner_promotion_key: Option<String>,COMMENT
LOWsrc-tauri/src/provider.rs561 /// - "anthropic": 原生 Anthropic Messages API,直接透传COMMENT
LOWsrc-tauri/src/provider.rs581 /// fallback. Keeping it per provider avoids hard failures on lower-ceilingCOMMENT
LOWsrc-tauri/src/provider.rs601 skip_serializing_if = "Option::is_none"COMMENT
LOWsrc-tauri/src/codex_config.rs21///COMMENT
LOWsrc-tauri/src/codex_config.rs421COMMENT
LOWsrc-tauri/src/codex_config.rs641struct CodexCatalogModelSpec {COMMENT
LOWsrc-tauri/src/usage_events.rs1//! Usage event notification shim for the CLI build.COMMENT
LOWsrc-tauri/src/app_config.rs161 /// 仓库所有者(GitHub 用户/组织)COMMENT
LOWsrc-tauri/src/app_config.rs181 #[serde(default)]COMMENT
LOWsrc-tauri/src/app_config.rs441#[derive(Debug, Clone, Serialize, Deserialize)]COMMENT
LOWsrc-tauri/src/settings.rs341/// These settings live in `settings.json`; they are intentionally not part ofCOMMENT
LOWsrc-tauri/src/settings.rs501 #[serde(default)]COMMENT
LOWsrc-tauri/src/settings.rs521 pub enable_claude_plugin_integration: bool,COMMENT
LOWsrc-tauri/src/settings.rs561 #[serde(default, skip_serializing_if = "Option::is_none")]COMMENT
LOWsrc-tauri/src/settings.rs581 /// into the shared bucket. Persisted so a failed migration retries at startup;COMMENT
LOWsrc-tauri/src/gemini_config.rs61/// 返回 `AppError` 如果遇到以下情况:COMMENT
LOWsrc-tauri/src/gemini_config.rs381COMMENT
LOWsrc-tauri/src/gemini_config.rs401/// 保留文件中的其他所有字段。COMMENT
LOWsrc-tauri/src/mcp.rs1421pub fn remove_server_from_opencode(id: &str) -> Result<(), AppError> {COMMENT
LOWsrc-tauri/src/session_manager/cache.rs1//! Persistent session-scan metadata cache (stale-while-revalidate).COMMENT
LOWsrc-tauri/src/session_manager/cache.rs21/// Version tag written with every cached row. Bump this constant whenever theCOMMENT
LOWsrc-tauri/src/session_manager/scan_cache_store.rs41}COMMENT
LOWsrc-tauri/src/session_manager/scan_cache_store.rs61 pub state: Option<String>,COMMENT
LOWsrc-tauri/src/session_manager/paged_manifest.rs1//! Schema-free, page-oriented storage for very large Sessions lists.COMMENT
LOWsrc-tauri/src/session_manager/mod.rs21COMMENT
LOWsrc-tauri/src/session_manager/mod.rs41 #[serde(skip_serializing_if = "Option::is_none")]COMMENT
LOWsrc-tauri/src/session_manager/providers/opencode.rs421/// summary 晚到/变化不改变 session JSON 与 message 目录 stat,缓存会长期返回COMMENT
LOWsrc-tauri/src/database/mod.rs1//! 数据库模块 - SQLite 数据持久化COMMENT
LOWsrc-tauri/src/database/mod.rs881 Ok(_) => {}COMMENT
LOWsrc-tauri/src/database/dao/usage_rollup.rs1//! Usage rollup DAOCOMMENT
LOWsrc-tauri/src/proxy/copilot_optimizer.rs1//! Copilot 请求优化器COMMENT
LOWsrc-tauri/src/proxy/copilot_optimizer.rs21 pub initiator: &'static str,COMMENT
LOWsrc-tauri/src/proxy/copilot_optimizer.rs321COMMENT
LOWsrc-tauri/src/proxy/copilot_optimizer.rs361COMMENT
LOWsrc-tauri/src/proxy/copilot_optimizer.rs441 }COMMENT
LOWsrc-tauri/src/proxy/types.rs61#[derive(Debug, Clone, Serialize, Deserialize, Default)]COMMENT
LOWsrc-tauri/src/proxy/types.rs81 /// 失败请求数COMMENT
LOWsrc-tauri/src/proxy/types.rs241}COMMENT
LOWsrc-tauri/src/proxy/gemini_url.rs1//! Gemini Native URL helpers.COMMENT
LOWsrc-tauri/src/proxy/gemini_url.rs601COMMENT
LOWsrc-tauri/src/proxy/gemini_url.rs641 false,COMMENT
LOWsrc-tauri/src/proxy/providers/copilot_model_map.rs1//! GitHub Copilot 模型 ID 归一化与 live-list 解析COMMENT
95 more matches not shown…
Decorative Section Separators23 hits · 69 pts
SeverityFileLineSnippetContext
MEDIUMinstall.sh17# ── helpers ──────────────────────────────────────────────────────────COMMENT
MEDIUMinstall.sh160# ── platform detection ───────────────────────────────────────────────COMMENT
MEDIUMinstall.sh190# ── download & extract ───────────────────────────────────────────────COMMENT
MEDIUMinstall.sh240# ── install ──────────────────────────────────────────────────────────COMMENT
MEDIUMinstall.sh324# ── main ─────────────────────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/session_manager/providers/hermes.rs386// ── SQLite scanning ─────────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/session_manager/providers/hermes.rs612// ── JSONL scanning ──────────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/proxy/copilot_optimizer.rs483// ─── 内部辅助 ─────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/proxy/copilot_optimizer.rs623// ─── 测试 ─────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/coding_plan.rs13// ── 供应商检测 ──────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/coding_plan.rs97// ── Kimi For Coding ─────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/coding_plan.rs197// ── 智谱 GLM ────────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/coding_plan.rs346// ── MiniMax ─────────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/coding_plan.rs469// ── OpenCode Go ─────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/coding_plan.rs588// ── 公开入口 ────────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/balance.rs9// ── 供应商检测 ──────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/balance.rs64// ── DeepSeek ────────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/balance.rs136// ── StepFun ─────────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/balance.rs188// ── SiliconFlow ─────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/balance.rs252// ── OpenRouter ──────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/balance.rs311// ── Novita AI ───────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/balance.rs369// ── 工具函数 ────────────────────────────────────────────────COMMENT
MEDIUMsrc-tauri/src/services/balance.rs379// ── 公开入口 ────────────────────────────────────────────────COMMENT
Empty Error Handlers9 hits · 45 pts
SeverityFileLineSnippetContext
HIGHscripts/benchmark_cc_switch.py368except sqlite3.Error:CODE
HIGHscripts/benchmark_cc_switch.py927except Exception:CODE
HIGHscripts/benchmark_cc_switch.py985except Exception:CODE
HIGHscripts/benchmark_cc_switch.py519except sqlite3.Error:CODE
HIGHscripts/benchmark_cc_switch.py1172except Exception:CODE
HIGHscripts/benchmark_cc_switch.py1241except OSError:CODE
HIGHscripts/benchmark_cc_switch.py1254except OSError:CODE
HIGHscripts/benchmark_cc_switch.py2079except Exception:CODE
HIGHscripts/benchmark_cc_switch.py2000except Exception:CODE
Magic Placeholder Names4 hits · 20 pts
SeverityFileLineSnippetContext
HIGHsrc-tauri/src/cli/i18n.rs11341 "⚠ 请确保已设置环境变量 {} 并包含您的 API 密钥\n 例如: export {}=\"your-api-key\"",CODE
HIGHsrc-tauri/src/cli/i18n.rs11346 "⚠ Make sure to set the {} environment variable with your API key\n Example: export {}=\"your-api-key\"CODE
HIGHsrc-tauri/src/cli/i18n.rs11366 例如: export {}=\"your-api-key\"",CODE
HIGHsrc-tauri/src/cli/i18n.rs11374 Example: export {}=\"your-api-key\"",CODE
Fake / Example Data15 hits · 15 pts
SeverityFileLineSnippetContext
LOWsrc-tauri/tests/credential_display_commands.rs288 "user@example.com",CODE
LOWsrc-tauri/tests/webdav_settings.rs16 username: "user@example.com".to_string(),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs1723 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs1958 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs1970 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs2034 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs2065 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs2397 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs2430 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs2481 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs2510 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs2526 Some("user@example.com".to_string()),CODE
LOWsrc-tauri/src/cli/tui/app/form_handlers/provider.rs2103 out.push_str("placeholder");CODE
LOWsrc-tauri/src/daemon/paths.rs241 file.write_all(b"placeholder")CODE
LOWsrc-tauri/src/daemon/migration.rs744 std::fs::write(&database_path, b"placeholder").expect("create database placeholder");CODE
Verbosity Indicators6 hits · 13 pts
SeverityFileLineSnippetContext
LOW⚡src-tauri/src/services/env_manager.rs23 // Step 1: Create backupCOMMENT
LOW⚡src-tauri/src/services/env_manager.rs26 // Step 2: Delete variablesCOMMENT
LOW⚡src-tauri/src/services/session_usage_codex.rs507 // Step 1: 小写COMMENT
LOW⚡src-tauri/src/services/session_usage_codex.rs510 // Step 2: 剥离 "provider/" 前缀(如 openai/, azure/)COMMENT
LOW⚡src-tauri/src/services/session_usage_codex.rs515 // Step 3: 剥离 ISO 日期后缀 -YYYY-MM-DD(正好 11 字符)COMMENT
LOWsrc-tauri/src/services/session_usage_codex.rs530 // Step 4: 剥离紧凑日期后缀 -YYYYMMDD(正好 9 字符)COMMENT
Structural Annotation Overuse6 hits · 13 pts
SeverityFileLineSnippetContext
LOW⚡src-tauri/src/services/env_manager.rs23 // Step 1: Create backupCOMMENT
LOW⚡src-tauri/src/services/env_manager.rs26 // Step 2: Delete variablesCOMMENT
LOW⚡src-tauri/src/services/session_usage_codex.rs507 // Step 1: 小写COMMENT
LOW⚡src-tauri/src/services/session_usage_codex.rs510 // Step 2: 剥离 "provider/" 前缀(如 openai/, azure/)COMMENT
LOW⚡src-tauri/src/services/session_usage_codex.rs515 // Step 3: 剥离 ISO 日期后缀 -YYYY-MM-DD(正好 11 字符)COMMENT
LOWsrc-tauri/src/services/session_usage_codex.rs530 // Step 4: 剥离紧凑日期后缀 -YYYYMMDD(正好 9 字符)COMMENT
Hyper-Verbose Identifiers13 hits · 8 pts
SeverityFileLineSnippetContext
LOW⚡scripts/test_benchmark_cc_switch.py20 def test_sessions_loaded_requires_a_published_manifest(self) -> None:CODE
LOW⚡scripts/test_benchmark_cc_switch.py29 def test_next_page_does_not_accept_a_first_page_relative_time(self) -> None:CODE
LOW⚡scripts/test_benchmark_cc_switch.py37 def test_usage_loaded_rejects_the_loading_frame(self) -> None:CODE
LOWscripts/test_benchmark_cc_switch.py49 def test_usage_loaded_accepts_a_nonzero_total_ending_in_zero(self) -> None:CODE
LOWscripts/test_benchmark_cc_switch.py56 def test_manifest_snapshots_are_scoped_to_the_selected_app(self) -> None:CODE
LOWscripts/benchmark_cc_switch.py1330def effective_current_provider(paths: Paths, app: str) -> str | None:STRING
LOWscripts/benchmark_cc_switch.py1340def find_provider_by_name_prefix(paths: Paths, app: str, name: str, id_prefix: str) -> str | None:STRING
LOWscripts/benchmark_cc_switch.py1368def remove_provider_prefix_direct(paths: Paths, app: str, provider_id_prefix: str) -> None:STRING
LOWscripts/benchmark_cc_switch.py1659def tui_sessions_loaded_marker(STRING
LOWscripts/benchmark_cc_switch.py1689def tui_sessions_route_marker(STRING
LOWscripts/benchmark_cc_switch.py1725def tui_sessions_next_page_marker(screen: str, total: int) -> bool:STRING
LOWscripts/benchmark_cc_switch.py1743def session_manifest_pointer_snapshot(paths: Paths, app: str) -> bytes | None:STRING
LOWscripts/benchmark_cc_switch.py1906 def sessions_manual_refresh_metadata_body(session: TuiSession) -> float:STRING
Excessive Try-Catch Wrapping11 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMscripts/benchmark_cc_switch.py1238def close(self) -> None:CODE
LOWscripts/benchmark_cc_switch.py150 except Exception:CODE
LOWscripts/benchmark_cc_switch.py927 except Exception:STRING
LOWscripts/benchmark_cc_switch.py985 except Exception:STRING
LOWscripts/benchmark_cc_switch.py1172 except Exception:STRING
LOWscripts/benchmark_cc_switch.py1789 except Exception as exc:STRING
LOWscripts/benchmark_cc_switch.py1808 except Exception as exc:STRING
LOWscripts/benchmark_cc_switch.py1823 except Exception as exc:STRING
LOWscripts/benchmark_cc_switch.py2000 except Exception:STRING
LOWscripts/benchmark_cc_switch.py2079 except Exception:STRING
LOWscripts/check_benchmark_thresholds.py62 except Exception as exc:CODE
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUM⚡src-tauri/src/resources/gpt5_5_template.json42 "base_instructions": "You are Codex, a coding agent based on GPT-5. You and the user share one workspace, and your jobCODE
MEDIUM⚡src-tauri/src/resources/gpt5_5_template.json44 "instructions_template": "You are Codex, a coding agent based on GPT-5. You and the user share one workspace, and yoCODE
Deep Nesting5 hits · 5 pts
SeverityFileLineSnippetContext
LOWscripts/benchmark_cc_switch.py921CODE
LOWscripts/benchmark_cc_switch.py1458CODE
LOWscripts/benchmark_cc_switch.py1751CODE
LOWscripts/benchmark_cc_switch.py1012CODE
LOWscripts/benchmark_cc_switch.py1075CODE
Unused Imports4 hits · 4 pts
SeverityFileLineSnippetContext
LOWscripts/test_benchmark_cc_switch.py1CODE
LOWscripts/benchmark_cc_switch.py11CODE
LOWscripts/check_benchmark_thresholds.py4CODE
LOWscripts/check_benchmark_thresholds.py9CODE
Slop Phrases2 hits · 3 pts
SeverityFileLineSnippetContext
LOW⚡src-tauri/src/resources/gpt5_5_template.json42 "base_instructions": "You are Codex, a coding agent based on GPT-5. You and the user share one workspace, and your jobCODE
LOW⚡src-tauri/src/resources/gpt5_5_template.json44 "instructions_template": "You are Codex, a coding agent based on GPT-5. You and the user share one workspace, and yoCODE
Modern Structural Boilerplate2 hits · 1 pts
SeverityFileLineSnippetContext
LOWscripts/benchmark_cc_switch.py843def update_settings(paths: Paths) -> None:STRING
LOWscripts/benchmark_cc_switch.py982def set_pty_size(fd: int, rows: int = 40, cols: int = 120) -> None:STRING