AI Slop Code Risk Monitor

charmbracelet/crush

SlopCodeMonitor badge for charmbracelet/crush Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Glamourous agentic coding for all 💘

2.3 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for charmbracelet/crush, a Go project with 28,894 GitHub stars. SynthScan examined 208,171 lines of code across 924 source files, recording 325 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 2.3 (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.

2.3
Adjusted Signal
2.3
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
28.9K
Stars
Go
Language
208.2K
Lines of Code
924
Files
325
Pattern Hits
2026-10-31
Scan Date
0.01
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 7.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 3.4/100 · LOW

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

Agent Over-Engineering Ratio 0.0/100 · LOW

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

PR Review Velocity Impact 10.7/100 · LOW

Which changes need focused human review? 325 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 12HIGH 0MEDIUM 18LOW 295

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 325 distinct pattern matches across 5 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 Block272 hits · 272 pts
SeverityFileLineSnippetContext
LOW.golangci.yml1version: "2"COMMENT
LOWinternal/ui/anim/anim.go21 fps = 20COMMENT
LOWinternal/ui/chat/applyhighlight_callback_test.go61COMMENT
LOWinternal/ui/chat/assistant_thinking_window_test.go21// threshold deterministically. Each paragraph is tagged with itsCOMMENT
LOWinternal/ui/chat/assistant_thinking_window_test.go101 // width and is not safe for concurrent Render calls).COMMENT
LOWinternal/ui/chat/assistant_thinking_window_test.go301// thinking block sits in tail-window mode must NOT invalidate theCOMMENT
LOWinternal/ui/chat/assistant.go21// truncated in the collapsed state.COMMENT
LOWinternal/ui/chat/assistant.go41 refusalTitle = "Model refused to continue"COMMENT
LOWinternal/ui/chat/assistant.go181 message *message.MessageCOMMENT
LOWinternal/ui/chat/assistant.go201 thinkingHashLen intCOMMENT
LOWinternal/ui/chat/assistant.go301 return highlightedContent + spinnerCOMMENT
LOWinternal/ui/chat/assistant.go681}COMMENT
LOWinternal/ui/chat/assistant.go801 isFinished := a.message.IsFinished()COMMENT
LOWinternal/ui/chat/assistant.go821 // cache valid while a changed section forces a miss naturally.COMMENT
LOWinternal/ui/chat/assistant.go881 a.thinkingViewMode = thinkingFullExpandedCOMMENT
LOWinternal/ui/chat/assistant.go901// underlying length), and re-running glamour just to count linesCOMMENT
LOWinternal/ui/chat/messages.go201//COMMENT
LOWinternal/ui/chat/user_render_test.go41// TestUserMessagePreservesSingleLineBreaks is the regression test forCOMMENT
LOWinternal/ui/chat/agent.go101}COMMENT
LOWinternal/ui/chat/incremental_glamour_test.go61 }COMMENT
LOWinternal/ui/chat/incremental_glamour_test.go261 want: len("Para.\n\n"),COMMENT
LOWinternal/ui/chat/incremental_glamour_test.go561 fresh := freshRender(t, doc, width)COMMENT
LOWinternal/ui/chat/incremental_glamour_test.go641COMMENT
LOWinternal/ui/chat/incremental_glamour_test.go661// -----------------------------------------------------------------------COMMENT
LOWinternal/ui/chat/streaming_markdown.go1package chatCOMMENT
LOWinternal/ui/chat/streaming_markdown.go21// between calls. The boundary check is therefore deliberatelyCOMMENT
LOWinternal/ui/chat/streaming_markdown.go41 // without re-scanning the entire prefix from the start.COMMENT
LOWinternal/ui/chat/streaming_markdown.go181// already paid the cost of a full render of `content`; if there isCOMMENT
LOWinternal/ui/chat/streaming_markdown.go241 // No new boundary found after the stable prefix. Return theCOMMENT
LOWinternal/ui/chat/streaming_markdown.go261// pass.COMMENT
LOWinternal/ui/chat/streaming_markdown.go441// returned offset always points immediately after a blank-lineCOMMENT
LOWinternal/ui/chat/streaming_markdown.go461// reasoning behind these "anywhere in prefix" rejects.COMMENT
LOWinternal/ui/chat/streaming_markdown.go481 // Iterate every blank-line position from latest to earliest.COMMENT
LOWinternal/ui/chat/streaming_markdown.go581 }COMMENT
LOWinternal/ui/chat/streaming_markdown.go601// forces -1. This is overly conservative — it forfeitsCOMMENT
LOWinternal/ui/chat/streaming_markdown.go621// "[label]: <url>" defines a link reference that the suffixCOMMENT
LOWinternal/ui/chat/streaming_markdown.go641// B1 (loose lists, refined). A loose list has a blank line betweenCOMMENT
LOWinternal/ui/chat/streaming_markdown.go661// that ever contained a list — the dominant case for LLMCOMMENT
LOWinternal/ui/chat/streaming_markdown.go721 // appeared earlier AND the last non-blank line is indented butCOMMENT
LOWinternal/ui/chat/streaming_markdown.go981 return trueCOMMENT
LOWinternal/ui/notification/notification.go1// Package notification provides desktop notification support for the UI.COMMENT
LOWinternal/ui/notification/native_stub.go1//go:build solaris || illumosCOMMENT
LOWinternal/ui/dialog/inline_editor.go81// MouseClickableEditor is an optional interface for inline editorsCOMMENT
LOWinternal/ui/dialog/inline_editor.go101 // HandleMouseDown begins a selection when the press lands in selectableCOMMENT
LOWinternal/ui/dialog/mcp_toggles.go21 // Disabled is the repository-scoped override: when true the server'sCOMMENT
LOWinternal/ui/dialog/common.go41// so callers don't have to repeat the arithmetic. The scrollbar column isCOMMENT
LOWinternal/ui/dialog/common.go281 // and paddings.COMMENT
LOWinternal/ui/styles/host_theme.go181 }COMMENT
LOWinternal/ui/common/markdown.go21const formatterName = "crush"COMMENT
LOWinternal/ui/common/markdown.go141)COMMENT
LOWinternal/ui/common/markdown.go161 glamour.WithStyles(codeBlockConfig(sty.Markdown)),COMMENT
LOWinternal/ui/common/markdown.go241// AND every per-renderer mutex in a single atomic criticalCOMMENT
LOWinternal/ui/common/markdown.go261 planMDCache = map[int]*glamour.TermRenderer{}COMMENT
LOWinternal/ui/common/markdown.go281// stable for the lifetime of the renderer (i.e. untilCOMMENT
LOWinternal/ui/common/common.go261func CopyToClipboard(text, successMessage string) tea.Cmd {COMMENT
LOWinternal/ui/common/capabilities.go21 // Columns is the number of character columns in the terminal.COMMENT
LOWinternal/ui/list/list.go41 totalHeightValid boolCOMMENT
LOWinternal/ui/list/list.go301}COMMENT
LOWinternal/ui/list/item.go1package listCOMMENT
LOWinternal/ui/list/item.go21type Item interface {COMMENT
212 more matches not shown…
Hallucination Indicators12 hits · 120 pts
SeverityFileLineSnippetContext
CRITICALinternal/ui/dialog/theme_editor.go305 line = ed.com.Styles.Dialog.NormalItem.Width(width).Render(label + ed.input.View())CODE
CRITICALinternal/ui/dialog/theme_editor.go309 line = ed.com.Styles.Dialog.NormalItem.Width(width).Render(label)CODE
CRITICALinternal/ui/dialog/plan_handoff_inline.go235 question := iconPrompt + p.com.Styles.Editor.QuestionUnselected.Render(CODE
CRITICALinternal/ui/dialog/plan_handoff_inline.go315 questionText := p.com.Styles.Editor.QuestionUnselected.Render(CODE
CRITICALinternal/ui/dialog/plan_handoff_inline.go321 promptPrefix := p.com.Styles.Editor.QuestionBody.Render("> ")CODE
CRITICALinternal/ui/dialog/plan_handoff_inline.go363 promptPrefix := p.com.Styles.Editor.QuestionBody.Render("> ")CODE
CRITICALinternal/ui/dialog/quit_mouse_test.go180 q.com.Styles.Dialog.Quit.Hint.Render(quitHintLineOne),CODE
CRITICALinternal/ui/dialog/quit_mouse_test.go181 q.com.Styles.Dialog.Quit.Hint.Render(quitHintLineTwo),CODE
CRITICALinternal/ui/dialog/models_item.go49 configuredText := m.t.Dialog.Models.ConfiguredText.Render("Configured")CODE
CRITICALinternal/ui/dialog/commands.go308 innerWidth := width - c.com.Styles.Dialog.View.GetHorizontalFrameSize()CODE
CRITICALinternal/ui/model/status_test.go48 wantHintsCol := badgeLeftInset + lipgloss.Width(badge) + 1 + u.com.Styles.Status.Help.GetPaddingLeft()CODE
CRITICALinternal/ui/model/status_test.go70 wantCol := u.com.Styles.Status.Help.GetPaddingLeft()CODE
Modern AI Meta-Vocabulary15 hits · 45 pts
SeverityFileLineSnippetContext
MEDIUMinternal/ui/chat/tools.go1741// formatAgenticFetchResultForCopy formats agentic fetch tool results for clipboard.COMMENT
MEDIUMinternal/ui/chat/agent.go212// AgenticFetchToolMessageItem is a message item that represents an agentic fetch tool call.COMMENT
MEDIUMinternal/ui/chat/agent.go233 // For the agentic fetch tool we keep spinning until the tool call is finished.COMMENT
MEDIUMinternal/ui/chat/agent.go290// AgenticFetchToolRenderContext renders agentic fetch tool messages.COMMENT
MEDIUMinternal/ui/chat/version_bump_test.go301// the agentic-fetch counterpart to the agent-tool nested mutatorCOMMENT
MEDIUMinternal/ui/chat/version_bump_test.go369// is the agentic-fetch counterpart of the T5 regression test.COMMENT
MEDIUMinternal/ui/chat/version_bump_test.go479// agentic-fetch counterpart of the agent-tool Advance bump test.COMMENT
MEDIUMinternal/ui/dialog/question_single.go18// rendering scaffold.COMMENT
MEDIUMinternal/ui/dialog/question_multi.go18// rendering scaffold.COMMENT
MEDIUMinternal/server/events.go270// (agent tool, agentic fetch) resolve to the top-level session so theCOMMENT
MEDIUMinternal/backend/events.go47// agentic fetch) carry derived IDs; their interactive prompts areCOMMENT
MEDIUMinternal/agent/tools/fetch_types.go3// AgenticFetchToolName is the name of the agentic fetch tool.COMMENT
MEDIUMinternal/agent/tools/fetch_types.go15// AgenticFetchParams defines the parameters for the agentic fetch tool.COMMENT
MEDIUMinternal/agent/tools/fetch_types.go21// AgenticFetchPermissionsParams defines the permission parameters for the agentic fetch tool.COMMENT
MEDIUMinternal/agent/agenttest/coordinator.go61 // Keep buildTools light: no sub-agent or agentic-fetch construction.COMMENT
Fake / Example Data23 hits · 24 pts
SeverityFileLineSnippetContext
LOWinternal/ui/chat/assistant_plan_test.go85 paragraph := strings.TrimSpace(strings.Repeat("lorem ipsum dolor sit amet ", 30))CODE
LOWinternal/ui/chat/assistant_plan_test.go85 paragraph := strings.TrimSpace(strings.Repeat("lorem ipsum dolor sit amet ", 30))CODE
LOWinternal/gitutil/branch_test.go37 runGit(t, testDir, "config", "user.email", "test@test.com")CODE
LOWinternal/gitutil/branch_test.go61 runGit(t, testDir, "config", "user.email", "test@test.com")CODE
LOWinternal/gitutil/branch_test.go77 runGit(t, testDir, "config", "user.email", "test@test.com")CODE
LOWinternal/gitutil/branch_test.go107 runGit(t, testDir, "config", "user.email", "test@test.com")CODE
LOWinternal/gitutil/branch_test.go126 runGit(t, testDir, "config", "user.email", "test@test.com")CODE
LOWinternal/agent/agent_test.go267 Prompt: "fetch the content from https://example-files.online-convert.com/website/html/example.html and telCODE
LOW⚡…testdata/TestCoderAgent/deepseek-v4/download_tool.yaml118 The names "John Doe" for males, "Jane Doe" or "Jane Roe" for females, or "Jonnie Doe" and "Janie Doe" for childrenCODE
LOW⚡…testdata/TestCoderAgent/deepseek-v4/download_tool.yaml118 The names "John Doe" for males, "Jane Doe" or "Jane Roe" for females, or "Jonnie Doe" and "Janie Doe" for childrenCODE
LOW⚡…testdata/TestCoderAgent/deepseek-v4/download_tool.yaml122 Similarly, a child or baby whose identity is unknown may be referred to as Baby Doe. A notorious murder case in KaCODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml11 body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\n\\n<critical_rulCODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml141 The names "<b>John Doe</b>" for males, "<b>Jane Doe</b>" or "<b>Jane Roe</b>" for females, or "<b>Jonnie Doe</b>" CODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml145 <p>Similarly, a child or baby whose identity is unknown may be referred to as <b>Baby Doe</b>. A notorious murder CODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml174 body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversatCODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml217 data: {"id":"chatcmpl-1e002bd9edb812a509239e0a","object":"chat.completion.chunk","created":1793374738,"model":"deeCODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml286 body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\n\\n<critical_rulCODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml355 data: {"id":"chatcmpl-2ad876bd452b01ec15e58685","object":"chat.completion.chunk","created":1793374741,"model":"deeCODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml486 The names "<b>John Doe</b>" for males, "<b>Jane Doe</b>" or "<b>Jane Roe</b>" for females, or "<b>Jonnie Doe</b>" CODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml490 <p>Similarly, a child or baby whose identity is unknown may be referred to as <b>Baby Doe</b>. A notorious murder CODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml519 body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\n\\n<critical_rulCODE
LOW…nt/testdata/TestCoderAgent/deepseek-v4/fetch_tool.yaml546 data: {"id":"chatcmpl-e1b0eb11bc56d35818b46ff0","object":"chat.completion.chunk","created":1793374745,"model":"deeCODE
LOWinternal/agent/prompt/git_test.go34 runGit(t, dir, "config", "user.email", "test@test.com")CODE
AI Slop Vocabulary3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMinternal/ui/chat/assistant_thinking_window_test.go107 // any future style-driven padding so the test is robust toCOMMENT
MEDIUMinternal/shell/dispatch_test.go309// if bash isn't available (rare in CI, but keep the test robust).COMMENT
MEDIUMinternal/shell/dispatch.go85// on the raw string to stay robust if a future change ever bypasses thatCOMMENT