AI Slop Code Risk Monitor

CherryHQ/cherry-studio-app

SlopCodeMonitor badge for CherryHQ/cherry-studio-app Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

🍒 This is the mobile version of Cherry Studio.

1.4 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for CherryHQ/cherry-studio-app, a TypeScript project with 4,049 GitHub stars. SynthScan examined 530,696 lines of code across 3836 source files, recording 642 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.4 (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.

1.4
Adjusted Signal
1.4
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
4.0K
Stars
TypeScript
Language
530.7K
Lines of Code
3.8K
Files
642
Pattern Hits
2026-10-31
Scan Date
0.00
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 6.0/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.2/100 · LOW

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

Agent Over-Engineering Ratio 5.9/100 · LOW

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

PR Review Velocity Impact 6.4/100 · LOW

Which changes need focused human review? 642 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 2HIGH 0MEDIUM 19LOW 621

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 642 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 Identifiers582 hits · 594 pts
SeverityFileLineSnippetContext
LOW…ve-best-practices/references/native-memory-patterns.md145class DataManager {CODE
LOW…ive-best-practices/references/bundle-code-splitting.md126function getFirstPartyChunkBaseURL(scriptId, release) {CODE
LOWscripts/skillsCommon.ts57export function buildAgentsSkillsGitignore(skillNames: string[]): string {CODE
LOWscripts/skillsCommon.ts75export function buildClaudeSkillsGitignore(skillNames: string[]): string {CODE
LOWscripts/skillsCheck.ts67function checkTrackedFilesAgainstWhitelist(skillNames: string[], errors: string[]) {CODE
LOWscripts/generateBackgroundActivityLogos.ts11async function generateBackgroundActivityLogos() {CODE
LOWscripts/generateHeaderToolbarIcons.ts36async function generateHeaderToolbarIcons() {CODE
LOWpackages/ui/src/utils/typography-scale.ts60export function createTypographyCSSVariables(value: unknown): Record<string, number> {CODE
LOW…/components/markdown-text/components/markdown-text.tsx75function createMarkdownTypographyStyle(CODE
LOW…ckages/ui/src/components/portal/overlay-navigation.tsx17export function OverlayNavigationProvider({ children }: PropsWithChildren) {CODE
LOW…ages/ui/src/components/portal/portal-accessibility.tsx14export function PortalAccessibilityBoundary({ children }: PropsWithChildren) {CODE
LOW…ages/ui/src/components/portal/portal-accessibility.tsx39export function usePortalBackgroundIsolation(active: boolean) {CODE
LOW…c/components/loading/image-generation-loader-effect.ts70export function getImageGenerationLoaderEffect(): SkRuntimeEffect {CODE
LOW…nts/scroll-interaction/scroll-interaction-boundary.tsx11export function ScrollInteractionBoundary({CODE
LOW…/src/components/composer/utils/composer-dock-layout.ts17export function getComposerActionCenterOffset(bottomInset: number) {CODE
LOW…/src/components/composer/utils/composer-dock-layout.ts27export function getComposerKeyboardStickyOffset(bottomInset: number) {CODE
LOW…src/components/composer/components/composer-editor.tsx257export function ComposerEditorAccessories({CODE
LOW…/components/composer/components/composer-expansion.tsx166export function ComposerExpansionBackground() {CODE
LOW…components/file-preview/utils/file-preview-registry.ts16export function createFilePreviewRegistry(CODE
LOW…components/file-preview/utils/file-preview-registry.ts31export function extendFilePreviewRegistry(CODE
LOW…look-thumbnail-cache/quick-look-thumbnail-cache.ios.ts17export function quickLookThumbnailCacheKey(input: QuickLookThumbnailInput): string {CODE
LOW…le-preview/components/file-preview-plugin-provider.tsx17export function FilePreviewPluginProvider({CODE
LOW…/components/menu/context-menu/context-menu.android.tsx125function withMenuAccessibilityActions(CODE
LOW…rc/components/message-part/utils/message-part-value.ts24export function getMessagePartValueEntries(value: unknown): [string, unknown][] {CODE
LOW…onents/message-part/components/message-part-status.tsx18export function MessagePartStatusDensityScope({CODE
LOW…onents/message-part/components/message-part-status.tsx69export function MessagePartStatusTextFloor() {CODE
LOW…ts/message-part/components/message-part-disclosure.tsx193function MessagePartDisclosureIcon({ isOpen }: { isOpen: boolean }) {CODE
LOW…onents/image-preview-toolbar/image-preview-toolbar.tsx13function ImagePreviewToolbarAction({CODE
LOWpackages/ui/src/icons/registry.ts25export function resolveModelToProviderIcon(modelId: string): IconSource | undefined {CODE
LOW…rc/background-activity/background-activity.preview.tsx47export function BackgroundActivityPreview(props: BackgroundActivityPreviewProps) {CODE
LOW⚡packages/universal/src/utils/conversationTitle.ts5export function sanitizeConversationTitle(title: string): string {CODE
LOW⚡packages/universal/src/utils/conversationTitle.ts9export function truncateFirstUserMessageTitleSource(text: string): string {CODE
LOW⚡packages/universal/src/utils/conversationTitle.ts17export function buildFirstUserMessageTitle(userText: string): string {CODE
LOW⚡packages/universal/src/utils/conversationTitle.ts21export function normalizeConversationTitle(title: string | null | undefined): string {CODE
LOWpackages/universal/src/utils/url.ts103export function withoutTrailingApiVersion(baseURL = ''): string {CODE
LOWpackages/universal/src/utils/url.ts167export function shouldAppendProviderApiVersion(provider?: {CODE
LOWpackages/universal/src/ai/reasoning.ts65export function resolveReasoningEffortForModel(CODE
LOWpackages/universal/src/ai/paintingGenerateError.ts51export function createPaintingGenerateError(CODE
LOWpackages/universal/src/ai/paintingGenerateError.ts58export function normalizePaintingGenerateError(error: unknown): Error {CODE
LOWpackages/universal/src/ai/tools/mcpToolName.ts74export function generateMcpToolFunctionName(CODE
LOWpackages/universal/src/ai/tools/mcpToolName.ts114export function buildFunctionCallToolName(serverName: string, toolName: string): string {CODE
LOWpackages/universal/src/ai/tools/mcpToolName.ts132export function parseFunctionCallToolName(toolName: string): McpFunctionCallToolNameParts | null {CODE
LOWpackages/universal/src/ai/tools/mcpToolName.ts146export function isFunctionCallToolNameForServer(serverName: string, toolId: string): boolean {CODE
LOWpackages/universal/src/data/types/aiUsageRecord.ts147export function getAiUsageRecordTotalTokens(record: AiUsageRecordTokenFields): number | null {CODE
LOWpackages/design-tokens/scripts/sync-desktop.ts208function assertRadeonCloudVisualContract(source: string, sourcePath: string): void {CODE
LOWpackages/design-tokens/scripts/sync-desktop.ts261async function buildCatalogOnlyProviderSource(CODE
LOWpackages/ai-runtime/scripts/check-boundaries.ts44function referencedForbiddenGlobals(source: string, file: string): string[] {CODE
LOWpackages/ai-runtime/scripts/check-boundaries.ts70export async function collectBoundaryViolations(CODE
LOWpackages/ai-runtime/src/provider/zhipuWebSearch.ts10export function transformZhipuRequestBody(args: Record<string, any>): Record<string, any> {CODE
LOWpackages/ai-runtime/src/provider/listModels.ts208function getOpenAIVoiceModelMetadata(modelId: string): Partial<Model> | undefined {CODE
LOWpackages/ai-runtime/src/provider/factory.ts9export function registerProviderExtensions(): void {CODE
LOWpackages/ai-runtime/src/provider/vertex.ts15export function normalizeVertexCredentials(credentials: Record<string, unknown> | undefined): {CODE
LOWpackages/ai-runtime/src/provider/diagnostics.ts16export function emitProviderRuntimeDiagnostic(CODE
LOWpackages/ai-runtime/src/provider/ark.ts9export function stripArkUnsupportedIncludes(CODE
LOWpackages/ai-runtime/src/provider/listModels/vertex.ts50export async function createVertexModelListRequest(CODE
LOWpackages/ai-runtime/src/provider/listModels/vertex.ts159export function isSupportedVertexPublisherModel(modelId: string): boolean {CODE
LOW…ai-runtime/src/provider/custom/imageGenerationModel.ts97export function createImageGenerationModel(CODE
LOW…-runtime/src/provider/custom/imageTransportRegistry.ts89export function isImageTransportDescriptorSupported(CODE
LOW…-runtime/src/provider/custom/wire/buildImageRequest.ts117export function buildVendorProviderOptions(CODE
LOW…ai-runtime/src/provider/custom/dmxapi/dmxapiRouting.ts59export function resolveDmxapiEndpointType(modelId: string): EndpointType {CODE
522 more matches not shown…
Decorative Section Separators15 hits · 50 pts
SeverityFileLineSnippetContext
MEDIUMpackages/universal/src/ai/builtinTools.ts12// ── web_search ───────────────────────────────────────────────────COMMENT
MEDIUMpackages/universal/src/ai/builtinTools.ts77// ── report_artifacts ─────────────────────────────────────────────COMMENT
MEDIUM⚡packages/universal/src/ai/builtinTools.ts114// ── generate_image ───────────────────────────────────────────────COMMENT
MEDIUM⚡packages/universal/src/ai/builtinTools.ts123// ── agent autonomy tools (cron / notify / config) ────────────────COMMENT
MEDIUM⚡packages/universal/src/ai/builtinTools.ts132// ── read_file ────────────────────────────────────────────────────COMMENT
MEDIUMpackages/universal/src/data/types/model.ts214// ═══════════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMpackages/universal/src/data/types/model.ts216// ═══════════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM…-runtime/src/provider/custom/dmxapi/dmxapiTransport.ts239// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…-runtime/src/provider/custom/dmxapi/dmxapiTransport.ts241// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…ime/src/provider/custom/aihubmix/aihubmixImageModel.ts231// ── Doubao Seedream (OpenAI-compat custom family) ─────────────────────────────COMMENT
MEDIUMsrc/backend/ai/AiService.ts42// ── Request types ──────────────────────────────────────────────────COMMENT
MEDIUMsrc/backend/data/db/schemas/userModel.ts47// ═══════════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/backend/data/db/schemas/userModel.ts49// ═══════════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/backend/data/db/schemas/userModel.ts147// ═══════════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMsrc/backend/data/db/schemas/userModel.ts149// ═══════════════════════════════════════════════════════════════════════════════COMMENT
Structural Annotation Overuse15 hits · 26 pts
SeverityFileLineSnippetContext
LOW.agents/skills/react-native-best-practices/POWER.md11## Step 1: Validate React Native SetupCOMMENT
LOW…ive-best-practices/references/bundle-barrel-exports.md191### Step 1: Identify Barrel FilesCOMMENT
LOW…ive-best-practices/references/bundle-barrel-exports.md200### Step 2: Update ImportsCOMMENT
LOW…-native-best-practices/references/js-react-compiler.md43### Step 1: Check CompatibilityCOMMENT
LOW…-native-best-practices/references/js-react-compiler.md53### Step 2: Install React CompilerCOMMENT
LOW…-native-best-practices/references/js-react-compiler.md93### Step 3: Configure Babel (React Native without Expo)COMMENT
LOW…-native-best-practices/references/js-react-compiler.md115### Step 4: Set Up ESLint (Recommended)COMMENT
LOW…-native-best-practices/references/js-react-compiler.md119### Step 5: Verify OptimizationsCOMMENT
LOW⚡…tive-best-practices/references/bundle-native-assets.md76### Step 1: Create Asset CatalogCOMMENT
LOW⚡…tive-best-practices/references/bundle-native-assets.md86### Step 2: Configure Build PhaseCOMMENT
LOW⚡…tive-best-practices/references/bundle-native-assets.md96### Step 3: BuildCOMMENT
LOW…tive-best-practices/references/bundle-native-assets.md116### Step 4: VerifyCOMMENT
LOW⚡src/backend/services/jobs/runtime/recovery.ts63 // Step 1: a persisted cancel intent overrides every strategy.COMMENT
LOW⚡src/backend/services/jobs/runtime/recovery.ts72 // Step 2: per-handler strategy.COMMENT
LOWsrc/backend/services/jobs/runtime/recovery.ts104 // Step 3: orphan sweep — types with no registered handler (e.g. removed inCOMMENT
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICAL…ckend/ai/agent/host/__tests__/DurableAgentHost.test.ts2014 const interaction = state.reply.setInteraction.mock.calls.at(-1)?.[0];CODE
CRITICAL…ckend/ai/agent/host/__tests__/DurableAgentHost.test.ts2129 const interaction = state.reply.setInteraction.mock.calls.at(-1)?.[0];CODE
Over-Commented Block16 hits · 16 pts
SeverityFileLineSnippetContext
LOWjest.config.js41 // Local build/export artifacts can contain copied workspace packages. KeepCOMMENT
LOW.agents/skills/diagnose/scripts/hitl-loop.template.sh1#!/usr/bin/env bashCOMMENT
LOW.agents/skills/expo-tailwind-setup/SKILL.md101 --font-rounded: ui-rounded;COMMENT
LOW…es/ui/src/components/composer/utils/composer-layout.ts21// circle already sits 4pt in from the edge, and matching that on a label reads asCOMMENT
LOW…r/utils/composer-text-style/composer-text-style.ios.ts1import type { TextStyle } from 'react-native';COMMENT
LOW…r/utils/composer-text-style/composer-text-style.ios.ts21// nothing here (verified by measurement, not by reading the docs).COMMENT
LOWpackages/universal/src/ai/builtinTools.ts41COMMENT
LOW…ime/src/provider/__tests__/openaiImageUrlPatch.test.ts1import { OpenAIImageModel } from '@ai-sdk/openai/internal';COMMENT
LOW…-runtime/src/provider/custom/wire/buildImageRequest.ts121 vendorBag: Record<string, unknown> = {},COMMENT
LOWmodules/js-sandbox/cpp/JsSandbox.cpp1#include "JsSandbox.h"COMMENT
LOWmodules/js-sandbox/cpp/QuickJs.c1// Compiles the vendored QuickJS-NG amalgamation (vendor/quickjs-ng) as oneCOMMENT
LOWmodules/js-sandbox/cpp/QuickJs.c41}COMMENT
LOWmodules/js-sandbox/cpp/JsSandbox.h1#pragma onceCOMMENT
LOWsrc/frontend/utils/constants.ts1import {COMMENT
LOWsrc/frontend/utils/constants.ts21// Duration is the only knob: the curve is compiled into the library, which isCOMMENT
LOWsrc/backend/data/db/schemas/agentSessionMessage.ts61 // Message role: user, assistant, system — no virtual root rowCOMMENT
Verbosity Indicators3 hits · 6 pts
SeverityFileLineSnippetContext
LOW⚡src/backend/services/jobs/runtime/recovery.ts63 // Step 1: a persisted cancel intent overrides every strategy.COMMENT
LOW⚡src/backend/services/jobs/runtime/recovery.ts72 // Step 2: per-handler strategy.COMMENT
LOWsrc/backend/services/jobs/runtime/recovery.ts104 // Step 3: orphan sweep — types with no registered handler (e.g. removed inCOMMENT
Self-Referential Comments3 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMsrc/backend/services/builtInMcp/plugins/feishu/guide.ts52 content: `## Create a Base recordCODE
MEDIUMsrc/backend/services/builtInMcp/plugins/github/guide.ts107 content: `## Create a remote branchCODE
MEDIUMsrc/backend/services/builtInMcp/plugins/github/guide.ts114 content: `## Create a pull requestCODE
Fake / Example Data4 hits · 4 pts
SeverityFileLineSnippetContext
LOW…nts/skills/expo-deployment/references/ios-app-store.md167| Placeholder content | Remove "lorem ipsum" and test data |CODE
LOW…/expo/modules/systemintegration/BackgroundExecution.kt107 val input = RemoteInput.Builder("reply").setLabel(reply["placeholder"] as? String)CODE
LOW…d/appShell/observability/__tests__/sentryEvent.test.ts84 tags: { operation: 'request https://private.example.com', module: 'user@example.com' },CODE
LOW…ntend/components/Composer/components/ComposerField.tsx27 'layout' | 'onBlur' | 'onFocus' | 'onLayout' | 'placeholder' | 'style' | 'testID'CODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUM…/frontend/appShell/sidebar/components/SidebarTitle.tsx63 // The second copy sits exactly one lap behind, so snapping back to 0 is seamless.COMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOW.agents/skills/diagnose/scripts/hitl-loop.template.sh6# Usage:COMMENT