Repository Analysis

aaddrick/claude-desktop-debian

Claude Desktop for Linux

9.9 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of aaddrick/claude-desktop-debian, a TypeScript project with 5,268 GitHub stars. SynthScan v2.0 examined 71,833 lines of code across 276 source files, recording 436 pattern matches distributed across 14 syntactic categories. The overall adjusted score of 9.9 places this repository in the Low AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

9.9
Adjusted Score
9.9
Raw Score
100%
Time Factor
2026-07-14
Last Push
5.3K
Stars
TypeScript
Language
71.8K
Lines of Code
276
Files
436
Pattern Hits
2026-07-14
Scan Date
0.01
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 1HIGH 2MEDIUM 111LOW 322

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 436 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Decorative Section Separators101 hits · 318 pts
SeverityFileLineSnippetContext
MEDIUMbuild.sh3#===============================================================================COMMENT
MEDIUMbuild.sh7#===============================================================================COMMENT
MEDIUMbuild.sh73#===============================================================================COMMENT
MEDIUMbuild.sh75#===============================================================================COMMENT
MEDIUMbuild.sh254#===============================================================================COMMENT
MEDIUMbuild.sh256#===============================================================================COMMENT
MEDIUMtools/patch-necessity-audit.sh2#===============================================================================COMMENT
MEDIUMtools/patch-necessity-audit.sh22#===============================================================================COMMENT
MEDIUMtools/patch-necessity-audit.sh56#-------------------------------------------------------------------------------COMMENT
MEDIUMtools/patch-necessity-audit.sh58#-------------------------------------------------------------------------------COMMENT
MEDIUMtools/patch-necessity-audit.sh110#-------------------------------------------------------------------------------COMMENT
MEDIUMtools/patch-necessity-audit.sh112#-------------------------------------------------------------------------------COMMENT
MEDIUMtools/patch-necessity-audit.sh126#-------------------------------------------------------------------------------COMMENT
MEDIUMtools/patch-necessity-audit.sh128#-------------------------------------------------------------------------------COMMENT
MEDIUMtools/patch-necessity-audit.sh322#-------------------------------------------------------------------------------COMMENT
MEDIUMtools/patch-necessity-audit.sh324#-------------------------------------------------------------------------------COMMENT
MEDIUM.claude/scripts/triage/validate.sh30# ─── Path resolution ──────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/validate.sh44# ─── Closed-world extraction ──────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/validate.sh70# ─── Anchor grep ──────────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/validate.sh88# ─── Schema-ban scan ──────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/validate.sh113# ─── Per-finding validation ───────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/validate.sh214# ─── Per-anchor validation ────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/validate.sh272# ─── Related issues ───────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/validate.sh311# ─── Pattern sweep re-grep ────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/validate.sh350# ─── Assemble output ──────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/drift-bridge.sh33# ─── Resolve claimed_version → approximate date ──────────────────COMMENT
MEDIUM.claude/scripts/triage/drift-bridge.sh55# ─── Collect files named in findings ──────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/drift-bridge.sh63# ─── git log sweep ────────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/drift-bridge.sh85# ─── gh pr list sweep ─────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/drift-bridge.sh111# ─── Assemble ─────────────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/suspicious-input-scan.sh33# ─── Read fields ──────────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/suspicious-input-scan.sh41# ─── Scan ─────────────────────────────────────────────────────────COMMENT
MEDIUM.claude/scripts/triage/suspicious-input-scan.sh70# ─── Output ───────────────────────────────────────────────────────COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py50# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py54# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py127# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py129# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py133# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py135# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py139# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py141# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py145# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py147# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py151# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py153# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py191# =====================================================================COMMENT
MEDIUM…eported-environments/scripts/make_timeseries_charts.py195# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py62# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py64# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py77# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py79# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py91# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py93# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py109# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py113# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py144# =====================================================================COMMENT
MEDIUM…e-history/reported-environments/scripts/make_charts.py146# =====================================================================COMMENT
MEDIUMscripts/doctor.sh2#===============================================================================COMMENT
MEDIUMscripts/doctor.sh18#===============================================================================COMMENT
MEDIUMscripts/launcher-common.sh932#===============================================================================COMMENT
41 more matches not shown…
Over-Commented Block286 hits · 286 pts
SeverityFileLineSnippetContext
LOWbuild.sh41# desktopName field (it ignores --class, productName, and the ELFCOMMENT
LOWtools/chromium-switch-smoke.sh1#!/usr/bin/env bashCOMMENT
LOWtools/patch-necessity-audit.sh1#!/usr/bin/env bashCOMMENT
LOWtools/test-harness/eipc-registry-probe.ts1// Probe to verify whether the eipc channel registry (LocalSessions_$_*,COMMENT
LOWtools/test-harness/grounding-probe.ts1// Grounding probe — dumps Claude Desktop runtime state that backs theCOMMENT
LOWtools/test-harness/grounding-probe.ts21// T22 AX fingerprint (PR toolbar — open the surface before probing)COMMENT
LOWtools/test-harness/orchestrator/sweep.sh1#!/usr/bin/env bashCOMMENT
LOWtools/test-harness/src/lib/ax.ts1// AX-tree loading + traversal primitives — shared substrate for anyCOMMENT
LOWtools/test-harness/src/lib/ax.ts21//COMMENT
LOWtools/test-harness/src/lib/ax.ts41// click anchor scans. The predicate carries the discriminationCOMMENT
LOWtools/test-harness/src/lib/ax.ts81 // `computedRole` is `AxNode.role.value` — the platform-computed roleCOMMENT
LOWtools/test-harness/src/lib/ax.ts101 // of that role exist?COMMENT
LOWtools/test-harness/src/lib/ax.ts281 // polling for is exactly the AX tree updating.COMMENT
LOWtools/test-harness/src/lib/ax.ts321}COMMENT
LOWtools/test-harness/src/lib/ax.ts341 // keeps the first iteration from racing the in-flight render.COMMENT
LOWtools/test-harness/src/lib/ax.ts361// `inspector.clickByBackendNodeId` if a click follows. Keeping clickCOMMENT
LOWtools/test-harness/src/lib/ax.ts401COMMENT
LOWtools/test-harness/src/lib/electron-mocks.ts1// Mock-then-call helpers for side-effecting Electron module APIs.COMMENT
LOWtools/test-harness/src/lib/electron-mocks.ts21//COMMENT
LOWtools/test-harness/src/lib/electron-mocks.ts141 return await inspector.evalInMain<ShowItemInFolderCall[]>(COMMENT
LOWtools/test-harness/src/lib/row.ts1// Row-aware skip primitive.COMMENT
LOWtools/test-harness/src/lib/eipc.ts1// "eipc" channel-registry primitive — runtime discovery of the customCOMMENT
LOWtools/test-harness/src/lib/eipc.ts21// where every `e.ipc.handle("$eipc_message$_..._$_<scope>_$_<iface>_$_<method>", fn)`COMMENT
LOWtools/test-harness/src/lib/eipc.ts41// `waitForEipcChannel(s)`. Handler PRESENCE checks (T22b / T31b / T33bCOMMENT
LOWtools/test-harness/src/lib/eipc.ts61// `invokeEipcChannel` is read-by-default but doesn't enforce aCOMMENT
LOWtools/test-harness/src/lib/eipc.ts221 // margin for slow-cache cases.COMMENT
LOWtools/test-harness/src/lib/eipc.ts301 interval: opts.intervalMs ?? 250,COMMENT
LOWtools/test-harness/src/lib/eipc.ts321 // 1s on a warm app; the 30s budget is for cold-cache cases.COMMENT
LOWtools/test-harness/src/lib/eipc.ts341// works (the gate is structural, not `instanceof`-checked) but spoofsCOMMENT
LOWtools/test-harness/src/lib/electron.ts21 // launch, cleaned up on close().COMMENT
LOWtools/test-harness/src/lib/electron.ts81 // non-zero `code` and was NOT killed by us (`signal === null`),COMMENT
LOWtools/test-harness/src/lib/electron.ts101COMMENT
LOWtools/test-harness/src/lib/electron.ts121// invoked because we spawn Electron directly to keep CLAUDE_CDP_AUTHCOMMENT
LOWtools/test-harness/src/lib/input.ts1// Focus-shifter primitive for "Quick Entry shortcut fires from any focus"COMMENT
LOWtools/test-harness/src/lib/input.ts21// `search --name <regex> windowfocus` as one atomic call. Doing itCOMMENT
LOWtools/test-harness/src/lib/input.ts101}COMMENT
LOWtools/test-harness/src/lib/input.ts221COMMENT
LOWtools/test-harness/src/lib/input.ts241// missing on minimal Fedora installs.COMMENT
LOWtools/test-harness/src/lib/asar.ts1// Read files out of the installed app.asar without on-disk extraction.COMMENT
LOWtools/test-harness/src/lib/argv.ts1// Read a process's argv from /proc/<pid>/cmdline.COMMENT
LOWtools/test-harness/src/lib/inspector.ts1// Node-inspector client for Electron's main process.COMMENT
LOWtools/test-harness/src/lib/input-niri.ts1// Focus-shifter primitive for "Quick Entry shortcut fires from anyCOMMENT
LOWtools/test-harness/src/lib/input-niri.ts21// WIDs are hex strings. Callers handle one or the other based onCOMMENT
LOWtools/test-harness/src/lib/input-niri.ts41// --title <T> verbatim with no de-escaping surprises, and ships inCOMMENT
LOWtools/test-harness/src/lib/input-niri.ts121}COMMENT
LOWtools/test-harness/src/lib/input-niri.ts221}COMMENT
LOWtools/test-harness/src/lib/host-claude.ts1// Detect-and-kill any running Claude Desktop process owned by theCOMMENT
LOWtools/test-harness/src/lib/claudeai.ts1// claude.ai renderer-UI domain wrapper — single point of coupling toCOMMENT
LOWtools/test-harness/src/lib/claudeai.ts41// All three CDP-exposed menu-item variants. Caller code wants to treatCOMMENT
LOWtools/test-harness/src/lib/claudeai.ts61// through `lib/claudeai.ts`.COMMENT
LOWtools/test-harness/src/lib/claudeai.ts241// to match QuickEntry / MainWindow in quickentry.ts.COMMENT
LOWtools/test-harness/src/lib/claudeai.ts341 `CodeTab.selectLocal: no /^Local\\b/ item in the open menu. ` +COMMENT
LOWtools/test-harness/src/lib/quickentry.ts1// Quick Entry domain wrapper — single point of coupling to upstream'sCOMMENT
LOWtools/test-harness/src/lib/quickentry.ts61 '29:0', // LEFTCTRL upCOMMENT
LOWtools/test-harness/src/lib/quickentry.ts361 return null;COMMENT
LOWtools/test-harness/src/lib/quickentry.ts501// for upstream's lHn() (`!user.isLoggedOut`) returning true. TheCOMMENT
LOWtools/test-harness/src/lib/isolation.ts1// Per-test config isolation.COMMENT
LOWtools/test-harness/src/lib/isolation.ts41 // config never gets mutated by the test; secrets never leave theCOMMENT
LOW…/test-harness/src/runners/T02_doctor_exit_code.spec.ts21// Applies to all rows. No `skipUnlessRow()` — the doctor scriptCOMMENT
LOW…src/runners/T30_auto_archive_cadence_constants.spec.ts1import { test, expect } from '@playwright/test';COMMENT
226 more matches not shown…
Modern AI Meta-Vocabulary7 hits · 23 pts
SeverityFileLineSnippetContext
MEDIUM.claude/scripts/triage/validate.sh17# catches the canonical identifier-hallucination pattern in minifiedCOMMENT
MEDIUMdocs/issue-triage/README.md960### Structured output as a hallucination controlCOMMENT
MEDIUMdocs/issue-triage/README.md964### LLM hallucination rates and mitigation surveysCOMMENT
MEDIUMdocs/testing/quick-entry-closeout.md6- [§ Test list](#test-list) enumerates the QE-N items as conceptual checks and maps each to the concrete S-N / T-N case CODE
MEDIUM…-0009_patch-suite-history/dossiers/shared-machinery.md1# Dossier: Shared patch machinery and asar repack scaffoldingCOMMENT
MEDIUM…-0009_patch-suite-history/dossiers/shared-machinery.md96### Repack scaffolding — `scripts/staging/electron.sh` and `locales.sh`COMMENT
MEDIUMscripts/patches/app-asar.sh2# app.asar patch orchestration for the official Linux tree.COMMENT
Structural Annotation Overuse15 hits · 22 pts
SeverityFileLineSnippetContext
LOWAGENTS.md222### Step 1: Download the official .debCOMMENT
LOWAGENTS.md243### Step 2: Extract the .debCOMMENT
LOWAGENTS.md259### Step 3: Extract app.asarCOMMENT
LOWAGENTS.md265### Step 4: Beautify the JavaScript FilesCOMMENT
LOWAGENTS.md282### Step 5: Clean Up (Optional)COMMENT
LOWCLAUDE.md222### Step 1: Download the official .debCOMMENT
LOWCLAUDE.md243### Step 2: Extract the .debCOMMENT
LOWCLAUDE.md259### Step 3: Extract app.asarCOMMENT
LOWCLAUDE.md265### Step 4: Beautify the JavaScript FilesCOMMENT
LOWCLAUDE.md282### Step 5: Clean Up (Optional)COMMENT
LOW…harness/src/runners/S15_appimage_extract_works.spec.ts238 // Step 1: extraction. 30s budget — extracting ~200MB ofCOMMENT
LOW…harness/src/runners/S15_appimage_extract_works.spec.ts279 // Step 2: assert squashfs-root/AppRun exists.COMMENT
LOW…harness/src/runners/S15_appimage_extract_works.spec.ts298 // Step 3: spawn `AppRun --version` with a 5s timeout. AppRunCOMMENT
LOWscripts/cowork-fallback/cowork.sh381 // Step 1: Find the ENOENT check and expand it to include ECONNREFUSEDCOMMENT
LOWscripts/cowork-fallback/cowork.sh413 // Step 2: Inject auto-launch before the retry delayCOMMENT
Synthetic Comment Markers2 hits · 15 pts
SeverityFileLineSnippetContext
HIGHdocs/issue-triage/README.md966[^diffray-hallucinations]: [LLM Hallucinations in AI Code Review](https://diffray.ai/blog/llm-hallucinations-code-reviewCODE
HIGH.github/workflows/ci.yml311 # Only generate fallback if AI-generated notes don't existCOMMENT
Redundant / Tautological Comments7 hits · 10 pts
SeverityFileLineSnippetContext
LOW.claude/hooks/post-pr-simplify.sh43# Check if the PR was created successfully (look for PR URL in output)COMMENT
LOWscripts/doctor.sh1555 # Check if any MCP servers are configuredCOMMENT
LOWscripts/launcher-common.sh152# Check if we have a valid display (not running from TTY)COMMENT
LOWscripts/setup/dependencies.sh66 # Check if we can sudo without a password firstCOMMENT
LOW.github/workflows/check-claude-version.yml173 # Check if we have a PATCOMMENT
LOW.github/workflows/check-claude-version.yml183 # Check if there are changes to commitCOMMENT
LOW.github/workflows/test-flags.yml31 echo "$OUTPUT" # Print output for logsCODE
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICALdocs/learnings/wayland-global-shortcuts-portal.md40**Root cause (pinned to source on both sides):** xdg-desktop-portal grew a host-app identity step — non-sandboxed apps mCODE
Verbosity Indicators5 hits · 8 pts
SeverityFileLineSnippetContext
LOW…harness/src/runners/S15_appimage_extract_works.spec.ts238 // Step 1: extraction. 30s budget — extracting ~200MB ofCOMMENT
LOW…harness/src/runners/S15_appimage_extract_works.spec.ts279 // Step 2: assert squashfs-root/AppRun exists.COMMENT
LOW…harness/src/runners/S15_appimage_extract_works.spec.ts298 // Step 3: spawn `AppRun --version` with a 5s timeout. AppRunCOMMENT
LOWscripts/cowork-fallback/cowork.sh381 // Step 1: Find the ENOENT check and expand it to include ECONNREFUSEDCOMMENT
LOWscripts/cowork-fallback/cowork.sh413 // Step 2: Inject auto-launch before the retry delayCOMMENT
Example Usage Blocks4 hits · 6 pts
SeverityFileLineSnippetContext
LOWtools/chromium-switch-smoke.sh16# Usage:COMMENT
LOWtools/patch-necessity-audit.sh10# Usage:COMMENT
LOWtools/test-harness/orchestrator/sweep.sh4# Usage:COMMENT
LOWtests/test-artifact-common.sh244# Usage:COMMENT
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMtools/test-harness/orchestrator/sweep.sh34# "Environment variables" table in tools/test-harness/README.md.COMMENT
MEDIUMtools/test-harness/orchestrator/sweep.sh76# on PATH so the harness stays usable on minimal images.COMMENT
Hyper-Verbose Identifiers3 hits · 3 pts
SeverityFileLineSnippetContext
LOWtools/test-harness/src/lib/electron-mocks.ts111export async function installShowItemInFolderMock(CODE
LOW…ness/src/runners/T23_notification_reaches_dbus.spec.ts75async function notificationDaemonRegistered(): Promise<boolean> {CODE
LOWscripts/cowork-fallback/cowork-vm-service.js439function translateEmbeddedGuestPaths(csv, mountMap) {CODE
Self-Referential Comments1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMscripts/launcher-common.sh3# This file is sourced by both launchers to avoid code duplicationCOMMENT
Excessive Try-Catch Wrapping1 hit · 1 pts
SeverityFileLineSnippetContext
LOWscripts/doctor.sh271except Exception:CODE
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOWscripts/cowork-fallback/cowork-vm-service.js2694async function handleRequest(request, socket) {CODE