See interfaces like a human. E2E testing in natural language.
This report summarizes scanner evidence for web-infra-dev/midscene, a TypeScript project with 15,450 GitHub stars. SynthScan examined 470,530 lines of code across 2309 source files, recording 774 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 2.1 (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? 719 finding(s).
Are imports declared and package/API names verified? 30 finding(s).
Are wrappers, guards, and repeated structures necessary? 617 finding(s).
Which changes need focused human review? 774 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 774 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 | packages/playground-app/src/SessionSetupPanel.tsx | 14 | function getPlatformSelectorFieldKey( | CODE |
| LOW | packages/playground-app/src/SessionSetupPanel.tsx | 20 | export function getPlatformSelectorOptions( | CODE |
| LOW | packages/playground-app/src/session-setup.ts | 8 | export function resolveAutoCreateSessionInput( | CODE |
| LOW | packages/playground-app/src/DeviceInteractionLayer.tsx | 144 | function hasHostSelectionOutsideOverlay(overlay: HTMLElement | null): boolean { | CODE |
| LOW | packages/playground-app/src/session-state.ts | 40 | export function buildSessionInitialValues( | CODE |
| LOW | packages/playground-app/src/scrcpy-preview.ts | 30 | export function isScrcpyPreviewStatusEvent( | CODE |
| LOW | packages/playground-app/src/scrcpy-preview.ts | 41 | export function isScrcpyPreviewErrorEvent( | CODE |
| LOW⚡ | packages/playground-app/src/scrcpy-preview.ts | 76 | export function getDefaultScrcpyWaitingStatusText(): string { | CODE |
| LOW⚡ | packages/playground-app/src/scrcpy-preview.ts | 80 | export function getScrcpyDecoderStatusText(): string { | CODE |
| LOW⚡ | packages/playground-app/src/scrcpy-preview.ts | 84 | export function getScrcpyPreviewStatusText( | CODE |
| LOW | packages/playground-app/src/scrcpy-preview.ts | 104 | export function getScrcpyMetadataTimeoutMessage( | CODE |
| LOW | packages/playground-app/src/manual-interaction.ts | 3 | export function buildManualDragInteractPayload( | CODE |
| LOW | packages/playground-app/src/manual-interaction.ts | 27 | export function buildManualScrollInteractPayload( | CODE |
| LOW | packages/playground-app/src/runtime-info.ts | 32 | export function normalizeRuntimeDeviceType( | CODE |
| LOW | packages/playground-app/src/runtime-info.ts | 70 | export function filterValidExecutionUxHints( | CODE |
| LOW | packages/playground-app/src/runtime-info.ts | 79 | export function resolvePreviewConnectionInfo( | CODE |
| LOW | …yground-app/src/panels/PlaygroundConversationPanel.tsx | 38 | export function PlaygroundConversationPanel({ | CODE |
| LOW | packages/playground-app/src/controller/ai-config.ts | 9 | export function serializePlaygroundAiConfig( | CODE |
| LOW | …ayground-app/src/controller/usePlaygroundController.ts | 37 | function getPlatformSelectorFieldKey( | CODE |
| LOW | packages/playground-app/src/controller/selectors.ts | 51 | export function buildConversationBranding( | CODE |
| LOW | …s/playground-app/src/controller/create-agent-error.tsx | 33 | export function getPuppeteerChromeInstallCommand(): string { | CODE |
| LOW | …s/playground-app/src/controller/create-agent-error.tsx | 87 | export function isPuppeteerChromeMissingError(error: unknown): boolean { | CODE |
| LOW | …s/playground-app/src/controller/create-agent-error.tsx | 220 | export function getCreateAgentErrorNotification( | CODE |
| LOW | packages/playground-app/src/controller/auto-create.ts | 24 | export function resolveAutoCreateDecision({ | CODE |
| LOW | packages/playground-app/src/controller/auto-create.ts | 44 | export function shouldResetAutoCreateBlock(options?: { | CODE |
| LOW | packages/core/tests/unit-test/model-adapter.test.ts | 16 | function createTestPlannerDefinition(): CustomPlanningDefinition<null> { | CODE |
| LOW | …es/core/tests/unit-test/agent-describe-element.test.ts | 38 | function createElementDescriberRuntime(agent: Agent): ElementDescriberRuntime { | CODE |
| LOW | packages/core/tests/unit-test/grounding.test.ts | 8 | function adaptElementLocateResultToRect( | CODE |
| LOW | …ts/unit-test/report-generator-reference-images.test.ts | 29 | function createPlanningExecutionWithReferenceImage(options: { | CODE |
| LOW | …ts/unit-test/report-generator-reference-images.test.ts | 81 | function referenceImageRefsFromDump( | CODE |
| LOW | …ts/unit-test/report-generator-reference-images.test.ts | 89 | function firstPlanningReferenceImageUrl(execution: ExecutionDump): string { | CODE |
| LOW | …/tests/unit-test/task-executor-custom-planning.test.ts | 60 | function createCustomPlanningModel(plannedActions: any[] = []): ModelRuntime { | CODE |
| LOW | …es/core/tests/unit-test/player-action-dispatch.test.ts | 22 | function createPlayerWithActionSpace(actionSpace: any[]) { | CODE |
| LOW | …tests/unit-test/model-adapter/auto-glm/actions.test.ts | 27 | function transformAutoGLMActionForTest( | CODE |
| LOW | …/unit-test/model-adapter/ui-tars/locate-result.test.ts | 10 | function getUiTarsLocateResultCodec() { | CODE |
| LOW | …e/tests/unit-test/test-helpers/agent-report-manager.ts | 7 | export function installAgentReportManager(agent: Agent): void { | CODE |
| LOW | …kages/core/tests/unit-test/test-helpers/report-html.ts | 42 | export function extractGroupedDumpScripts(html: string): ScriptTag[] { | CODE |
| LOW | …/core/tests/unit-test/test-helpers/report-generator.ts | 53 | export function buildIncrementalExecution( | CODE |
| LOW | …/core/tests/unit-test/test-helpers/report-generator.ts | 89 | export async function createPatternedPngFixture() { | CODE |
| LOW | packages/core/src/report.ts | 95 | function readDeclaredScreenshotMode( | CODE |
| LOW | packages/core/src/report.ts | 1168 | function externalizeImagesInExecution( | CODE |
| LOW | packages/core/src/report.ts | 1223 | export function splitReportHtmlByExecution( | CODE |
| LOW | packages/core/src/report-markdown.ts | 543 | function screenshotsMarkdownSection( | CODE |
| LOW | packages/core/src/element-describer.ts | 332 | export async function verifyElementDescriptionAtPoint( | CODE |
| LOW | packages/core/src/common.ts | 9 | export function findActionInActionSpaceOrThrow( | CODE |
| LOW | packages/core/src/common.ts | 218 | export function validateRequiredLocateFields( | CODE |
| LOW | packages/core/src/utils.ts | 127 | export function insertContentBeforeClosingHtml( | CODE |
| LOW | packages/core/src/utils.ts | 142 | export function insertScriptBeforeClosingHtml( | CODE |
| LOW | packages/core/src/report-cli.ts | 70 | function writeAttachmentFromReport( | CODE |
| LOW | packages/core/src/report-cli.ts | 252 | function deriveReportAttributesFromHtml( | CODE |
| LOW | packages/core/src/report-generator.ts | 111 | export function assertReportGenerationOptions(opts: { | CODE |
| LOW | packages/core/src/dump/html-utils.ts | 52 | function collectUsageModelsForAgent(report: IReportActionDump): string { | CODE |
| LOW | packages/core/src/dump/html-utils.ts | 80 | export function generateAgentReportComment(report: IReportActionDump): string { | CODE |
| LOW | packages/core/src/dump/html-utils.ts | 113 | export function generateReportArtifactScriptTag(path: string): string { | CODE |
| LOW | packages/core/src/dump/html-utils.ts | 125 | function reportArtifactPathExtractor(filePath: string) { | CODE |
| LOW | packages/core/src/dump/html-utils.ts | 151 | export function extractReportArtifactPathSync( | CODE |
| LOW | packages/core/src/dump/html-utils.ts | 164 | export async function extractReportArtifactPathAsync( | CODE |
| LOW | packages/core/src/dump/html-utils.ts | 202 | export function generateTestRunReportScriptTag( | CODE |
| LOW | packages/core/src/dump/html-utils.ts | 217 | export function extractTestRunReportDumpSync( | CODE |
| LOW | packages/core/src/dump/html-utils.ts | 459 | export function extractLastDumpScriptSync(filePath: string): string { | CODE |
| 532 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 85 | // Step 1: expand 100px each side -> {left: 400, top: 400, width: 250, height: 250} | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 87 | // Step 2: scale to 400x400 from center (525, 525) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 119 | // Step 1: left can only expand 10px (10-100 clamped to 0) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 122 | // Step 2: center (80, 525), scale factor = 2.0, new size = 320x500 | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 137 | // Step 1: right can only expand 10px (original right 990, desired 1090, clamped to 1000) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 140 | // Step 2: center (920, 525), scale factor = 2.0, new size = 320x500 | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 155 | // Step 1: top can only expand 10px (10-100 clamped to 0) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 158 | // Step 2: center (525, 80), scale factor = 2.0, new size = 500x320 | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 173 | // Step 1: bottom can only expand 10px (original bottom 990, desired 1090, clamped to 1000) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 176 | // Step 2: center (525, 920), scale factor = 2.0, new size = 500x320 | COMMENT |
| LOW | packages/core/tests/unit-test/search-area.test.ts | 103 | // Step 1: expand 100px each side -> {left: 400, top: 400, width: 500, height: 500} | COMMENT |
| LOW | packages/core/tests/unit-test/search-area.test.ts | 232 | // Step 1: {left: 100, top: 100, width: 800, height: 800} | COMMENT |
| LOW | packages/core/tests/unit-test/search-area.test.ts | 249 | // Step 1: {left: 400, top: 400, width: 400, height: 400} | COMMENT |
| LOW | packages/core/tests/unit-test/search-area.test.ts | 265 | // Step 1: {left: 200, top: 400, width: 400, height: 220} | COMMENT |
| LOW | packages/core/tests/unit-test/search-area.test.ts | 281 | // Step 1: {left: 400, top: 200, width: 220, height: 400} | COMMENT |
| LOW⚡ | …kages/core/tests/unit-test/merge-browser-parse.test.ts | 226 | // Step 1: extract (what mergeReports does) | COMMENT |
| LOW⚡ | …kages/core/tests/unit-test/merge-browser-parse.test.ts | 229 | // Step 2: escape again (what reportHTMLContent does) | COMMENT |
| LOW⚡ | …kages/core/tests/unit-test/merge-browser-parse.test.ts | 232 | // Step 3: unescape (what browser does via antiEscapeScriptTag) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/prompt/prompt.test.ts | 321 | expect(prompt).toContain('## Step 1: Observe (related tags: <planning>)'); | CODE |
| LOW⚡ | packages/core/tests/unit-test/prompt/prompt.test.ts | 323 | '## Step 1: Observe and Plan (related tags: <planning>, <update-plan-content>, <mark-sub-goal-done>)', | CODE |
| LOW | packages/core/tests/unit-test/prompt/prompt.test.ts | 369 | '## Step 1: Observe and Plan (related tags: <planning>, <update-plan-content>, <mark-sub-goal-done>)', | CODE |
| LOW | …s/core/src/ai-model/workflows/grounding/search-area.ts | 43 | // Step 1: Extend each side by expandSize (100px), clamped to screen boundaries | COMMENT |
| LOW⚡ | …s/core/src/ai-model/workflows/grounding/search-area.ts | 61 | // Step 2: Check if area is already >= 400x400 | COMMENT |
| LOW⚡ | …s/core/src/ai-model/workflows/grounding/search-area.ts | 68 | // Step 2: Scale up from center to reach minimum 400x400 area | COMMENT |
| LOW | …ges/core/src/ai-model/prompt/planning/system-prompt.ts | 78 | ## Step 1: ${renderSubGoalsContent( | COMMENT |
| LOW | …ges/core/src/ai-model/prompt/planning/system-prompt.ts | 161 | ${renderSubGoalsContent(`## Step 2: Memory Data from Current Screenshot (related tags: <memory>) | CODE |
| LOW | packages/computer/tests/ai/chrome-extension-helpers.ts | 608 | // Step 1: Set alwaysAllow permission | COMMENT |
| LOW | packages/computer/tests/ai/chrome-extension-helpers.ts | 619 | // Step 2: Stop bridge, then start it so it uses the new permission | COMMENT |
| LOW | packages/computer/src/device.ts | 1134 | // Step 1: Take a screenshot (with timeout to handle screenshot-desktop | COMMENT |
| LOW | packages/computer/src/device.ts | 1151 | // Step 2: Verify pointer control. Windows capture, display enumeration, | COMMENT |
| LOW | packages/computer/src/device.ts | 1225 | // Step 3: List available monitors | COMMENT |
| LOW | …n/tests/unit-test/yaml/input-mode-typeonly-e2e.test.ts | 28 | // Step 1: Type first value using native Puppeteer | COMMENT |
| LOW⚡ | …n/tests/unit-test/yaml/input-mode-typeonly-e2e.test.ts | 39 | // Step 2: Click button to change focus | COMMENT |
| LOW⚡ | …n/tests/unit-test/yaml/input-mode-typeonly-e2e.test.ts | 42 | // Step 3: Simulate typeOnly behavior - click input and type without clearing | COMMENT |
| LOW | …-integration/tests/ai/web/puppeteer/input-mode.test.ts | 22 | // Step 1: Input first value (default replace mode) | COMMENT |
| LOW | …-integration/tests/ai/web/puppeteer/input-mode.test.ts | 33 | // Step 2: Input second value with typeOnly mode (should append, not replace) | COMMENT |
| LOW⚡ | …-integration/tests/ai/web/puppeteer/input-mode.test.ts | 73 | // Step 1: Input first value | COMMENT |
| LOW⚡ | …-integration/tests/ai/web/puppeteer/input-mode.test.ts | 83 | // Step 2: Input second value with replace mode (default, should clear first) | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 51 | // Step 1: Verify initial state | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 56 | // Step 2: Pinch out (zoom in) on the zoom area | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 63 | // Step 3: Verify pinch worked — scale changed | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 68 | // Step 4: Scroll down in the scroll area — this should still work after pinch | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 75 | // Step 5: Verify scroll worked — bottom items are visible | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 78 | // Step 6: Scroll back up — confirm scroll is not broken | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 85 | // Step 7: Verify scroll up worked | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 88 | // Step 8: Pinch in (zoom out) — confirm pinch still works after scrolling | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 95 | // Step 9: Final scroll to confirm no residual conflict | COMMENT |
| LOW | packages/visualizer/src/types.ts | 151 | // For these, we need to check if the field represents a location input | COMMENT |
| LOW⚡ | …on/src/extension/recorder/components/ProgressModal.tsx | 493 | // Step 0: Stop recording if currently recording | COMMENT |
| LOW⚡ | …on/src/extension/recorder/components/ProgressModal.tsx | 503 | // Step 1: Generate element descriptions | COMMENT |
| LOW⚡ | …on/src/extension/recorder/components/ProgressModal.tsx | 513 | // Step 2: Generate session title and description if not already generated | COMMENT |
| LOW | …on/src/extension/recorder/components/ProgressModal.tsx | 530 | // Step 3: Generate code with streaming support | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 85 | // Step 1: expand 100px each side -> {left: 400, top: 400, width: 250, height: 250} | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 87 | // Step 2: scale to 400x400 from center (525, 525) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 119 | // Step 1: left can only expand 10px (10-100 clamped to 0) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 122 | // Step 2: center (80, 525), scale factor = 2.0, new size = 320x500 | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 137 | // Step 1: right can only expand 10px (original right 990, desired 1090, clamped to 1000) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 140 | // Step 2: center (920, 525), scale factor = 2.0, new size = 320x500 | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 155 | // Step 1: top can only expand 10px (10-100 clamped to 0) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 158 | // Step 2: center (525, 80), scale factor = 2.0, new size = 500x320 | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 173 | // Step 1: bottom can only expand 10px (original bottom 990, desired 1090, clamped to 1000) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/search-area.test.ts | 176 | // Step 2: center (525, 920), scale factor = 2.0, new size = 500x320 | COMMENT |
| LOW | packages/core/tests/unit-test/search-area.test.ts | 103 | // Step 1: expand 100px each side -> {left: 400, top: 400, width: 500, height: 500} | COMMENT |
| LOW⚡ | …kages/core/tests/unit-test/merge-browser-parse.test.ts | 226 | // Step 1: extract (what mergeReports does) | COMMENT |
| LOW⚡ | …kages/core/tests/unit-test/merge-browser-parse.test.ts | 229 | // Step 2: escape again (what reportHTMLContent does) | COMMENT |
| LOW⚡ | …kages/core/tests/unit-test/merge-browser-parse.test.ts | 232 | // Step 3: unescape (what browser does via antiEscapeScriptTag) | COMMENT |
| LOW⚡ | packages/core/tests/unit-test/prompt/prompt.test.ts | 321 | expect(prompt).toContain('## Step 1: Observe (related tags: <planning>)'); | CODE |
| LOW⚡ | packages/core/tests/unit-test/prompt/prompt.test.ts | 323 | '## Step 1: Observe and Plan (related tags: <planning>, <update-plan-content>, <mark-sub-goal-done>)', | CODE |
| LOW | packages/core/tests/unit-test/prompt/prompt.test.ts | 369 | '## Step 1: Observe and Plan (related tags: <planning>, <update-plan-content>, <mark-sub-goal-done>)', | CODE |
| LOW | …s/core/src/ai-model/workflows/grounding/search-area.ts | 43 | // Step 1: Extend each side by expandSize (100px), clamped to screen boundaries | COMMENT |
| LOW⚡ | …s/core/src/ai-model/workflows/grounding/search-area.ts | 61 | // Step 2: Check if area is already >= 400x400 | COMMENT |
| LOW⚡ | …s/core/src/ai-model/workflows/grounding/search-area.ts | 68 | // Step 2: Scale up from center to reach minimum 400x400 area | COMMENT |
| LOW | …ges/core/src/ai-model/prompt/planning/system-prompt.ts | 161 | ${renderSubGoalsContent(`## Step 2: Memory Data from Current Screenshot (related tags: <memory>) | CODE |
| LOW | packages/computer/tests/ai/chrome-extension-helpers.ts | 608 | // Step 1: Set alwaysAllow permission | COMMENT |
| LOW | packages/computer/tests/ai/chrome-extension-helpers.ts | 619 | // Step 2: Stop bridge, then start it so it uses the new permission | COMMENT |
| LOW | packages/computer/src/device.ts | 1134 | // Step 1: Take a screenshot (with timeout to handle screenshot-desktop | COMMENT |
| LOW | packages/computer/src/device.ts | 1151 | // Step 2: Verify pointer control. Windows capture, display enumeration, | COMMENT |
| LOW | packages/computer/src/device.ts | 1225 | // Step 3: List available monitors | COMMENT |
| LOW | …n/tests/unit-test/yaml/input-mode-typeonly-e2e.test.ts | 28 | // Step 1: Type first value using native Puppeteer | COMMENT |
| LOW⚡ | …n/tests/unit-test/yaml/input-mode-typeonly-e2e.test.ts | 39 | // Step 2: Click button to change focus | COMMENT |
| LOW⚡ | …n/tests/unit-test/yaml/input-mode-typeonly-e2e.test.ts | 42 | // Step 3: Simulate typeOnly behavior - click input and type without clearing | COMMENT |
| LOW | …-integration/tests/ai/web/puppeteer/input-mode.test.ts | 22 | // Step 1: Input first value (default replace mode) | COMMENT |
| LOW | …-integration/tests/ai/web/puppeteer/input-mode.test.ts | 33 | // Step 2: Input second value with typeOnly mode (should append, not replace) | COMMENT |
| LOW⚡ | …-integration/tests/ai/web/puppeteer/input-mode.test.ts | 73 | // Step 1: Input first value | COMMENT |
| LOW⚡ | …-integration/tests/ai/web/puppeteer/input-mode.test.ts | 83 | // Step 2: Input second value with replace mode (default, should clear first) | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 51 | // Step 1: Verify initial state | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 56 | // Step 2: Pinch out (zoom in) on the zoom area | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 63 | // Step 3: Verify pinch worked — scale changed | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 68 | // Step 4: Scroll down in the scroll area — this should still work after pinch | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 75 | // Step 5: Verify scroll worked — bottom items are visible | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 78 | // Step 6: Scroll back up — confirm scroll is not broken | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 85 | // Step 7: Verify scroll up worked | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 88 | // Step 8: Pinch in (zoom out) — confirm pinch still works after scrolling | COMMENT |
| LOW⚡ | …s/web-integration/tests/ai/web/puppeteer/pinch.test.ts | 95 | // Step 9: Final scroll to confirm no residual conflict | COMMENT |
| LOW⚡ | …on/src/extension/recorder/components/ProgressModal.tsx | 493 | // Step 0: Stop recording if currently recording | COMMENT |
| LOW⚡ | …on/src/extension/recorder/components/ProgressModal.tsx | 503 | // Step 1: Generate element descriptions | COMMENT |
| LOW⚡ | …on/src/extension/recorder/components/ProgressModal.tsx | 513 | // Step 2: Generate session title and description if not already generated | COMMENT |
| LOW | …on/src/extension/recorder/components/ProgressModal.tsx | 530 | // Step 3: Generate code with streaming support | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/shared/src/constants/example-code.ts | 140 | # ---------------- | COMMENT |
| MEDIUM | packages/shared/src/constants/example-code.ts | 151 | # ---------------- | COMMENT |
| MEDIUM | packages/shared/src/constants/example-code.ts | 200 | # ---------------- | COMMENT |
| MEDIUM | packages/shared/src/constants/example-code.ts | 207 | # ---------------- | COMMENT |
| MEDIUM | …es/computer/tests/ai/chrome-extension-recorder.test.ts | 63 | // ── Combined: full recorder lifecycle ───────────────────────────────── | COMMENT |
| MEDIUM | packages/computer/tests/ai/chrome-extension-helpers.ts | 8 | // ─── Constants ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/computer/tests/ai/chrome-extension-helpers.ts | 32 | // ─── Types ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/computer/tests/ai/chrome-extension-helpers.ts | 45 | // ─── Environment Config Keys ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/computer/tests/ai/chrome-extension-helpers.ts | 56 | // ─── Browser Helpers ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/computer/tests/ai/chrome-extension-helpers.ts | 255 | // ─── Extension ID Reader ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/computer/tests/ai/chrome-extension-helpers.ts | 324 | // ─── CDP Helpers ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/computer/tests/ai/chrome-extension-helpers.ts | 448 | // ─── Config Injection ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ages/computer/tests/ai/chrome-extension-bridge.test.ts | 160 | // ── Setup: open side panel and switch to Bridge Mode ───────────────── | COMMENT |
| MEDIUM | …ages/computer/tests/ai/chrome-extension-bridge.test.ts | 208 | // ── Test: bridge connects to a real server ──────────────────────────── | COMMENT |
| MEDIUM | …ages/computer/tests/ai/chrome-extension-bridge.test.ts | 230 | // ── Test: stop bridge ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ages/computer/tests/ai/chrome-extension-bridge.test.ts | 241 | // ── Test: after stop, server gets no connection ─────────────────────── | COMMENT |
| MEDIUM | …ages/computer/tests/ai/chrome-extension-bridge.test.ts | 254 | // ── Test: restart and connect again ─────────────────────────────────── | COMMENT |
| MEDIUM | …es/computer/tests/ai/chrome-extension-settings.test.ts | 68 | // ── Combined: settings modal open/edit/close ────────────────────────── | COMMENT |
| MEDIUM | …es/computer/tests/ai/chrome-extension-settings.test.ts | 110 | // ── Combined: three-mode rotation with Bridge UI checks ─────────────── | COMMENT |
| MEDIUM | …eb-integration/tests/unit-test/bridge/security.test.ts | 73 | // ─── VULN-1: Cross-origin WebSocket hijacking ──────────────────────────── | COMMENT |
| MEDIUM | …eb-integration/tests/unit-test/bridge/security.test.ts | 154 | // ─── VULN-2: Kill signal DoS ───────────────────────────────────────────── | COMMENT |
| MEDIUM | …eb-integration/tests/unit-test/bridge/security.test.ts | 235 | // ─── Positive: legitimate flows still work ─────────────────────────────── | COMMENT |
| MEDIUM | apps/chrome-extension/tests/bridge-start-stop.test.ts | 17 | // ─── BridgeConnector unit tests ────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/chrome-extension/tests/bridge-start-stop.test.ts | 138 | // ─── Worker message handling tests ────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/chrome-extension/tests/bridge-start-stop.test.ts | 171 | // ─── UI state tests ────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | packages/test/tests/terminal-reporter.test.ts | 1385 | first.io.log.mock.calls.flat().filter((line) => line.startsWith('WARN')), | CODE |
| CRITICAL | packages/test/tests/terminal-reporter.test.ts | 1499 | expect(verbose.io.log.mock.calls.flat().join('\n')).toContain( | CODE |
| CRITICAL | packages/test/tests/terminal-reporter.test.ts | 1502 | expect(verbose.io.log.mock.calls.flat().join('\n')).toContain( | CODE |
| CRITICAL | …kages/computer/tests/unit-test/device-security.test.ts | 646 | expect(mockState.libnut.moveMouse.mock.calls.at(0)).toEqual([200, 300]); | CODE |
| CRITICAL | …kages/computer/tests/unit-test/device-security.test.ts | 647 | expect(mockState.libnut.moveMouse.mock.calls.at(-1)).toEqual([700, 300]); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ages/playground-app/tests/controller-selectors.test.ts | 43 | ).not.toHaveProperty('placeholder'); | CODE |
| LOW | packages/core/tests/unit-test/xml-parser.test.ts | 8 | expect(result).toBe('John Doe'); | CODE |
| LOW | packages/core/tests/unit-test/xml-parser.test.ts | 42 | expect(result).toBe('John Doe'); | CODE |
| LOW | …ckages/core/tests/unit-test/llm-planning-retry.test.ts | 136 | by: z.enum(['label', 'placeholder']), | CODE |
| LOW | …ckages/core/tests/unit-test/llm-planning-retry.test.ts | 164 | by: { type: "enum('label', 'placeholder')" }, | CODE |
| LOW | …s/unit-test/prompt/planning/action-description.test.ts | 72 | by: z.enum(['label', 'placeholder']), | CODE |
| LOW | …s/unit-test/prompt/planning/action-description.test.ts | 99 | by: { type: "enum('label', 'placeholder')" }, | CODE |
| LOW | packages/android/tests/unit-test/page.test.ts | 3547 | 'data:image/png;base64,fake-data', | CODE |
| LOW | packages/android/tests/unit-test/page.test.ts | 3588 | 'data:image/png;base64,fake-data', | CODE |
| LOW | packages/android/tests/unit-test/page.test.ts | 3629 | 'data:image/png;base64,fake-data', | CODE |
| LOW | packages/android/tests/unit-test/page.test.ts | 3779 | 'data:image/png;base64,fake-data', | CODE |
| LOW | …es/web-integration/tests/unit-test/yaml/player.test.ts | 1099 | value: 'John Doe' | CODE |
| LOW | …es/web-integration/tests/unit-test/yaml/player.test.ts | 1133 | "value": "John Doe", | CODE |
| LOW | …c/component/playground/playground-demo-ui-context.json | 34 | "placeholder": "Username", | CODE |
| LOW | …c/component/playground/playground-demo-ui-context.json | 64 | "placeholder": "Password", | CODE |
| LOW⚡ | apps/site/docs/zh/faq.md | 144 | MIDSCENE_MODEL_API_KEY="placeholder" | CODE |
| LOW⚡ | apps/site/docs/zh/faq.md | 148 | 这里的 `MIDSCENE_MODEL_API_KEY="placeholder"` 只是为了满足 OpenAI SDK 的初始化要求,真实 API Key 会通过 `defaultHeaders.api-key` 发送。 | CODE |
| LOW⚡ | apps/site/docs/zh/faq.md | 153 | MIDSCENE_MODEL_API_KEY="placeholder" | CODE |
| LOW⚡ | apps/site/docs/en/faq.md | 144 | MIDSCENE_MODEL_API_KEY="placeholder" | CODE |
| LOW⚡ | apps/site/docs/en/faq.md | 148 | In this fallback, `MIDSCENE_MODEL_API_KEY="placeholder"` only satisfies the OpenAI SDK constructor check. The real key i | CODE |
| LOW⚡ | apps/site/docs/en/faq.md | 153 | MIDSCENE_MODEL_API_KEY="placeholder" | CODE |
| LOW | apps/report/tests/report-template-utils.test.ts | 31 | ).toThrow('placeholder'); | CODE |
| LOW | apps/report/tests/report-template-utils.test.ts | 40 | ).toThrow('placeholder'); | CODE |
| LOW | …/report/src/components/playground-demo-ui-context.json | 34 | "placeholder": "Username", | CODE |
| LOW | …/report/src/components/playground-demo-ui-context.json | 64 | "placeholder": "Password", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/core/src/agent/ui-utils.ts | 175 | // Prefer AI-generated output.log over user input | COMMENT |
| HIGH⚡ | apps/studio/src/renderer/recorder/export.ts | 310 | '# Generated locally from recorded events, not AI-generated.', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/site/rspress.config.ts | 776 | 'basics#javascript-orchestration', | CODE |
| MEDIUM | apps/site/rspress.config.ts | 923 | to: '/basics#javascript-orchestration', | CODE |
| MEDIUM | apps/site/rspress.config.ts | 927 | to: '/basics#javascript-orchestration', | CODE |
| MEDIUM | apps/site/rspress.config.ts | 1015 | to: '/zh/basics#javascript-orchestration', | CODE |
| MEDIUM | apps/site/rspress.config.ts | 1019 | to: '/zh/basics#javascript-orchestration', | CODE |
| MEDIUM | apps/site/tests/legacy-redirects.test.ts | 89 | 'basics#javascript-orchestration', | CODE |
| MEDIUM | apps/site/tests/legacy-redirects.test.ts | 93 | 'basics#javascript-orchestration', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/core/tests/unit-test/utils.test.ts | 481 | // <!DOCTYPE html> | COMMENT |
| LOW | packages/core/src/report-html-template.ts | 1 | // Keep the Report template in its own source module. Core's bundle:false | COMMENT |
| LOW | packages/playground/src/mjpeg-hub.ts | 241 | // there's no FIN until something else cleans up. Each subsequent mount | COMMENT |
| LOW | packages/shared/tests/unit-test/image/index.test.ts | 641 | // await alignCoordByTrim(file, { | COMMENT |
| LOW | packages/cli/src/framework/rstest-project.ts | 121 | // Anchor the framework entry on this bundle's own directory rather than | COMMENT |
| LOW | packages/computer/native/phased-scroll.m | 1 | // Synthesize trackpad-like scroll-wheel events with proper gesture phase so | COMMENT |
| LOW | …ges/computer/native/rdp/include/rdp_helper_session.hpp | 1 | #pragma once | COMMENT |
| LOW | packages/computer/native/rdp/tests/screenshot_test.cpp | 1 | #include <algorithm> | COMMENT |
| LOW | packages/computer/native/rdp/src/session.cpp | 1 | #include "rdp_helper_session.hpp" | COMMENT |
| LOW | packages/computer/native/rdp/src/session.cpp | 21 | #else | COMMENT |
| LOW | packages/computer/src/device.ts | 141 | // Edge scrolls (scrollToTop / scrollToBottom / ...) use a large total | COMMENT |
| LOW | …ages/web-integration/tests/unit-test/bridge/io.test.ts | 321 | }); | COMMENT |
| LOW | …c/extension/recorder/generators/playwrightGenerator.ts | 41 | // recordLogger.info('Starting Playwright test generation', { | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/shared/src/img/info.ts | 144 | // This is more robust than just checking the first 4 bytes | COMMENT |
| MEDIUM | apps/chrome-extension/tests/event-memory-stress.test.ts | 257 | // check stays deterministic and robust. | COMMENT |
| MEDIUM | …/chrome-extension/src/extension/recorder/recorder.less | 279 | // ensure internal components do not generate scrollbars and fully utilize width | COMMENT |
| MEDIUM | …/chrome-extension/src/extension/recorder/recorder.less | 538 | // ensure timeline items fully utilize width | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | apps/studio/src/renderer/recorder/export.ts | 320 | '# Set WDA_BASE_URL to the original WDA gateway URL before replay.', | CODE |
| LOW⚡ | apps/studio/src/renderer/recorder/export.ts | 327 | '# Set WDA_MJPEG_URL to the original MJPEG URL before replay.', | CODE |
| LOW⚡ | apps/studio/src/renderer/recorder/export.ts | 334 | '# Set WDA_SESSION_ID to the existing WDA session ID before replay.', | CODE |