🙌 OpenHands: AI-Driven Development
This report summarizes scanner evidence for OpenHands/OpenHands, a TypeScript project with 92,314 GitHub stars. SynthScan examined 465,341 lines of code across 2438 source files, recording 1105 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 3.3 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 809 finding(s).
Are imports declared and package/API names verified? 87 finding(s).
Are wrappers, guards, and repeated structures necessary? 914 finding(s).
Which changes need focused human review? 1105 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1105 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | eslint.config.js | 57 | function createNoDirectAgentServerFetchRule() { | CODE |
| LOW | vitest.setup.ts | 125 | function installXhrGlobalsFallback(fallbacks: Record<string, unknown>) { | CODE |
| LOW | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 160 | async function seedBackendAnalyticsConsent(backendUrl: string, apiKey: string) { | CODE |
| LOW | tests/e2e/mock-llm/backends/mock-llm-auth-modes.spec.ts | 212 | async function openPublicAuthScreenFromFirstRun(page: Page) { | CODE |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 73 | export async function seedBackendAnalyticsConsent( | CODE |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 198 | export async function waitForNonUserMessageText( | CODE |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 238 | export async function waitForSuccessfulBashObservation( | CODE |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 288 | export async function waitForAgentMessageContaining( | CODE |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 405 | export async function ensureMockLLMProfileViaAPI( | CODE |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 532 | export async function ensureMockLLMAgentProfile( | CODE |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 601 | async function fillLlmProfileEditorAndSave( | CODE |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 820 | export async function resetToOpenHandsAgentViaUI(page: Page) { | CODE |
| LOW | tests/e2e/mock-llm/utils/folder-workspace-paths.ts | 12 | export function resolveFolderWorkspacePaths({ | CODE |
| LOW | tests/e2e/mock-llm/utils/folder-workspace-paths.ts | 35 | export function getFolderBrowserPathSegments(targetPath: string): string[] { | CODE |
| LOW | tests/e2e/mock-llm/scripts/test_mock_llm_server.py | 56 | def test_validation_ping_leaves_the_trajectory_intact(url, as_parts, with_system): | CODE |
| LOW | tests/e2e/mock-llm/scripts/test_mock_llm_server.py | 71 | def test_one_token_conversation_is_not_mistaken_for_validation(url): | CODE |
| LOW | …s/e2e/mock-llm/automations/mock-llm-automation.spec.ts | 91 | async function waitForCreatedAutomationId( | CODE |
| LOW | …s/e2e/mock-llm/automations/mock-llm-automation.spec.ts | 632 | function findRuntimeServicesContent( | CODE |
| LOW | …e/mock-llm/regressions/mock-llm-ui-regressions.spec.ts | 67 | function createAllPaginationEvents(prefix: string): PaginationEvent[] { | CODE |
| LOW | …e/mock-llm/regressions/mock-llm-ui-regressions.spec.ts | 231 | async function routePaginationConversation(page: Page) { | CODE |
| LOW | …e/mock-llm/regressions/mock-llm-ui-regressions.spec.ts | 341 | async function waitForScrollableConversation(page: Page) { | CODE |
| LOW | tests/e2e/mock-llm/skills/mock-llm-skills.spec.ts | 82 | async function removeWorkspaceFromServer( | CODE |
| LOW | tests/e2e/support/onboarding-helpers.ts | 15 | export async function routeOnboardingLlmCatalog(page: Page) { | CODE |
| LOW | tests/e2e/support/onboarding-helpers.ts | 122 | export async function waitForOnboardingBackendConnected(page: Page) { | CODE |
| LOW | tests/e2e/support/onboarding-helpers.ts | 132 | export async function waitForOnboardingLlmSettingsReady(page: Page) { | CODE |
| LOW | tests/e2e/support/onboarding-helpers.ts | 143 | export async function clickOnboardingStepButton(page: Page, testId: string) { | CODE |
| LOW | tests/e2e/support/onboarding-helpers.ts | 189 | export async function advanceOnboardingToLlmStep(page: Page) { | CODE |
| LOW | tests/e2e/live/real-agent-server-conversation.spec.ts | 56 | async function cleanupKnownConversations(request: APIRequestContext) { | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 73 | export async function routeBackendSessionApiKey(page: Page) { | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 198 | function buildLiveVerificationSettings( | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 279 | export async function guardAgainstPostHogRequests(page: Page) { | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 390 | export async function clickButtonByTestIdOrText( | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 455 | export async function waitForNonUserMessageText(page: Page, text: string) { | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 476 | export async function expandVisibleEventDetails(page: Page) { | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 537 | export function getOptionalConversationIdFromURL(page: Page) { | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 564 | function isSuccessfulBashObservation(event: unknown) { | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 613 | export async function waitForSuccessfulBashObservation( | CODE |
| LOW | tests/e2e/live/utils/agent-server-conversation.ts | 677 | export async function waitForCriticResultDisplay(page: Page) { | CODE |
| LOW | __tests__/root.test.tsx | 130 | function mockLockedCookieDeployment() { | CODE |
| LOW | __tests__/utils/scroll-fade-state.test.ts | 4 | function mockVerticalScrollMetrics( | CODE |
| LOW | __tests__/utils/automation-catalog.test.ts | 67 | function createInstalledAutomation(templateId?: string): Automation { | CODE |
| LOW | …settings/llm-profiles/llm-settings-local-view.test.tsx | 172 | function createMockLlmProfilesReturn( | CODE |
| LOW | …omponents/backends/cloud-organization-startup.test.tsx | 408 | function renderCloudSettingsConsumer() { | CODE |
| LOW | …s__/components/backends/manage-backends-modal.test.tsx | 117 | async function selectLocalRowFromSecondBackend( | CODE |
| LOW | …onents/features/mcp-page/custom-server-editor.test.tsx | 91 | function EditEditorOnceSettingsLoaded({ onClose }: { onClose: () => void }) { | CODE |
| LOW | …onents/features/mcp-page/custom-server-editor.test.tsx | 103 | function EditRemoteEditorOnceSettingsLoaded({ | CODE |
| LOW | …onents/features/mcp-page/custom-server-editor.test.tsx | 119 | function EditOAuthEditorOnceSettingsLoaded({ | CODE |
| LOW | …ion-panel/advanced-conversation-options-modal.test.tsx | 7 | function mockVerticalScrollMetrics( | CODE |
| LOW | …ponents/features/skills/extensions-navigation.test.tsx | 37 | function renderExtensionsNavigation( | CODE |
| LOW | …nts/features/conversation/secret-request-card.test.tsx | 31 | function PendingSecretRequestCards() { | CODE |
| LOW | …omponents/automations/recommended-automations.test.tsx | 206 | function continueGithubResponderLocally() { | CODE |
| LOW | …ests__/components/onboarding/onboarding-modal.test.tsx | 192 | async function waitForConfiguredBackendToBeSkipped() { | CODE |
| LOW | …ests__/components/onboarding/onboarding-modal.test.tsx | 229 | async function createSlideOffsetAssertion() { | CODE |
| LOW | …tests__/components/onboarding/onboarding-host.test.tsx | 63 | function seedUserAddedLocalBackend() { | CODE |
| LOW | __tests__/hooks/use-handle-plan-click.test.tsx | 116 | function makeTaggedPlannerConversation( | CODE |
| LOW | __tests__/hooks/use-task-list.test.ts | 8 | function createTaskTrackerObservation( | CODE |
| LOW | __tests__/hooks/use-click-outside-element.test.tsx | 12 | function ClickOutsideTestComponent({ | CODE |
| LOW | __tests__/hooks/use-load-older-events.test.tsx | 64 | function makeModelSwitchObservation( | CODE |
| LOW | __tests__/hooks/use-auto-resize.test.tsx | 56 | function installControlledAnimationFrames() { | CODE |
| LOW | __tests__/hooks/chat/use-slash-command.test.ts | 110 | function getSelectedCharacterOffset(element: HTMLElement) { | CODE |
| 645 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | playwright.mock-llm-docker.config.ts | 35 | // ── Docker image ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | playwright.mock-llm-docker.config.ts | 56 | // ── Session API key ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | playwright.mock-llm-docker.config.ts | 62 | // ── URLs ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | playwright.mock-llm-docker.config.ts | 91 | // ── Skill test support ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | playwright.mock-llm-docker.config.ts | 108 | // ── Folder-workspace test support ────────────────────────────────────── | COMMENT |
| MEDIUM | playwright.mock-llm-docker.config.ts | 119 | // ── ACP test support ────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | playwright.mock-llm.config.ts | 41 | // ── Session API key ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | playwright.mock-llm.config.ts | 47 | // ── State directory (isolated per test run) ──────────────────────────── | COMMENT |
| MEDIUM⚡ | playwright.mock-llm.config.ts | 55 | // ── URLs ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/entrypoint.sh | 2 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docker/entrypoint.sh | 71 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docker/entrypoint.sh | 467 | # ── 1. Start Agent Server ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/entrypoint.sh | 484 | # ── 2. Start Automation Server ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/entrypoint.sh | 531 | # ── 3. Wait for backends to be ready ───────────────────────────────────────── | COMMENT |
| MEDIUM | docker/entrypoint.sh | 552 | # ── 4. Start static server (frontend + proxy) ──────────────────────────────── | COMMENT |
| MEDIUM | docker/entrypoint.sh | 610 | # ── 5. (Optional) Public-mode static server ───────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/mock-llm/settings/mock-llm-acp-agent.spec.ts | 94 | // ── Step 1: Configure ACP agent through the Settings → Agent UI ───── | COMMENT |
| MEDIUM | tests/e2e/mock-llm/settings/mock-llm-acp-agent.spec.ts | 170 | // ── Step 2: Reload and verify the UI reflects saved ACP config ────── | COMMENT |
| MEDIUM | tests/e2e/mock-llm/settings/mock-llm-acp-agent.spec.ts | 195 | // ── Step 3: Start an ACP conversation from the home page ──────────── | COMMENT |
| MEDIUM | tests/e2e/mock-llm/settings/mock-llm-acp-agent.spec.ts | 331 | // ── Step 4: Resume the ACP conversation from the sidebar ──────────── | COMMENT |
| MEDIUM | …m/settings/mock-llm-cloud-providers-pagination.spec.ts | 78 | // ── Seed: cloud backend in localStorage BEFORE the app boots ─────── | COMMENT |
| MEDIUM | …m/settings/mock-llm-cloud-providers-pagination.spec.ts | 127 | // ── Mock cloud API ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …m/settings/mock-llm-cloud-providers-pagination.spec.ts | 304 | // ── Drive the UI ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/mock-llm/settings/mock-llm-profile-management.spec.ts | 75 | // ═══════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | …/mock-llm/settings/mock-llm-profile-management.spec.ts | 77 | // ═══════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | …/mock-llm/settings/mock-llm-profile-management.spec.ts | 234 | // ═══════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | …/mock-llm/settings/mock-llm-profile-management.spec.ts | 236 | // ═══════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | …/mock-llm/settings/mock-llm-profile-management.spec.ts | 376 | // ═══════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | …/mock-llm/settings/mock-llm-profile-management.spec.ts | 378 | // ═══════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | …e2e/mock-llm/settings/mock-llm-acp-auth-banner.spec.ts | 151 | // ── Select ACP → Claude Code ───────────────────────────────────────── | COMMENT |
| MEDIUM | …ts/e2e/mock-llm/home/mock-llm-folder-workspace.spec.ts | 105 | // ── Step 1: Browse to a folder and add it as a workspace ──────────── | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 34 | // ── Paths ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 41 | // ── Port ranges (high ports unlikely to collide with other tests) ────── | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 49 | // ── Helpers ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 320 | // ═══════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 322 | // ═══════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 326 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 328 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 395 | // ── 4. Open browser to the frontend-only instance ───────────────── | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 405 | // ── 5. Add the backend-only instance via onboarding ─────────────── | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 413 | // ── 6. Reload to pick up the new backend ────────────────────────── | COMMENT |
| MEDIUM⚡ | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 420 | // ── 7. Verify the app loads ─────────────────────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 354 | // ── 1. Start backend-only instance ──────────────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 365 | // ── 2. Start frontend-only instance ─────────────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 376 | // ── 3. Wait for both to become ready (in parallel) ──────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 449 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 451 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 475 | // ── 1. Spawn all three instances concurrently ───────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 503 | // ── 2. Wait for all three to become ready ───────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 527 | // ── 3. Verify both backends are independently reachable ─────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 539 | // ── 4. Open browser to the frontend-only instance ───────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 549 | // ── 5. Add Backend A through onboarding ────────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 563 | // ── 6. Add Backend B via the dropdown menu ──────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 600 | // ── 7. Switch to Backend B via the dropdown ─────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 628 | // ── 8. Verify the app works after switching ─────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 637 | // ── 9. Verify both backends appear in the manage modal ──────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 651 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 653 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 678 | // ── 1. Spawn both backends and the frontend ─────────────────────── | COMMENT |
| MEDIUM | …s/e2e/mock-llm/backends/mock-llm-cross-connect.spec.ts | 734 | // ── 2. Seed a conversation that exists ONLY on backend A ────────── | COMMENT |
| 148 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | playwright.mock-llm-docker.config.ts | 181 | url: MOCK_LLM_URL, | COMMENT |
| LOW | playwright.config.ts | 61 | // use: { ...devices['Pixel 5'] }, | COMMENT |
| LOW | eslint.config.js | 1 | // Flat ESLint config (ESLint 9+). | COMMENT |
| LOW | eslint.config.js | 201 | ...reactPlugin.configs["jsx-runtime"].rules, | COMMENT |
| LOW | eslint.config.js | 281 | // agent-server `/api/...` path bypasses the typed access layer, so it is | COMMENT |
| LOW | eslint.config.js | 321 | COMMENT | |
| LOW | eslint.config.js | 401 | "react/react-in-jsx-scope": "off", | COMMENT |
| LOW | playwright.mock-llm.config.ts | 121 | timeout: 30_000, | COMMENT |
| LOW | playwright.mock-llm.config.ts | 161 | // GET /api/automation/v1 returns 200 (empty list) without auth | COMMENT |
| LOW | vitest.setup.ts | 61 | vi.stubGlobal("requestAnimationFrame", (callback: FrameRequestCallback) => | COMMENT |
| LOW | vitest.setup.ts | 81 | // `XMLHttpRequestUpload` equivalent). Vitest reports that as an | COMMENT |
| LOW | vitest.setup.ts | 221 | }); | COMMENT |
| LOW | tools/canvas_ui_tool.py | 141 | ] | COMMENT |
| LOW | docker/entrypoint.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | docker/entrypoint.sh | 21 | # not EXPOSE it and the editor is reached through | COMMENT |
| LOW | docker/entrypoint.sh | 41 | # in with at start (needs MARS_WEB=1) | COMMENT |
| LOW | docker/entrypoint.sh | 61 | # Without this the automation backend may fall back to | COMMENT |
| LOW | docker/entrypoint.sh | 81 | . /opt/agent-canvas/defaults.env | COMMENT |
| LOW | docker/entrypoint.sh | 121 | VSCODE_BASE_PATH="$(normalize_base_path "$VSCODE_BASE_PATH")" | COMMENT |
| LOW | docker/entrypoint.sh | 241 | export AUTOMATION_AGENT_SERVER_API_KEY="${AUTOMATION_AGENT_SERVER_API_KEY:-${EFFECTIVE_SESSION_KEY}}" | COMMENT |
| LOW | docker/entrypoint.sh | 381 | COMMENT | |
| LOW | docker/entrypoint.sh | 401 | # so Canvas and the agent-server see the same catalog and nothing is cloned. | COMMENT |
| LOW | docker/entrypoint.sh | 601 | --route "/docs=http://127.0.0.1:${AGENT_SERVER_PORT}" \ | COMMENT |
| LOW | docker/entrypoint.sh | 621 | # | COMMENT |
| LOW | docker/entrypoint.sh | 661 | PIDS+=($!) | COMMENT |
| LOW | …m/settings/mock-llm-cloud-providers-pagination.spec.ts | 201 | } | COMMENT |
| LOW | …m/settings/mock-llm-cloud-providers-pagination.spec.ts | 341 | // the virtualized listbox render so every option (page-1 + page-2) is | COMMENT |
| LOW | …e2e/mock-llm/settings/mock-llm-acp-auth-banner.spec.ts | 121 | test("Claude credential in the store surfaces a 'configured' banner, never 'signed in'", async ({ | COMMENT |
| LOW | tests/e2e/mock-llm/backends/mock-llm-auth-modes.spec.ts | 41 | COMMENT | |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 481 | try { | COMMENT |
| LOW | tests/e2e/mock-llm/utils/mock-llm-helpers.ts | 741 | // updates reactively — `useActivateLlmProfile` invalidates the profiles query | COMMENT |
| LOW | …e/mock-llm/conversations/mock-llm-conversation.spec.ts | 301 | await dismissAnalyticsModal(page); | COMMENT |
| LOW | …e/mock-llm/conversations/mock-llm-image-upload.spec.ts | 81 | // Use a vision-capable model name so litellm does not strip image_url | COMMENT |
| LOW | …s/e2e/mock-llm/automations/mock-llm-automation.spec.ts | 381 | COMMENT | |
| LOW | …s/e2e/mock-llm/automations/mock-llm-automation.spec.ts | 441 | // openhands-automation skill, triggering this internal call. | COMMENT |
| LOW | …s/e2e/mock-llm/automations/mock-llm-automation.spec.ts | 481 | COMMENT | |
| LOW | __tests__/root.test.tsx | 921 | }); | COMMENT |
| LOW | __tests__/components/chat-message.test.tsx | 41 | // "Cannot update a component (`ChatMessage`) while rendering a different | COMMENT |
| LOW | …omponents/features/markdown/markdown-renderer.test.tsx | 81 | } | COMMENT |
| LOW | …ests__/components/onboarding/onboarding-modal.test.tsx | 481 | COMMENT | |
| LOW | __tests__/hooks/use-auto-refresh-files-on-edit.test.tsx | 261 | countAfterInitial + 1, | COMMENT |
| LOW | __tests__/scripts/docker-vscode-route-sync.test.ts | 1 | // @vitest-environment node | COMMENT |
| LOW | __tests__/scripts/docker-vscode-route-sync.test.ts | 161 | // --auth-required only decides whether the session key is injected into | COMMENT |
| LOW | __tests__/scripts/vscode-base-path-opt-in.test.ts | 1 | // @vitest-environment node | COMMENT |
| LOW | __tests__/scripts/vscode-base-path-opt-in.test.ts | 161 | // | COMMENT |
| LOW | examples/acp-docker/docker-compose.yml | 1 | # Containerized ACP agent-server for Agent Canvas (agent-canvas#1014). | COMMENT |
| LOW | examples/acp-docker/docker-compose.yml | 21 | agent-server: | COMMENT |
| LOW | examples/acp-docker/docker-compose.yml | 41 | # container restarts and (b) enable the encrypted-settings path used by | COMMENT |
| LOW | scripts/vercel-install.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/release.yml | 1 | name: release | COMMENT |
| LOW | .github/workflows/verify-skill-isolation.yml | 1 | --- | COMMENT |
| LOW | .github/workflows/bump-chart.yml | 1 | # Opens a PR in OpenHands/OpenHands-Cloud pointing the agent-canvas chart's | COMMENT |
| LOW | .github/workflows/desktop-macos.yml | 1 | name: Desktop (macOS) | COMMENT |
| LOW | .github/workflows/desktop-linux.yml | 1 | name: Desktop (Linux) | COMMENT |
| LOW | helm/agent-canvas/values.yaml | 1 | # Default values for agent-canvas. | COMMENT |
| LOW | helm/agent-canvas/values.yaml | 21 | # - name: ghcr-pull-secret | COMMENT |
| LOW | helm/agent-canvas/values.yaml | 41 | serviceAccount: | COMMENT |
| LOW | helm/agent-canvas/values.yaml | 81 | - host: agent-canvas.local | COMMENT |
| LOW | helm/agent-canvas/values.yaml | 101 | # * $HOME/workspace — the agent's default working directory: cloned | COMMENT |
| LOW | helm/agent-canvas/values.yaml | 141 | # Extra environment variables to pass through to the container. | COMMENT |
| 34 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | eslint.config.js | 233 | "placeholder", | CODE |
| LOW | tests/e2e/mock-llm/utils/skill-test-helpers.ts | 102 | execSync('git config user.email "test@test.com"', opts); | CODE |
| LOW | .agents/skills/verify-openhands/references/mapping.md | 115 | `control-openhands browser fill 'testid=add-secret-form >> testid=value-input' dummy-value`, | CODE |
| LOW | …openhands/references/feature-map/F06-agent-activity.md | 184 | - Known issue [#17559](https://github.com/OpenHands/OpenHands/issues/17559) (`F06.load-older-history`): History paginati | CODE |
| LOW | …erify-openhands/references/feature-map/F24-git-sync.md | 67 | - **Encryption key (`F24.encryption`).** Start with plaintext exported by the preceding sync bullets. Run `control-openh | CODE |
| LOW | …erify-openhands/references/feature-map/F24-git-sync.md | 68 | - **Access token (`F24.token`).** `control-openhands browser attr 'testid=git-sync-token-input' type` is `password` and | CODE |
| LOW | …fy-openhands/references/feature-map/F17-mcp-servers.md | 94 | - **Custom remote server (`F17.custom-add-remote`).** With the Streamable HTTP fixture from Preconditions running, run ` | CODE |
| LOW | …nds/references/feature-map/F16-application-settings.md | 70 | - **Voice input endpoint (`F16.voice-endpoint`).** Run `control-openhands browser fill 'testid=transcription-base-url-in | CODE |
| LOW | …openhands/references/feature-map/F13-agent-profiles.md | 73 | - **Credentials (`F13.acp-credentials`).** In a new ACP editor with preset `Claude Code`, `control-openhands browser tes | CODE |
| LOW | …y-openhands/references/feature-map/F10-llm-profiles.md | 88 | - **Refused save shows the server's reason (`F10.edit`).** Arrange a disposable dummy-key loopback profile (`QA_DUMMY=sk | CODE |
| LOW | …y-openhands/references/feature-map/F10-llm-profiles.md | 89 | - **Basic re-save keeps a hidden Base URL (`F10.basic-save-keeps-base-url`).** `QA_adv` carries `base_url` `https://api. | CODE |
| LOW | …verify-openhands/references/feature-map/F14-secrets.md | 43 | - **Create (`F14.create`).** Run `control-openhands browser click 'testid=add-secret-button'`, `control-openhands browse | CODE |
| LOW | …verify-openhands/references/feature-map/F14-secrets.md | 44 | - **Reveal the value (`F14.value-reveal`).** Run `control-openhands browser click 'testid=add-secret-button'` and `contr | CODE |
| LOW | …erify-openhands/references/feature-map/F05-composer.md | 205 | - Known issue [#17271](https://github.com/OpenHands/OpenHands/issues/17271) (`F05.context-window-meter`): New chat retai | CODE |
| LOW | …erify-openhands/references/feature-map/F05-composer.md | 207 | - Known issue [#16851](https://github.com/OpenHands/OpenHands/issues/16851) (`F05.profile-identity`): wrong model is dis | CODE |
| LOW⚡ | …nds/references/feature-map/F11-provider-connections.md | 61 | - **Server error (`F11.create-error`).** Run `control-openhands browser click 'testid=add-provider-connection'`, `contro | CODE |
| LOW⚡ | …nds/references/feature-map/F11-provider-connections.md | 62 | - **Second connection.** Create `QA_spare` the same way with `dummy-key-2` as key and `control-openhands browser fill 't | CODE |
| LOW⚡ | …nds/references/feature-map/F11-provider-connections.md | 72 | - **Long name and provider change (`F11.long-name`, `F11.edit`).** Create a connection named `"QA_long$(printf 'x%.0s' $ | CODE |
| LOW⚡ | …nds/references/feature-map/F11-provider-connections.md | 74 | - **Unlisted provider (`F11.edit-unlisted-provider`).** Arrange (not proof) `control-openhands api POST /api/llm/provide | CODE |
| LOW⚡ | …nds/references/feature-map/F11-provider-connections.md | 79 | - **Redacted key is rejected (`F11.create-validation`, `F11.edit`).** Add `QA_SENTINEL`, choose OpenAI (`browser click ' | CODE |
| LOW | …nhands/references/backfills/2026-10-16-main-refresh.md | 159 | | [OpenHands/OpenHands#17559](https://github.com/OpenHands/OpenHands/issues/17559) | mapped | blocked | [F06.load-older- | CODE |
| LOW | …nhands/references/backfills/2026-10-16-main-refresh.md | 179 | | [OpenHands/OpenHands#17271](https://github.com/OpenHands/OpenHands/issues/17271) | mapped | blocked | [F05.context-win | CODE |
| LOW | …nhands/references/backfills/2026-10-16-main-refresh.md | 220 | | [OpenHands/OpenHands#16851](https://github.com/OpenHands/OpenHands/issues/16851) | mapped | blocked | [F05.profile-ide | CODE |
| LOW | …openhands/references/backfills/2026-10-12-open-bugs.md | 130 | | [OpenHands/OpenHands#17559](https://github.com/OpenHands/OpenHands/issues/17559) | mapped | [F06.load-older-history](. | CODE |
| LOW | …openhands/references/backfills/2026-10-12-open-bugs.md | 151 | | [OpenHands/OpenHands#17271](https://github.com/OpenHands/OpenHands/issues/17271) | mapped | [F05.context-window-meter] | CODE |
| LOW | …openhands/references/backfills/2026-10-12-open-bugs.md | 193 | | [OpenHands/OpenHands#16851](https://github.com/OpenHands/OpenHands/issues/16851) | mapped | [F05.profile-identity](../ | CODE |
| LOW | …enhands/references/backfills/2026-10-12-open-bugs.json | 1176 | "backfill-18309-settings-rechecks/evidence/F10.edit/17806-dummy-key-preserved.png", | CODE |
| LOW | …enhands/references/backfills/2026-10-12-open-bugs.json | 1798 | "reason": "A real persisted history page boundary splitting an action/observation or ACP started/completed pair; d | CODE |
| LOW | …enhands/references/backfills/2026-10-12-open-bugs.json | 2239 | "reason": "A completed conversation with nonzero token usage before New Chat; a dummy-key run supplies no genuine | CODE |
| LOW | …enhands/references/backfills/2026-10-12-open-bugs.json | 3345 | "reason": "The original conversation/model-switch history and usage record showing Opus with a Fable selector; a d | CODE |
| LOW | …/references/backfills/2026-10-12-open-bugs-checks.json | 636 | "backfill-18309-settings-rechecks/evidence/F10.edit/17806-dummy-key-preserved.png" | CODE |
| LOW | …/references/backfills/2026-10-12-open-bugs-checks.json | 670 | "backfill-18309-settings-rechecks/evidence/F10.edit/17806-dummy-key-preserved.png", | CODE |
| LOW | …/references/backfills/2026-10-12-open-bugs-checks.json | 673 | "note": "Corrected Basic trial used owned default OpenAI loopback endpoints; one earlier rejected dummy-key provid | CODE |
| LOW | __tests__/components/ui/dropdown.test.tsx | 343 | expect(input).toHaveAttribute("placeholder", "Select an option"); | CODE |
| LOW | __tests__/components/settings/settings-input.test.tsx | 56 | "placeholder", | CODE |
| LOW | …ents/settings/llm-profiles/profile-name-input.test.tsx | 177 | "placeholder", | CODE |
| LOW | …ents/settings/llm-profiles/profile-name-input.test.tsx | 192 | "placeholder", | CODE |
| LOW | …tests__/components/backends/add-backend-modal.test.tsx | 58 | data: { user_consents_to_analytics: true, email: "user@example.com" }, | CODE |
| LOW | __tests__/components/backends/backend-selector.test.tsx | 247 | { id: "org-2", name: "Acme Inc" }, | CODE |
| LOW | __tests__/components/backends/backend-selector.test.tsx | 301 | { id: "org-acme", name: "Acme Inc" }, | CODE |
| LOW | __tests__/components/backends/backend-selector.test.tsx | 351 | { id: "org-acme", name: "Acme Inc" }, | CODE |
| LOW | __tests__/components/backends/backend-selector.test.tsx | 425 | "placeholder", | CODE |
| LOW | __tests__/components/backends/backend-selector.test.tsx | 446 | { id: "org-2", name: "Acme Inc" }, | CODE |
| LOW | __tests__/components/backends/backend-selector.test.tsx | 490 | { id: "org-2", name: "Acme Inc" }, | CODE |
| LOW | __tests__/components/backends/backend-selector.test.tsx | 905 | items: [{ id: "org-acme", name: "Acme Inc" }], | CODE |
| LOW | …s__/components/backends/manage-backends-modal.test.tsx | 75 | data: { user_consents_to_analytics: true, email: "user@example.com" }, | CODE |
| LOW | …s__/components/backends/manage-backends-modal.test.tsx | 555 | { id: "org-acme", name: "Acme Inc" }, | CODE |
| LOW | …s__/components/backends/manage-backends-modal.test.tsx | 587 | expect(await screen.findByText("Acme Inc")).toBeInTheDocument(); | CODE |
| LOW | …sts__/components/manifest/manifest-form-field.test.tsx | 144 | "placeholder", | CODE |
| LOW | …onents/features/home/workspace-selection-form.test.tsx | 348 | "placeholder", | CODE |
| LOW | …_/components/features/home/provider-selection.test.tsx | 87 | expect(input).toHaveAttribute("placeholder", "Select provider"); | CODE |
| LOW | …_/components/features/home/provider-selection.test.tsx | 289 | "placeholder", | CODE |
| LOW | …__/components/features/home/git-repo-dropdown.test.tsx | 171 | "placeholder", | CODE |
| LOW | …__/components/features/home/git-repo-dropdown.test.tsx | 209 | expect(input).toHaveAttribute("placeholder", "Choose a repository"); | CODE |
| LOW | …onents/features/mcp-page/install-server-modal.test.tsx | 1442 | "placeholder", | CODE |
| LOW | …s__/components/modals/settings/model-selector.test.tsx | 154 | expect(providerInput.getAttribute("placeholder") ?? "").toBe(""); | CODE |
| LOW | …s__/components/modals/settings/model-selector.test.tsx | 155 | expect(modelInput.getAttribute("placeholder") ?? "").toBe(""); | CODE |
| LOW | …components/automations/automation-setup-panel.test.tsx | 2643 | "placeholder", | CODE |
| LOW | __tests__/hooks/use-tracking.test.ts | 46 | data: { email: "user@example.com", user_consents_to_analytics: true }, | CODE |
| LOW | __tests__/hooks/use-tracking.test.ts | 449 | data: { email: "user@example.com", user_consents_to_analytics: false }, | CODE |
| 25 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .agents/skills/release.md | 33 | ## Step 1: Find the Release PR | COMMENT |
| LOW | .agents/skills/release.md | 47 | ## Step 2: Review It | COMMENT |
| LOW | .agents/skills/release.md | 57 | ## Step 3: Cut the Release | COMMENT |
| LOW | .agents/skills/release.md | 69 | ## Step 4: Watch the Pipeline | COMMENT |
| LOW | .agents/skills/release.md | 81 | ## Step 5: Verify the Release | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/e2e/mock-llm/scripts/mock-llm-server.py | 478 | except KeyboardInterrupt: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/DefenseClaw.md | 3 | [DefenseClaw](https://github.com/cisco-ai-defense/defenseclaw) is a security governance layer for agentic AI runtimes — | CODE |
| MEDIUM | …exts/conversation-websocket-provider.behavior.test.tsx | 1347 | // repo/branch/provider scaffold; optional fields it doesn't own | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …s/evidence/2026-10-17/final/controller-live-proof.json | 37 | "product_outcome": "Accepted parameter edits absent from actual create, separately filed as fork #127; harness proje | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/scripts/check_pr_description.py | 24 | CODE | |
| LOW | .github/scripts/update_debian_snapshot.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | public/mockServiceWorker.js | 124 | async function handleRequest(event, requestId, requestInterceptedAt) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/scripts/update_debian_snapshot.py | 35 | CODE |