App for Claude Code / Codex / Gemini / OpenCode, vibe coding anytime, anywhere
This report presents the forensic synthetic code analysis of tiann/hapi, a TypeScript project with 4,468 GitHub stars. SynthScan v2.0 examined 206,514 lines of code across 1226 source files, recording 619 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 3.6 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).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
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.
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.
The scanner identified 619 distinct pattern matches across 11 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/e2e-fixtures/file-md-preview-fixture.tsx | 33 | function FileMarkdownPreviewFixture() { | CODE |
| LOW | web/src/test/setup.ts | 9 | function installMemoryLocalStorage(): void { | CODE |
| LOW | web/src/chat/reconcile.ts | 125 | function areAgentReasoningBlocksEqual(left: AgentReasoningBlock, right: AgentReasoningBlock): boolean { | CODE |
| LOW | web/src/chat/reconcile.ts | 140 | function areGeneratedImageBlocksEqual(left: GeneratedImageBlock, right: GeneratedImageBlock): boolean { | CODE |
| LOW | web/src/chat/reconcile.ts | 149 | function areCodexReviewBlocksEqual(left: CodexReviewBlock, right: CodexReviewBlock): boolean { | CODE |
| LOW | web/src/chat/modelConfig.ts | 25 | function parseCursorWireContextWindow(model: string): number | null { | CODE |
| LOW | web/src/chat/reducerTools.ts | 157 | export function collectToolIdsFromMessages(messages: NormalizedMessage[]): Set<string> { | CODE |
| LOW | web/src/chat/reducerTools.ts | 176 | export function extractTitleFromChangeTitleInput(input: unknown): string | null { | CODE |
| LOW | web/src/chat/reducerTimeline.ts | 44 | function mapAgentRunStatusToToolState(status: string | null): ToolCallBlock['tool']['state'] { | CODE |
| LOW | web/src/chat/reducerTimeline.ts | 62 | function isNonTerminalAgentRunState(state: ToolCallBlock['tool']['state']): boolean { | CODE |
| LOW | web/src/chat/reducerTimeline.ts | 66 | function shouldIgnoreAgentRunNonTerminalUpdateAfterTerminal( | CODE |
| LOW | web/src/chat/reducerTimeline.ts | 78 | function isCloseAgentCleanupUpdate(event: Record<string, unknown>): boolean { | CODE |
| LOW | web/src/chat/reducerTimeline.ts | 90 | function shouldIgnoreAgentRunCloseCleanupAfterTerminal( | CODE |
| LOW | web/src/chat/outline.ts | 53 | export function getConversationMessageAnchorId(messageId: string): string { | CODE |
| LOW | web/src/chat/presentation.ts | 46 | export function formatMessageTimestampTitle(date: Date): string { | CODE |
| LOW | web/src/chat/normalizeAgent.ts | 5 | function normalizeToolResultPermissions(value: unknown): ToolResultPermission | undefined { | CODE |
| LOW | web/src/chat/normalizeAgent.ts | 150 | function normalizeCodexReviewFinding(value: unknown): CodexReviewFinding | null { | CODE |
| LOW | web/src/chat/reducer.ts | 18 | function isUsageVisibleInParentContext(usage: UsageData): boolean { | CODE |
| LOW | web/src/chat/reducer.ts | 60 | function isRedundantGoalStatusMessage(event: AgentEvent): boolean { | CODE |
| LOW | web/src/chat/normalize.ts | 8 | export function normalizeDecryptedMessage(message: DecryptedMessage): NormalizedMessage | null { | CODE |
| LOW | web/src/chat/toolGroups.ts | 199 | export function isEligibleForToolGrouping(block: ToolCallBlock): boolean { | CODE |
| LOW | web/src/utils/terminalSupport.ts | 7 | export function isRemoteTerminalSupported(metadata: SessionMetadataSummary | null | undefined): boolean { | CODE |
| LOW | web/src/realtime/RealtimeSession.ts | 62 | export function resetRealtimeSessionState() { | CODE |
| LOW | web/src/realtime/RealtimeSession.ts | 82 | export function getCurrentRealtimeSessionId(): string | null { | CODE |
| LOW | web/src/realtime/gemini/toolAdapter.ts | 68 | export async function handleGeminiFunctionCalls( | CODE |
| LOW | web/src/realtime/hooks/voiceContextPlan.ts | 73 | export function buildSessionVoiceContextPlan( | CODE |
| LOW | web/src/realtime/hooks/contextFormatters.ts | 149 | function extractSpeakableFromContent(content: unknown): string | null { | CODE |
| LOW | web/src/realtime/hooks/contextFormatters.ts | 182 | function isNonSpeakableAgentPayload(content: unknown): boolean { | CODE |
| LOW | web/src/realtime/hooks/contextFormatters.ts | 198 | export function extractLastAssistantSpeakable(messages: DecryptedMessage[]): string | null { | CODE |
| LOW | web/src/components/PwaUpdateBanner.tsx | 57 | export function PwaUpdateBannerWithStatusOffset({ | CODE |
| LOW | web/src/components/SessionList.tsx | 119 | export function deduplicateSessionsByAgentId(sessions: SessionSummary[], selectedSessionId?: string | null): SessionSumm | CODE |
| LOW | web/src/components/SessionList.tsx | 160 | export function isSidebarEmptySessionStub(session: SessionSummary): boolean { | CODE |
| LOW | web/src/components/SessionList.tsx | 169 | export function shouldShowSessionInSidebar(session: SessionSummary, selectedSessionId?: string | null): boolean { | CODE |
| LOW | web/src/components/SessionList.tsx | 190 | export function getNextSessionVisibleCount(current: number, step: number, total: number): number { | CODE |
| LOW | web/src/components/SessionList.tsx | 245 | export function expandSelectedSessionCollapseOverrides( | CODE |
| LOW | web/src/components/SessionList.tsx | 548 | function formatCodexImportedRelativeTime(value: number, t: (key: string, params?: Record<string, string | number>) => st | CODE |
| LOW | web/src/components/SessionAttentionIndicator.tsx | 21 | export function SessionAttentionIndicator(props: { | CODE |
| LOW | web/src/components/MarkdownRenderer.tsx | 59 | function StandaloneMarkdownContent(props: MarkdownRendererProps) { | CODE |
| LOW | web/src/components/LazyRainbowText.tsx | 96 | function processChildrenForRainbow(children: React.ReactNode): React.ReactNode { | CODE |
| LOW | web/src/components/SessionChat.tsx | 75 | export async function applyModelChangeWithReasoningRollback(args: { | CODE |
| LOW | web/src/components/SessionChat.tsx | 109 | export function shouldAutoClearPendingSchedule(pending: PendingSchedule | null): boolean { | CODE |
| LOW | web/src/components/SessionChat.tsx | 121 | export function isScratchlistToggleHotkey(e: { | CODE |
| LOW | web/src/components/SessionChat.tsx | 156 | export function isScratchlistHotkeyBlockedTarget(target: EventTarget | null): boolean { | CODE |
| LOW | web/src/components/SessionChat.tsx | 192 | function isUninvokedScheduledMessage(message: DecryptedMessage): boolean { | CODE |
| LOW | web/src/components/Fue.tsx | 51 | export function computeFueCalloutPlacement(params: { | CODE |
| LOW | web/src/components/WorkspaceBrowser.tsx | 76 | function normalizePathForComparison(path: string): string { | CODE |
| LOW | web/src/components/CursorMigrationBanner.tsx | 28 | export function isCursorMigrationInProgress(metadata: Metadata | undefined | null): boolean { | CODE |
| LOW | web/src/components/CursorMigrationBanner.tsx | 42 | export function isCursorMigrationAmbiguous(metadata: Metadata | undefined | null): boolean { | CODE |
| LOW | web/src/components/AssistantChat/claudeEffortOptions.ts | 8 | function normalizeClaudeComposerEffort(effort?: string | null): string | null { | CODE |
| LOW | web/src/components/AssistantChat/claudeEffortOptions.ts | 22 | export function getClaudeComposerEffortOptions(currentEffort?: string | null): ClaudeComposerEffortOption[] { | CODE |
| LOW | web/src/components/AssistantChat/modelOptions.ts | 22 | function cursorCatalogCoversCurrentModel(options: ModelOption[], currentModel: string): boolean { | CODE |
| LOW | web/src/components/AssistantChat/HappyComposer.tsx | 85 | export function ModelEffortSettingsSection(props: { | CODE |
| LOW | web/src/components/AssistantChat/claudeModelOptions.ts | 8 | function normalizeClaudeComposerModel(model?: string | null): string | null { | CODE |
| LOW | web/src/components/AssistantChat/claudeModelOptions.ts | 17 | export function getClaudeComposerModelOptions(currentModel?: string | null): ClaudeComposerModelOption[] { | CODE |
| LOW | web/src/components/AssistantChat/claudeModelOptions.ts | 41 | export function getNextClaudeComposerModel(currentModel?: string | null): string | null { | CODE |
| LOW | web/src/components/AssistantChat/HappyThread.tsx | 63 | export function shouldCancelInitialScrollSettling(intent: ScrollIntent): boolean { | CODE |
| LOW | web/src/components/AssistantChat/HappyThread.tsx | 93 | export async function locateOutlineTargetMessage(options: LocateOutlineTargetOptions): Promise<HTMLElement | null> { | CODE |
| LOW | web/src/components/AssistantChat/codexFastMode.ts | 38 | export function codexModelAdvertisesFastTier( | CODE |
| LOW | web/src/components/AssistantChat/codexFastMode.ts | 58 | export function getDisplayedCodexServiceTier(serviceTier?: string | null): 'standard' | 'fast' { | CODE |
| LOW | web/src/components/AssistantChat/StatusBar.tsx | 139 | export function shouldShowComposerStatusBar(agentFlavor: string | null | undefined): boolean { | CODE |
| 461 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | web/src/components/assistant-ui/markdown-text.tsx | 31 | // ── Plugin array ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-text.tsx | 78 | // ── URI scheme policy (inlined from url-scheme-policy.ts) ─────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-text.tsx | 173 | // ── URL sanitize transform (deny-only) ────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-text.tsx | 200 | // ── Allowed-schemes state (inlined from useAllowedSchemes.ts) ─────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-text.tsx | 294 | // ── UriConfirmContext — one dialog per markdown root ──────────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-text.tsx | 362 | // ── Components ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-a.test.tsx | 45 | // ── classifyScheme ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-a.test.tsx | 110 | // ── denyOnlyTransform ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-a.test.tsx | 130 | // ── useAllowedSchemes (inlined hook, tested via A component) ────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-a.test.tsx | 181 | // ── <A> component — click handler ──────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-a.test.tsx | 219 | // ── relative / no-scheme hrefs — regression guard ──────────────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-ui/markdown-a.test.tsx | 274 | // ── intra-tab cross-provider sync (schemeListeners emitter) ────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-non-https-autolink.test.ts | 24 | // ── Basic autolink ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-non-https-autolink.test.ts | 52 | // ── http/https NOT converted (GFM handles those) ───────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-non-https-autolink.test.ts | 64 | // ── Existing link nodes not touched ────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-non-https-autolink.test.ts | 76 | // ── Code blocks / inline code not touched ──────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-non-https-autolink.test.ts | 91 | // ── Trailing punctuation handling ──────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-non-https-autolink.test.ts | 142 | // ── Multiple URIs in one text node ─────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-non-https-autolink.test.ts | 155 | // ── Scheme-only / edge cases ───────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-repair-tables.test.ts | 29 | // ── String-level function ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-repair-tables.test.ts | 158 | // ── Plugin (parse + transform + stringify) ──────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-repair-tables.ts | 18 | // ── Helpers ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-repair-tables.ts | 81 | // ── String-level preprocessor ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/remark-repair-tables.ts | 144 | // ── Plugin ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | cli/src/agent/backends/acp/AcpMessageHandler.test.ts | 1737 | // ── tool_call: at least one must have been emitted ──────────────── | COMMENT |
| MEDIUM | cli/src/agent/backends/acp/AcpMessageHandler.test.ts | 1746 | // a typed object from the human-readable title. ─────────────── | COMMENT |
| MEDIUM | cli/src/agent/backends/acp/AcpMessageHandler.test.ts | 1771 | // ── reasoning: at least one prose thought must have surfaced ─────── | COMMENT |
| MEDIUM | cli/src/agent/backends/acp/AcpMessageHandler.test.ts | 1785 | // ── text messages: none should be a raw JSON blob ───────────────── | COMMENT |
| MEDIUM | cli/src/agent/backends/acp/AcpMessageHandler.test.ts | 1796 | // ── optional: assert text messages exist for complete captures ───── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/src/router.tsx | 641 | hasMore: messagesHasMore, | COMMENT |
| LOW | web/src/chat/reducer.ts | 121 | // Synthesize a tool card only for a *pending* permission that has no tool | COMMENT |
| LOW | web/src/components/SessionChat.tsx | 1141 | }, [pendingSchedule]) | COMMENT |
| LOW | web/src/components/AssistantChat/HappyComposer.tsx | 781 | || showFastModeSettings | COMMENT |
| LOW | web/src/components/assistant-ui/markdown-text.tsx | 201 | COMMENT | |
| LOW | web/src/components/assistant-ui/markdown-a.test.tsx | 81 | it('%6Aavascript: (encoded j) → deny', () => expect(classifyScheme('%6Aavascript:alert(1)')).toBe('deny')) | COMMENT |
| LOW | web/src/hooks/mutations/useSendMessage.ts | 181 | // would destroy the attachment preview AND leave the operator | COMMENT |
| LOW | cli/src/runner/run.ts | 101 | logger.debug('[RUNNER RUN] Starting runner process...'); | COMMENT |
| LOW | cli/src/runner/run.ts | 561 | // Set timeout for webhook. Default is 15s but can be raised via | COMMENT |
| LOW | cli/src/runner/run.ts | 701 | }); | COMMENT |
| LOW | cli/src/runner/run.ts | 721 | // correctly in all execution modes. | COMMENT |
| LOW | cli/src/runner/run.ts | 901 | Date.now() >= nextHandoffAttemptAt) { | COMMENT |
| LOW | cli/src/runner/run.ts | 921 | // the next heartbeat fires while we are still waiting. | COMMENT |
| LOW | cli/src/claude/utils/sdkToLogConverter.ts | 61 | export class SDKToLogConverter { | COMMENT |
| LOW | cli/src/claude/utils/sdkToLogConverter.ts | 301 | // already learned this model's real contextWindow from a previous result | COMMENT |
| LOW | cli/src/claude/utils/sdkToLogConverter.ts | 341 | COMMENT | |
| LOW | cli/src/codex/utils/permissionHandler.ts | 121 | COMMENT | |
| LOW | cli/src/agent/runnerLifecycle.ts | 21 | cleanupAndExit: (codeOverride?: number) => Promise<void> | COMMENT |
| LOW | cli/src/agent/backends/acp/AcpSdkBackend.ts | 341 | // The launcher serializes setModel between turns, but defensively wait for any | COMMENT |
| LOW | cli/src/pi/session.ts | 21 | // (local ↔ remote). keepAlive reads this so the reported mode does not | COMMENT |
| LOW | cli/src/opencode/opencodeRemoteLauncher.ts | 161 | } | COMMENT |
| LOW | e2e/scratchlist.spec.ts | 221 | COMMENT | |
| LOW | hub/src/cursor/acpVerifyProbe.ts | 221 | constructor(private readonly options: AcpProbeOptions = {}) { | COMMENT |
| LOW | hub/src/cursor/acpVerifyProbe.ts | 241 | // EEXIST against the caller's own lock. The caller is then | COMMENT |
| LOW | hub/src/cursor/acpVerifyProbe.ts | 261 | // Resolution order for the lookup home: | COMMENT |
| LOW | hub/src/cursor/acpVerifyProbe.ts | 361 | // ceiling we fall through to releaseLock and accept | COMMENT |
| LOW | hub/src/cursor/acpVerifyProbe.ts | 401 | } | COMMENT |
| LOW | hub/src/cursor/acpVerifyProbe.ts | 421 | this.lockHeld = true | COMMENT |
| LOW | hub/src/cursor/acpVerifyProbe.ts | 481 | } | COMMENT |
| LOW | hub/src/cursor/acpVerifyProbe.test.ts | 121 | expect(existsSync(join(lockDir(hapiHome), 'pid'))).toBe(true) | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 541 | const cwd = metadata.path | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 601 | ? metadata.homeDir.trim() | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 701 | } | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 741 | // we could process.kill(pid, 0), so we cannot directly observe | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 901 | } | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 1121 | COMMENT | |
| LOW | hub/src/sync/messageService.ts | 261 | if (!localId) { | COMMENT |
| LOW | hub/src/sync/syncEngine.ts | 521 | // banner has already disappeared but the chat hasn't re-rendered | COMMENT |
| LOW | hub/src/sync/syncEngine.ts | 541 | } | COMMENT |
| LOW | hub/src/sync/syncEngine.ts | 921 | // metadata write that flips cursorSessionProtocol to 'acp' (see | COMMENT |
| LOW | hub/src/socket/socketLimits.ts | 1 | // The largest generated image the CLI will serve inline. Must stay in sync with the CLI-side | COMMENT |
| LOW | hub/src/socket/handlers/cli/sessionHandlers.ts | 341 | emitAccessError('session', data.sid, sessionAccess.reason) | COMMENT |
| LOW | hub/src/store/sessions.ts | 1 | import type { Database } from 'bun:sqlite' | COMMENT |
| LOW | hub/src/store/sessions.ts | 21 | // - PARSE_IDENTITY_FIELDS: required by MetadataSchema in | COMMENT |
| LOW | hub/src/store/sessions.ts | 41 | // `cursorSessionId` must drop a stale prior protocol. Handled in | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cli/scripts/release-all.ts | 104 | // Step 1: Update package.json version | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 116 | // Step 2: Build all platform binaries (with embedded web assets) | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 124 | // Step 3: Prepare and publish platform packages | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 133 | // Step 4: Publish main package | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 144 | // Step 5: bun install to get complete lockfile | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 148 | // Step 6: Git commit + tag + push | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 300 | // Step 1: canonical-path fast path. Skip readdir entirely if we hit. | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 320 | // Step 2: scan every <wsh>/<cursorSessionId>/store.db. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cli/scripts/release-all.ts | 104 | // Step 1: Update package.json version | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 116 | // Step 2: Build all platform binaries (with embedded web assets) | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 124 | // Step 3: Prepare and publish platform packages | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 133 | // Step 4: Publish main package | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 144 | // Step 5: bun install to get complete lockfile | COMMENT |
| LOW⚡ | cli/scripts/release-all.ts | 148 | // Step 6: Git commit + tag + push | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 300 | // Step 1: canonical-path fast path. Skip readdir entirely if we hit. | COMMENT |
| LOW | hub/src/cursor/cursorLegacyMigrator.ts | 320 | // Step 2: scan every <wsh>/<cursorSessionId>/store.db. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/guide/voice-assistant.md | 32 | export ELEVENLABS_API_KEY="your-api-key" | CODE |
| HIGH | docs/guide/installation.md | 583 | export ELEVENLABS_API_KEY="your-api-key" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | cli/src/codex/runCodex.test.ts | 250 | const registration = harness.session.rpcHandlerManager.registerHandler.mock.calls.find( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …acp/__fixtures__/gemini-3-flash-preview-edit-file.json | 26 | "text": "## 📂 Topic: **Updating demo-write.txt**\n\n**Summary:**\nThe user requested to replace the first li | CODE |
| HIGH | …acp/__fixtures__/gemini-3-flash-preview-read-file.json | 26 | "text": "## 📂 Topic: **Initial Project Overview**\n\n**Summary:**\nI will start by reading the README.md fil | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | hub/src/sync/sessionCache.ts | 738 | // half-cleared archive state, so making it robust to a stale snapshot | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | shared/src/voicePromptLayers.ts | 151 | export const VOICE_PROVIDER_GUARDRAILS = `# Provider guardrails | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cli/src/cursor/utils/cursorLegacyEventConverter.test.ts | 200 | 'Lorem ipsum ... Questions skipped by the user, continue with the information you alread | CODE |