Repository Analysis

NanmiCoder/cc-haha

Local-first cross-platform desktop workspace for Claude Code / agents: multi-agent, Git worktrees, code diffs, skill marketplace, multi-model, Computer Use, task-aware desktop pets, with WeChat, Feishu, DingTalk, Telegram, WhatsApp and H5 access.

4.8 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of NanmiCoder/cc-haha, a TypeScript project with 14,244 GitHub stars. SynthScan v2.0 examined 1,076,190 lines of code across 3813 source files, recording 4122 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 4.8 places this repository in the Likely human-written 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).

4.8
Adjusted Score
4.8
Raw Score
100%
Time Factor
2026-08-23
Last Push
14.2K
Stars
TypeScript
Language
1.1M
Lines of Code
3.8K
Files
4.1K
Pattern Hits
2026-08-29
Scan Date
0.00
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 6HIGH 4MEDIUM 523LOW 3589

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 4122 distinct pattern matches across 17 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.

Hyper-Verbose Identifiers2963 hits · 2907 pts
SeverityFileLineSnippetContext
LOWruntime/mac_helper.py193def send_keystroke_via_osascript(character: str, modifiers: list[str] | None = None) -> None:CODE
LOWruntime/mac_helper.py264def ensure_screen_recording_permission() -> None:CODE
LOWruntime/mac_helper.py507def detect_screen_recording_permission() -> bool | None:CODE
LOWruntime/mac_helper.py555def detect_accessibility_permission() -> bool:CODE
LOWruntime/test_helpers.py77 def test_common_keys_present_in_both(self):CODE
LOWruntime/test_helpers.py138 def test_both_helpers_same_commands(self):CODE
LOWruntime/test_helpers.py147 def test_expected_commands_exist(self):CODE
LOWruntime/test_helpers.py167 def test_unknown_command_returns_error(self):CODE
LOWruntime/test_helpers.py197 def test_json_output_function_exists(self):CODE
LOWruntime/test_helpers.py223 def test_check_permissions_always_granted(self):CODE
LOWruntime/test_helpers.py253 def test_check_permissions_uses_ax_api_instead_of_system_events(self):CODE
LOWruntime/test_helpers.py259 self.assertIn("def detect_accessibility_permission()", source)CODE
LOWruntime/test_helpers.py275 def test_clipboard_shortcuts_use_osascript_path(self):CODE
LOWruntime/test_helpers.py310 def test_input_functions_identical(self):CODE
LOWdesktop/scripts/build-sidecars.test.ts44function controlledSidecarEnvironment(CODE
LOWdesktop/scripts/build-sidecars.test.ts238async function fetchBeforeCompiledSidecarDeadline(CODE
LOWdesktop/scripts/electron-output-guard.ts13export function findRunningElectronOutputProcesses(CODE
LOWdesktop/scripts/electron-dev.ts32export function resolveElectronExecutable(desktopRoot: string, platform = process.platform) {CODE
LOWdesktop/scripts/build-sidecars.ts48async function stageHostRipgrepForOfflineBuild() {CODE
LOWdesktop/scripts/build-sidecars.ts99async function hasMatchingRipgrepManifest(CODE
LOWdesktop/electron/main.ts158function resolveStartupWindowBackground(): string {CODE
LOWdesktop/electron/main.ts167function installSystemAppearanceWatch() {CODE
LOWdesktop/electron/main.ts249function resolveMainRendererServerAccess(): PreviewLocalAccess | null {CODE
LOWdesktop/electron/ipc/capabilities.ts305export function validateElectronIpcPayload(channel: ElectronIpcChannel, payload: unknown): boolean {CODE
LOWdesktop/electron/ipc/capabilities.ts309export function isElectronIpcChannelAllowedForPetWindow(channel: ElectronIpcChannel): boolean {CODE
LOWdesktop/electron/ipc/previewMessage.ts34function isSelectionScreenshotKind(value: unknown): value is 'full' | 'viewport' | 'element' | 'region' {CODE
LOWdesktop/electron/ipc/previewMessage.ts92export function shouldForwardPreviewMessage(input: {CODE
LOWdesktop/electron/services/systemProxyBridge.ts259export function sanitizeProxyRequestHeaders(headers: http.IncomingHttpHeaders): http.IncomingHttpHeaders {CODE
LOWdesktop/electron/services/systemProxyBridge.ts317async function requestStreamingUsingRule(CODE
LOWdesktop/electron/services/dialogs.ts4export function toElectronOpenDialogOptions(options: DialogOpenOptions = {}): OpenDialogOptions {CODE
LOWdesktop/electron/services/dialogs.ts16export function toElectronSaveDialogOptions(options: DialogSaveOptions = {}): SaveDialogOptions {CODE
LOWdesktop/electron/services/windows.ts41export function hasMeaningfulIntersection(CODE
LOWdesktop/electron/services/windows.ts56export function isWindowStateVisibleOnAnyDisplay(CODE
LOWdesktop/electron/services/windows.ts70export function clampWindowStateToVisibleWorkArea(CODE
LOWdesktop/electron/services/windows.ts157export function windowChromeOptionsForPlatform(CODE
LOWdesktop/electron/services/windows.ts233export function refreshWindowsDragHitTest(CODE
LOWdesktop/electron/services/updateSmoke.ts101export function createUpdateSmokeUpdaterFromEnv(env: UpdateSmokeEnv): ElectronUpdaterLike | null {CODE
LOWdesktop/electron/services/notifications.ts15export function validateNotificationOptions(value: unknown): value is DesktopNotificationOptions {CODE
LOWdesktop/electron/services/notifications.ts26export function notificationPermissionState(CODE
LOWdesktop/electron/services/notifications.ts32export function requestNotificationPermission(CODE
LOWdesktop/electron/services/keychain.ts14export function installMacOsChromiumKeychainPromptGuard(CODE
LOWdesktop/electron/services/notificationSmoke.ts58export function parseNotificationSmokeDelay(value: string | undefined): number {CODE
LOWdesktop/electron/services/notificationSmoke.ts65function shouldTriggerSyntheticAction(value: string | undefined): boolean {CODE
LOWdesktop/electron/services/notificationSmoke.ts69export function appendNotificationSmokeLog(logPath: string, event: NotificationSmokeLogEvent) {CODE
LOWdesktop/electron/services/notificationSmoke.ts74export function logNotificationSmokeRendererAck(env: NodeJS.ProcessEnv, payload: unknown): boolean {CODE
LOWdesktop/electron/services/notificationSmoke.ts85export function scheduleNotificationSmoke({CODE
LOWdesktop/electron/services/pets.ts115export function createCustomPetCatalogLoader(CODE
LOWdesktop/electron/services/pets.ts352async function assertDirectoryIdentities(identities: DirectoryIdentity[]): Promise<void> {CODE
LOWdesktop/electron/services/pets.ts553function resolvePortableRelativePath(CODE
LOWdesktop/electron/services/pets.ts604async function captureImageDirectoryIdentities(CODE
LOWdesktop/electron/services/pets.ts623function hasExpectedImageSignature(data: Buffer, mimeType: CustomPetImageMimeType): boolean {CODE
LOWdesktop/electron/services/pets.ts674function hasEmbeddedImageAnimation(data: Buffer, mimeType: CustomPetImageMimeType): boolean {CODE
LOWdesktop/electron/services/pets.ts1013async function assertCustomPetTargetAvailable(targetPath: string): Promise<void> {CODE
LOWdesktop/electron/services/pets.ts1063function validatedCustomPetIdentity(input: {CODE
LOWdesktop/electron/services/pets.ts1121export async function createCustomPetFromAtlasBytes(CODE
LOWdesktop/electron/services/pets.ts1324function packageCanBeSkippedForExhaustedBudget(entry: Dirent): boolean {CODE
LOWdesktop/electron/services/menu.ts26export function buildApplicationMenuTemplate(CODE
LOWdesktop/electron/services/menu.ts93export function buildRendererContextMenuTemplate(CODE
LOWdesktop/electron/services/menu.ts116export async function installRendererContextMenu(window: BrowserWindow) {CODE
LOWdesktop/electron/services/appIdentity.ts10export function applyWindowsAppUserModelId(CODE
2903 more matches not shown…
Decorative Section Separators506 hits · 1425 pts
SeverityFileLineSnippetContext
MEDIUMruntime/win_helper.py269# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py271# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py545# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py547# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py40# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py42# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py100# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py102# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py121# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py123# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py178# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py180# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py223# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py225# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py566# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py568# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py579# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py581# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py631# ---------------------------------------------------------------------------COMMENT
MEDIUMruntime/win_helper.py633# ---------------------------------------------------------------------------COMMENT
MEDIUMdesktop/src/types/chat.ts6// ─── Client → Server ──────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/types/chat.ts82// ─── Server → Client ──────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/types/chat.ts321// ─── UI Message model (rendered in MessageList) ───────────────────COMMENT
MEDIUMdesktop/src/stores/workflowStore.ts451// ── Selectors ────────────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/stores/workflowStore.ts542// ── Event parsing ────────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/stores/chatStore.ts4054// ─── History mapping helpers ─────────COMMENT
MEDIUM…top/src/components/chat/CurrentTurnChangeCard.test.tsx6// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…top/src/components/chat/CurrentTurnChangeCard.test.tsx8// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…top/src/components/chat/CurrentTurnChangeCard.test.tsx98// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…top/src/components/chat/CurrentTurnChangeCard.test.tsx100// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…top/src/components/chat/CurrentTurnChangeCard.test.tsx110// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…top/src/components/chat/CurrentTurnChangeCard.test.tsx112// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…top/src/components/chat/CurrentTurnChangeCard.test.tsx159// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…top/src/components/chat/CurrentTurnChangeCard.test.tsx161// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/openWithItems.test.ts5// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/openWithItems.test.ts7// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/openWithItems.test.ts66// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/openWithItems.test.ts68// ──────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/openWithItems.ts4// ─── File-type description ────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/openWithItems.ts46// ─── Open-with items ──────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/filePathBoundary.test.ts22 // ─── the shape our own system prompt asks the model for ────────────────────COMMENT
MEDIUMdesktop/src/lib/filePathBoundary.test.ts30 // ─── prefixes ──────────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/filePathBoundary.test.ts39 // ─── bare filenames ────────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/filePathBoundary.test.ts46 // ─── the property-access traps ─────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/filePathBoundary.test.ts58 // ─── other non-paths ───────────────────────────────────────────────────────COMMENT
MEDIUMdesktop/src/lib/filePathBoundary.test.ts67 // ─── sentence boundaries (the #1145 lesson, mirrored) ──────────────────────COMMENT
MEDIUMdesktop/src/lib/filePathBoundary.test.ts67 // ─── sentence boundaries (the #1145 lesson, mirrored) ──────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts148 // ─── Title Bar ──────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts153 // ─── Open Project ──────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts158 // ─── Open With ─────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts2243 // ─── Model Selector ──────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts2252 // ─── Directory Picker ──────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts2262 // ─── File Search ──────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts4 // ─── Common ──────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts45 // ─── Sidebar ──────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts184 // ─── Assistant Output Targets ──────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts192 // ─── Workspace Panel ───────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts278 // ─── Status Bar ──────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts284 // ─── Settings ──────────────────────────────────────COMMENT
MEDIUMdesktop/src/i18n/locales/zh-TW.ts1669 // ─── Empty Session ──────────────────────────────────────COMMENT
446 more matches not shown…
Over-Commented Block473 hits · 455 pts
SeverityFileLineSnippetContext
LOWdesktop/scripts/install-macos-unsigned.sh1#!/usr/bin/env bashCOMMENT
LOWdesktop/src-tauri/src/lib.rs1721 // 历史用途:此前 sidecar launcher 用 dynamic file:// import 加载磁盘上COMMENT
LOWdesktop/src-tauri/src/main.rs1// Prevents additional console window on Windows in releaseCOMMENT
LOWdesktop/src/stores/chatStore.test.ts1961COMMENT
LOWdesktop/src/stores/chatStore.test.ts9921 expect({ afterFirst, afterSecond }).toEqual({COMMENT
LOWdesktop/src/stores/chatStore.ts1021 // 这里曾经还有一道守卫:扫描整个 messages,只要某条 hydrated 回复与来文逐字相同COMMENT
LOWdesktop/src/components/chat/ChatInput.tsx281 const useCompactControls = isMobileComposer || !fitsAtLeast(TOOLBAR_LOCATION_MIN_WIDTH)COMMENT
LOW…sktop/src/components/activity/SessionActivityPanel.tsx681 // session area. `rail` used to be an in-flow flex sibling, which is why theCOMMENT
LOWdesktop/src/components/markdown/MarkdownRenderer.tsx581 )COMMENT
LOWdesktop/src/components/layout/TabBar.test.tsx1521 const active = screen.getByText('Active One').closest('.tab-bar-interactive')COMMENT
LOWdesktop/src/components/layout/TabBar.test.tsx1561 // the enemy: a 3px line across the bottom is exactly the cut that theCOMMENT
LOWdesktop/src/components/layout/TabBar.tsx41const DRAG_START_THRESHOLD = 4COMMENT
LOWdesktop/src/components/layout/TabBar.tsx241 // a scrollLeft computed without them. Measured on a 1280px window with sevenCOMMENT
LOWdesktop/src/components/layout/TabBar.tsx801 // borderless so paper runs unbroken from the tab into the view below.COMMENT
LOWdesktop/src/lib/assistantOutputTargets.ts341 // A deliverable produced by a shell command is never in `changedFiles` — theCOMMENT
LOWdesktop/src/pages/SettingsNavigation.test.tsx81 const rail = screen.getByRole('button', { name: 'Providers' })COMMENT
LOWsrc/main.tsx1// These side-effects must run before all other imports:COMMENT
LOWsrc/main.tsx1041 // the tengu_kairos GrowthBook gate is on, force brief on. PermissionCOMMENT
LOWsrc/main.tsx1061 // isAssistantMode() runs below. The daemon has already checkedCOMMENT
LOWsrc/main.tsx1501 }COMMENT
LOWsrc/main.tsx1601 if (dynamicMcpConfig && !areMcpConfigsAllowedWithEnterpriseMcpConfig(dynamicMcpConfig)) {COMMENT
LOWsrc/main.tsx1981 // .claude/settings.json PATH/GIT_DIR/GIT_WORK_TREE) so gitExe() andCOMMENT
LOWsrc/main.tsx2001 // a cache hit. The microtask from await getIsGit() drains at theCOMMENT
LOWsrc/main.tsx2021 // persists it on the first user message; REPL's useTerminalTitle reads itCOMMENT
LOWsrc/main.tsx2581 // Sequencing matters: the warmup scans disk for .orphaned_at markers,COMMENT
LOWsrc/main.tsx2621 if (outputFormat === 'stream-json' || outputFormat === 'json') {COMMENT
LOWsrc/main.tsx2781 // Desktop/bridge sessions (`--sdk-url`) are different: the user isCOMMENT
LOWsrc/QueryEngine.ts441 // an assistant/user/compact_boundary message — which doesn't happen untilCOMMENT
LOWsrc/query.ts281 transition: undefined,COMMENT
LOWsrc/query.ts421 )COMMENT
LOWsrc/query.ts601 // Skip this check if compaction just happened - the compaction result is alreadyCOMMENT
LOWsrc/query.ts1081 const isWithheld413 =COMMENT
LOWsrc/query.ts1561 // Drain pending notifications. LocalShellTask completions are 'next'COMMENT
LOWsrc/ink/output.ts741 nextCode <= 0x7eCOMMENT
LOWsrc/ink/dom.ts41 // Used to skip empty renders during React 19's effect double-invoke in test modeCOMMENT
LOWsrc/ink/dom.ts61 // naturally cancels (pure accumulator, no target tracking).COMMENT
LOWsrc/ink/render-node-to-output.ts721 // padding) begins. Exposed via ScrollBoxHandle.getViewportTop() soCOMMENT
LOWsrc/ink/render-node-to-output.ts741 node.pendingScrollDelta = undefinedCOMMENT
LOWsrc/ink/render-node-to-output.ts761 // transiently SHRINK scrollHeight (tail unmount + stale heightCacheCOMMENT
LOWsrc/ink/render-node-to-output.ts801 // startup) the probe has resolved — same timing guarantee theCOMMENT
LOWsrc/ink/render-node-to-output.ts881 } else {COMMENT
LOWsrc/ink/render-node-to-output.ts961 // 1. Dirty children — their content changed, blitted pixels areCOMMENT
LOWsrc/ink/render-node-to-output.ts981 // check cached.y−delta === screenY reduces to delta === deltaCOMMENT
LOWsrc/ink/render-node-to-output.ts1101 boxBackgroundColor,COMMENT
LOWsrc/ink/render-node-to-output.ts1221 nodeCache.set(node, rect)COMMENT
LOWsrc/ink/render-node-to-output.ts1241// Without this, a spinner inside a ScrollBox dirties the wrapper on everyCOMMENT
LOWsrc/ink/searchHighlight.ts41 const rowOff = row * wCOMMENT
LOWsrc/ink/ink.tsx121 // pass in onRender can read it and App.tsx can update it from mouseCOMMENT
LOWsrc/ink/ink.tsx141 private readonly selectionListeners = new Set<() => void>();COMMENT
LOWsrc/ink/ink.tsx161 // INSIDE the BSU/ESU block so clear+paint is atomic. Writing ERASE_SCREENCOMMENT
LOWsrc/ink/ink.tsx461 // captureScrolledRows reads the rows that are about to scroll outCOMMENT
LOWsrc/ink/ink.tsx481 // captureScrolledRows and shift* are a pair: capture grabs rows aboutCOMMENT
LOWsrc/ink/ink.tsx501 // the footer endpoint pins the selection, text scrolls away underCOMMENT
LOWsrc/ink/ink.tsx521 // so the diff picks up selection as ordinary cell changes andCOMMENT
LOWsrc/ink/ink.tsx561 // cells at sibling boundaries that per-node damage tracking misses.COMMENT
LOWsrc/ink/ink.tsx621 });COMMENT
LOWsrc/ink/ink.tsx641 // After resize, prepend ERASE_SCREEN too. The diff only writes cellsCOMMENT
LOWsrc/ink/ink.tsx741 writeDiffToTerminal(this.terminal, optimized, this.altScreenActive && !SYNC_OUTPUT_SUPPORTED);COMMENT
LOWsrc/ink/ink.tsx1481 // We unconditionally send all disable sequences because terminal detectionCOMMENT
LOWsrc/ink/parse-keypress.ts21// Modifier is optional - when absent, defaults to 1 (no modifiers)COMMENT
413 more matches not shown…
Verbosity Indicators46 hits · 83 pts
SeverityFileLineSnippetContext
LOWdesktop/src/stores/chatStore.ts5645 // Step 1: Collect Agent tool_use blocks → map agent name to toolUseIdCOMMENT
LOWdesktop/src/stores/chatStore.ts5665 // Step 2: Extract <teammate-message> content by teammate_idCOMMENT
LOWdesktop/src/stores/chatStore.ts5695 // Step 3: Correlate and build notificationsCOMMENT
LOWsrc/tasks/LocalShellTask/LocalShellTask.tsx294 // Step 1: Get the task and shell command from current stateCOMMENT
LOWsrc/tools/BashTool/sedEditParser.ts277 // Step 1: Protect literal backslashes (\\) first - in both BRE and ERE, \\ is literal backslashCOMMENT
LOWsrc/tools/BashTool/sedEditParser.ts279 // Step 2: Replace escaped metacharacters with placeholders (these should become unescaped in JS)COMMENT
LOWsrc/tools/BashTool/sedEditParser.ts285 // Step 3: Escape unescaped metacharacters (these are literal in BRE)COMMENT
LOWsrc/tools/BashTool/sedEditParser.ts291 // Step 4: Replace placeholders with their JS equivalentsCOMMENT
LOWsrc/server/api/computer-use.ts344 // Step 1: Check pythonCOMMENT
LOWsrc/server/api/computer-use.ts374 // Step 2: Extract runtime files to ~/.claude/.runtime/COMMENT
LOWsrc/server/api/computer-use.ts387 // Step 3: Create venvCOMMENT
LOWsrc/server/api/computer-use.ts427 // Step 4: Ensure pipCOMMENT
LOWsrc/server/api/computer-use.ts448 // Step 5: Install requirementsCOMMENT
LOWsrc/server/services/sessionService.ts2506 // Step 1: Try matching the transcript model name directly (current behavior)COMMENT
LOWsrc/server/services/sessionService.ts2518 // Step 2: Prefer the model this session actually launched with. SomeCOMMENT
LOWsrc/server/services/sessionService.ts2534 // Step 3: If transcript model name didn't match, try matching withCOMMENT
LOWsrc/server/services/sessionService.ts2579 // Step 1: Try matching the transcript model name directlyCOMMENT
LOWsrc/server/services/sessionService.ts2589 // Step 2: Fallback to provider configured model names.COMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts753 // Step 1: Migrate to single file format (consolidates V1/V2 files, cleans up legacy cache)COMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts756 // Step 2: Sync enabledPlugins from settings.json to installed_plugins.jsonCOMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts764 // Step 3: Initialize in-memory session stateCOMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts1183 // Step 2: Start with existing data (or start empty if no file exists)COMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts1192 // Step 3: Update V2 scopes based on settings.json (settings is source of truth)COMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts1148 // Step 1: Build a map of pluginId -> scope from all settings.json filesCOMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts1312 // Step 4: Save to single file (V2 format)COMMENT
LOWsrc/utils/plugins/pluginLoader.ts1360 // Step 1: Load or create the plugin manifestCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1365 // Step 2: Create the base plugin objectCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1376 // Step 3: Auto-detect optional directories in parallelCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1532 // Step 4: Register agents directory if detectedCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1641 // Step 5: Load hooks configurationCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1789 // Step 6: Load plugin settingsCOMMENT
LOWsrc/utils/permissions/permissionSetup.ts993 // We need to check if base tools were explicitly provided (not just empty default)COMMENT
LOWsrc/components/MarkdownTable.tsx107 // Step 1: Get minimum (longest word) and ideal (full content) widthsCOMMENT
LOWsrc/components/MarkdownTable.tsx123 // Step 2: Calculate available spaceCOMMENT
LOWsrc/components/MarkdownTable.tsx130 // Step 3: Calculate column widths that fit available spaceCOMMENT
LOWsrc/components/MarkdownTable.tsx158 // Step 4: Calculate max row lines to determine if vertical format is neededCOMMENT
LOWsrc/components/StructuredDiff/Fallback.tsx353 // Step 1: Transform lines to line objects with type informationCOMMENT
LOWsrc/components/StructuredDiff/Fallback.tsx356 // Step 2: Group adjacent add/remove lines for word-level diffingCOMMENT
LOWsrc/components/StructuredDiff/Fallback.tsx359 // Step 3: Number the diff linesCOMMENT
LOWsrc/components/StructuredDiff/Fallback.tsx368 // Step 4: Render formattingCOMMENT
LOWsrc/skills/bundled/skillify.ts40### Step 1: Analyze the SessionCOMMENT
LOWsrc/skills/bundled/skillify.ts52### Step 2: Interview the UserCOMMENT
LOWsrc/skills/bundled/skillify.ts90### Step 3: Write the SKILL.mdCOMMENT
LOWsrc/skills/bundled/skillify.ts148### Step 4: Confirm and SaveCOMMENT
LOWsrc/services/compact/sessionMemoryCompact.ts242 // Step 1: Handle tool_use/tool_result pairsCOMMENT
LOWsrc/services/compact/sessionMemoryCompact.ts288 // Step 2: Handle thinking blocks that share message.id with kept assistant messagesCOMMENT
Structural Annotation Overuse45 hits · 82 pts
SeverityFileLineSnippetContext
LOWdesktop/src/stores/chatStore.ts5645 // Step 1: Collect Agent tool_use blocks → map agent name to toolUseIdCOMMENT
LOWdesktop/src/stores/chatStore.ts5665 // Step 2: Extract <teammate-message> content by teammate_idCOMMENT
LOWdesktop/src/stores/chatStore.ts5695 // Step 3: Correlate and build notificationsCOMMENT
LOWsrc/tasks/LocalShellTask/LocalShellTask.tsx294 // Step 1: Get the task and shell command from current stateCOMMENT
LOWsrc/tools/BashTool/sedEditParser.ts277 // Step 1: Protect literal backslashes (\\) first - in both BRE and ERE, \\ is literal backslashCOMMENT
LOWsrc/tools/BashTool/sedEditParser.ts279 // Step 2: Replace escaped metacharacters with placeholders (these should become unescaped in JS)COMMENT
LOWsrc/tools/BashTool/sedEditParser.ts285 // Step 3: Escape unescaped metacharacters (these are literal in BRE)COMMENT
LOWsrc/tools/BashTool/sedEditParser.ts291 // Step 4: Replace placeholders with their JS equivalentsCOMMENT
LOWsrc/server/api/computer-use.ts344 // Step 1: Check pythonCOMMENT
LOWsrc/server/api/computer-use.ts374 // Step 2: Extract runtime files to ~/.claude/.runtime/COMMENT
LOWsrc/server/api/computer-use.ts387 // Step 3: Create venvCOMMENT
LOWsrc/server/api/computer-use.ts427 // Step 4: Ensure pipCOMMENT
LOWsrc/server/api/computer-use.ts448 // Step 5: Install requirementsCOMMENT
LOWsrc/server/services/sessionService.ts2506 // Step 1: Try matching the transcript model name directly (current behavior)COMMENT
LOWsrc/server/services/sessionService.ts2518 // Step 2: Prefer the model this session actually launched with. SomeCOMMENT
LOWsrc/server/services/sessionService.ts2534 // Step 3: If transcript model name didn't match, try matching withCOMMENT
LOWsrc/server/services/sessionService.ts2579 // Step 1: Try matching the transcript model name directlyCOMMENT
LOWsrc/server/services/sessionService.ts2589 // Step 2: Fallback to provider configured model names.COMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts753 // Step 1: Migrate to single file format (consolidates V1/V2 files, cleans up legacy cache)COMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts756 // Step 2: Sync enabledPlugins from settings.json to installed_plugins.jsonCOMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts764 // Step 3: Initialize in-memory session stateCOMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts1183 // Step 2: Start with existing data (or start empty if no file exists)COMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts1192 // Step 3: Update V2 scopes based on settings.json (settings is source of truth)COMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts1148 // Step 1: Build a map of pluginId -> scope from all settings.json filesCOMMENT
LOWsrc/utils/plugins/installedPluginsManager.ts1312 // Step 4: Save to single file (V2 format)COMMENT
LOWsrc/utils/plugins/pluginLoader.ts1360 // Step 1: Load or create the plugin manifestCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1365 // Step 2: Create the base plugin objectCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1376 // Step 3: Auto-detect optional directories in parallelCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1532 // Step 4: Register agents directory if detectedCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1641 // Step 5: Load hooks configurationCOMMENT
LOWsrc/utils/plugins/pluginLoader.ts1789 // Step 6: Load plugin settingsCOMMENT
LOWsrc/components/MarkdownTable.tsx107 // Step 1: Get minimum (longest word) and ideal (full content) widthsCOMMENT
LOWsrc/components/MarkdownTable.tsx123 // Step 2: Calculate available spaceCOMMENT
LOWsrc/components/MarkdownTable.tsx130 // Step 3: Calculate column widths that fit available spaceCOMMENT
LOWsrc/components/MarkdownTable.tsx158 // Step 4: Calculate max row lines to determine if vertical format is neededCOMMENT
LOWsrc/components/StructuredDiff/Fallback.tsx353 // Step 1: Transform lines to line objects with type informationCOMMENT
LOWsrc/components/StructuredDiff/Fallback.tsx356 // Step 2: Group adjacent add/remove lines for word-level diffingCOMMENT
LOWsrc/components/StructuredDiff/Fallback.tsx359 // Step 3: Number the diff linesCOMMENT
LOWsrc/components/StructuredDiff/Fallback.tsx368 // Step 4: Render formattingCOMMENT
LOWsrc/skills/bundled/skillify.ts40### Step 1: Analyze the SessionCOMMENT
LOWsrc/skills/bundled/skillify.ts52### Step 2: Interview the UserCOMMENT
LOWsrc/skills/bundled/skillify.ts90### Step 3: Write the SKILL.mdCOMMENT
LOWsrc/skills/bundled/skillify.ts148### Step 4: Confirm and SaveCOMMENT
LOWsrc/services/compact/sessionMemoryCompact.ts242 // Step 1: Handle tool_use/tool_result pairsCOMMENT
LOWsrc/services/compact/sessionMemoryCompact.ts288 // Step 2: Handle thinking blocks that share message.id with kept assistant messagesCOMMENT
Hallucination Indicators6 hits · 60 pts
SeverityFileLineSnippetContext
CRITICALadapters/feishu/streaming-card.ts220 this.deps.larkClient.im.message.create({CODE
CRITICALadapters/feishu/streaming-card.ts355 this.deps.larkClient.im.message.patch({CODE
CRITICALadapters/feishu/streaming-card.ts369 this.deps.larkClient.im.message.patch({CODE
CRITICALadapters/feishu/streaming-card.ts424 this.deps.larkClient.im.message.patch({CODE
CRITICALadapters/feishu/streaming-card.ts577 this.deps.larkClient.im.message.patch({CODE
CRITICALsrc/tools/AgentTool/UI.tsx839 const toolResultBlock = lastToolResult.data.message.message.content.find(c => c.type === 'tool_result');CODE
Modern AI Meta-Vocabulary11 hits · 31 pts
SeverityFileLineSnippetContext
MEDIUMrelease-notes/v0.4.3.md58- #830:尊重自定义 provider context window。CODE
MEDIUMsrc/main.tsx3339 // of a remote assistant session. The agentic loop runs remotely; thisCOMMENT
MEDIUMsrc/query.ts198 // budget for the whole agentic turn; `remaining` is computed per iterationCOMMENT
MEDIUMsrc/tools/AgentTool/loadAgentsDir.ts128 maxTurns?: number // Maximum number of agentic turns before stoppingCODE
MEDIUMsrc/utils/betas.ts440 // excluded by getAllModelBetas() since non-agentic Haiku calls don't need them.COMMENT
MEDIUMsrc/utils/attachments.ts1081 // During proactive agentic loops, task-notification commands would otherwiseCOMMENT
MEDIUMsrc/utils/attachments.ts1315 // long agentic sessions, where this accumulated 60-105× per session.COMMENT
MEDIUMsrc/services/api/claude.ts775 // (query.ts decrements across the agentic loop).COMMENT
MEDIUMsrc/services/api/claude.ts1201 // non-agentic queries (compact, side_question, extract_memories, etc.)COMMENT
MEDIUMsrc/services/api/claude.ts1535 // per-call so non-agentic queries keep their own stable header set.COMMENT
MEDIUMsrc/services/api/claude.ts1569 // Only latch from agentic queries so a classifier call doesn't flip theCOMMENT
Fake / Example Data27 hits · 28 pts
SeverityFileLineSnippetContext
LOW…ktop/scripts/e2e-deepseek-thinking-ui-agent-browser.sh192 .find((node) => node.getAttribute('placeholder') === placeholder);CODE
LOW…ktop/scripts/e2e-deepseek-thinking-ui-agent-browser.sh279 .find((node) => node.getAttribute('placeholder') === placeholder);CODE
LOW…ktop/scripts/e2e-deepseek-thinking-ui-agent-browser.sh285 .filter((node) => node.getAttribute('placeholder') === '与主模型相同');CODE
LOWdesktop/src/stores/hahaOpenAIOAuthStore.test.ts60 email: 'user@example.com',CODE
LOWdesktop/src/stores/hahaOpenAIOAuthStore.test.ts73 email: 'user@example.com',CODE
LOWdesktop/src/stores/hahaOpenAIOAuthStore.test.ts85 email: 'user@example.com',CODE
LOWscripts/quality-gate/desktop-smoke/deterministic.ts82 apiKey: 'desktop-ui-smoke-fake-key',CODE
LOW…ripts/quality-gate/desktop-smoke/deterministic.test.ts56 apiKey: 'desktop-ui-smoke-fake-key',CODE
LOWsrc/server/__tests__/haha-grok-oauth-service.test.ts90 email: 'user@example.com',CODE
LOWsrc/server/__tests__/haha-grok-oauth-service.test.ts100 email: 'user@example.com',CODE
LOWsrc/server/__tests__/haha-grok-oauth-service.test.ts137 email: 'user@example.com',CODE
LOWsrc/server/__tests__/haha-grok-oauth-api.test.ts41 email: 'user@example.com',CODE
LOWsrc/server/__tests__/haha-grok-oauth-api.test.ts49 expect(statusText).toContain('user@example.com')CODE
LOWsrc/server/__tests__/providers.test.ts555 email: 'user@example.com',CODE
LOWsrc/server/services/diagnosticsShare.test.ts81 email: 'user@example.com',CODE
LOWsrc/server/services/diagnosticsShare.test.ts105 'user@example.com',CODE
LOWsrc/utils/plugins/pluginLoader.ts1117 * "name": "John Doe",COMMENT
LOWsrc/utils/plugins/marketplaceManager.ts1244 * "owner": { "name": "John Doe", "email": "john@example.com" },COMMENT
LOWsrc/utils/mcp/elicitationValidation.ts24 example: 'user@example.com',CODE
LOWsrc/utils/__tests__/tokens.test.ts28 content: [{ type: 'text', text: 'placeholder' }],CODE
LOWsrc/skills/bundled/loremIpsum.ts273 // Just dump the lorem ipsum text into the conversationCOMMENT
LOWsrc/services/openaiAuth/storage.test.ts90 email: 'user@example.com',CODE
LOWsrc/services/openaiAuth/storage.test.ts103 email: 'user@example.com',CODE
LOWsrc/services/openaiAuth/fetch.test.ts30 email: 'user@example.com',CODE
LOWsrc/services/openaiAuth/fetch.ts24export const OPENAI_OAUTH_DUMMY_KEY = 'openai-oauth-dummy-key'CODE
LOWsrc/services/grokAuth/storage.test.ts35 email: 'user@example.com',CODE
LOWsrc/services/grokAuth/fetch.ts13export const GROK_OAUTH_DUMMY_KEY = 'grok-oauth-dummy-key'CODE
Synthetic Comment Markers3 hits · 20 pts
SeverityFileLineSnippetContext
HIGHsrc/server/services/sessionService.ts2225 // 3. Look for AI-generated title (written by titleService)COMMENT
HIGHsrc/utils/claudeInChrome/setup.ts320REM Generated by Claude Code - do not edit manuallyCODE
HIGHsrc/utils/claudeInChrome/setup.ts325# Generated by Claude Code - do not edit manuallyCOMMENT
AI Slop Vocabulary6 hits · 16 pts
SeverityFileLineSnippetContext
MEDIUMpackage-lock.json5300 "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.3.tgz",CODE
MEDIUMsite/package-lock.json1802 "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.3.tgz",CODE
MEDIUMsrc/tools/PowerShellTool/commandSemantics.ts71 // robocopy.exe: Windows native robust file copyCOMMENT
MEDIUMsrc/utils/swarm/backends/PaneBackendExecutor.ts341 // A more robust check would query the backend for pane existenceCOMMENT
MEDIUMsrc/utils/powershell/parser.ts1068 // and extracting .Redirections) is both simpler and more robust: it catchesCOMMENT
MEDIUMsrc/hooks/useVoiceIntegration.tsx176 // the gap is seamless once transcript text arrives.COMMENT
Excessive Try-Catch Wrapping17 hits · 14 pts
SeverityFileLineSnippetContext
LOWruntime/win_helper.py265 except Exception:CODE
LOWruntime/win_helper.py277 except Exception:CODE
LOWruntime/win_helper.py541 except Exception:CODE
LOWruntime/win_helper.py553 except Exception:CODE
LOWruntime/win_helper.py159 except Exception:CODE
LOWruntime/win_helper.py239 except Exception:CODE
LOWruntime/win_helper.py405 except Exception:CODE
LOWruntime/win_helper.py430 except Exception:CODE
LOWruntime/win_helper.py763 except Exception as exc:CODE
LOWruntime/mac_helper.py219 except Exception:CODE
LOWruntime/mac_helper.py365 except Exception:CODE
LOWruntime/mac_helper.py371 except Exception:CODE
LOWruntime/mac_helper.py382 except Exception:CODE
LOWruntime/mac_helper.py522 except Exception:CODE
LOWruntime/mac_helper.py530 except Exception:CODE
LOWruntime/mac_helper.py570 except Exception:CODE
LOWruntime/mac_helper.py769 except Exception as exc:CODE
Unused Imports7 hits · 6 pts
SeverityFileLineSnippetContext
LOWruntime/win_helper.py7CODE
LOWruntime/mac_helper.py2CODE
LOWruntime/test_helpers.py12CODE
LOWruntime/test_helpers.py19CODE
LOWruntime/test_helpers.py19CODE
LOWdesktop/scripts/assemble-generated-pet-atlas.py4CODE
LOWdesktop/scripts/build-pet-sheet-guide.py13CODE
Deep Nesting8 hits · 6 pts
SeverityFileLineSnippetContext
LOWruntime/win_helper.py281CODE
LOWruntime/win_helper.py434CODE
LOWruntime/win_helper.py478CODE
LOWruntime/mac_helper.py350CODE
LOWruntime/mac_helper.py448CODE
LOWruntime/mac_helper.py608CODE
LOWruntime/test_helpers.py33CODE
LOWdesktop/scripts/build-pet-sheet-guide.py134CODE
Cross-Language Confusion (JS/TS)1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHsrc/tools/TodoWriteTool/prompt.ts100print("Hello World")CODE
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWruntime/test_helpers.py35 # Read the file and extract just the KEY_MAP dictCOMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWdesktop/scripts/install-macos-unsigned.sh15# Usage:COMMENT
TODO Padding1 hit · 2 pts
SeverityFileLineSnippetContext
LOWsrc/utils/hooks.ts1211 // TODO: Add tests for EPIPE handling.COMMENT