The world's first open-source AI-native vector design tool and the first to feature concurrent Agent Teams. Design-as-Code. Turn prompts into UI directly on the live canvas. A modern alternative to Pencil.
This report summarizes scanner evidence for ZSeven-W/openpencil, a Rust project with 6,121 GitHub stars. SynthScan examined 1,156,641 lines of code across 4124 source files, recording 3465 pattern matches distributed across 19 syntactic categories. The legacy adjusted pattern signal is 4.8 (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.
Can maintainers explain intent, assumptions, and trade-offs? 2817 finding(s).
Are imports declared and package/API names verified? 148 finding(s).
Are wrappers, guards, and repeated structures necessary? 523 finding(s).
Which changes need focused human review? 3465 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 3465 distinct pattern matches across 19 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 | Cargo.toml | 41 | anyhow = "1" | COMMENT |
| LOW | Cargo.toml | 61 | # own [profile.release] blocks are inert — only the build-root profile applies). | COMMENT |
| LOW | deny.toml | 41 | ignore = [ | COMMENT |
| LOW | packaging/ios/OpenPencilPlayer-Bridging-Header.h | 1 | #ifndef OpenPencilPlayer_Bridging_Header_h | COMMENT |
| LOW | packaging/ios/Sources/DouyinNativeSignIn.swift | 1 | import UIKit | COMMENT |
| LOW | packaging/ios/Sources/OpEngineHost+Pointer.swift | 1 | import Foundation | COMMENT |
| LOW | packaging/ios/Sources/DocumentSaveCoordinator.swift | 1 | import Foundation | COMMENT |
| LOW | packaging/ios/Sources/DocumentStorage.swift | 1 | import Foundation | COMMENT |
| LOW | packaging/ios/Sources/WechatNativeSignIn.swift | 1 | import Foundation | COMMENT |
| LOW | packaging/ios/Sources/AlipayNativeSignIn.swift | 1 | import Foundation | COMMENT |
| LOW | packaging/ios/Sources/NativeLoginViewController.swift | 1 | import SafariServices | COMMENT |
| LOW | packaging/ios/Sources/OpPlayerView+ImeBridge.swift | 1 | import UIKit | COMMENT |
| LOW | packaging/ios/Sources/DocumentSaveBinding.swift | 1 | import Foundation | COMMENT |
| LOW | tools/check-widget-boundary.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/check-widget-boundary.sh | 21 | # carry a real `impl Widget for X` — a stale file with the impl | COMMENT |
| LOW | tools/check-widget-boundary.sh | 41 | # arbitrary namespace segments) anywhere under op-host-web/src/. | COMMENT |
| LOW | tools/check-widget-boundary.sh | 61 | # Forward F2: no `fn layout(` / `fn access_node(` anywhere under | COMMENT |
| LOW | tools/check-widget-boundary.sh | 81 | # line ALSO carries the `// glue:` marker AND the file is | COMMENT |
| LOW | tools/check-widget-boundary.sh | 141 | combined_paint="${outside_module_hits}" | COMMENT |
| LOW | tools/check-jian-boundaries.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/check-jian-boundaries.sh | 21 | # widget render stack (skia-safe + jian-skia + NativeBackend + | COMMENT |
| LOW | tools/fetch-skia-artifact.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/check-wasm-bundle.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/check-wasm-bundle.sh | 21 | # Exit semantics: | COMMENT |
| LOW | tools/check-wasm-bundle.sh | 41 | WASM_OPT_CANDIDATE_FEATURES=( | COMMENT |
| LOW | tools/check-collab-security-boundaries-cases.sh | 341 | COMMENT | |
| LOW | tools/bundle-macos.sh | 1 | #!/bin/sh | COMMENT |
| LOW | tools/check-web-server-headless.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/check-text-measure.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/check-text-measure.sh | 21 | # `fit_chrome` / `centered_text_x` / `measure_in_family`), which routes to | COMMENT |
| LOW | tools/check-collab-deployment-boundaries.sh | 1 | # Deployment-specific collaboration security boundaries. | COMMENT |
| LOW | tools/stage-web-assets.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | …ates/op-editor-core/assets/scene_templates_prefix.toml | 1 | # Scene Template Center catalogue prefix. | COMMENT |
| LOW | crates/op-editor-core/src/history_bench_tests.rs | 1 | //! Pathological benchmarks for the structurally-shared undo history. | COMMENT |
| LOW | crates/op-editor-core/src/variables_panel_state.rs | 1 | //! State-layer mirror of the variables panel's buttons. | COMMENT |
| LOW | crates/op-editor-core/src/hoist_app_state.rs | 1 | //! Hoist node-level `state` to one document-root `MergeAppState`. | COMMENT |
| LOW | crates/op-editor-core/src/share_routes.rs | 1 | //! Tenant-sharing HTTP route paths, shared by the web shell (client) and the | COMMENT |
| LOW | crates/op-editor-core/src/share_routes.rs | 21 | COMMENT | |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1 | //! Editor-UI overlay + panel state for `EditorState`. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 41 | /// caches, active page index) lives on [`crate::ui_draft::UiDraftState`] | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 61 | /// the settings panel hide every external-CLI surface. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 81 | /// UI locale — TopBar Globe cycles. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 101 | /// to `1` (serde default), matching `ChatState::default().agent_team_size`. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 121 | pub export_quick_menu_hover: Option<crate::export_quick_menu_state::ExportQuickRow>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 141 | pub pending_window_control: Option<WindowControlRequest>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 161 | /// `export_format_picker_open` — opening one closes the other. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 181 | /// so a tall inspector (many effects, etc.) stays reachable. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 201 | pub figma_import_open: bool, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 221 | /// platform's `HoveredFile` and `HoveredFileCancelled` / drop). Drives | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 241 | /// nicety, never content. Deliberately NOT inferred from artboard | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 261 | pub settings_input: jian_core::text_input::TextInputState, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 281 | /// — which opens the hub portal's token page — never appears there. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 301 | pub toolbar_hover: Option<crate::toolbar_state::ToolbarHover>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 321 | pub icon_picker_load_more_request: Option<crate::icon_picker_state::IconifyLoadMoreRequest>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 341 | pub chat_tab_hover: Option<usize>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 361 | /// statusbar / chat buttons without duplicating every hover field. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 381 | /// which is why no clear path has to reset it: the next entry | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 401 | pub pending_close_chat_tab: Option<usize>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 421 | /// Empty when unset. The property panel honours the pin only while | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 441 | pub size_toggles: SizeToggleState, | COMMENT |
| 2487 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/check-widget-boundary.sh | 39 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 45 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 60 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tools/check-widget-boundary.sh | 71 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tools/check-widget-boundary.sh | 79 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tools/check-widget-boundary.sh | 86 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 149 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 166 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 182 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 186 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 199 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 210 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 225 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-widget-boundary.sh | 227 | # --------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/check-jian-boundaries.sh | 78 | # ── Invariant 3: wasm32 has no jian-host-desktop / jian-skia. ────────── | COMMENT |
| MEDIUM | crates/op-editor-core/assets/scene_templates.toml | 61 | # ── 卡片档 · card-system spec 的活样张 ───────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/assets/scene_templates.toml | 132 | # ── 信息图档 · 第二批(+7)──────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/assets/scene_templates.toml | 213 | # ── 第三批(+27):对比 9 / 教程 9 / 轮播 9 ──────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/agent_indicators.rs | 610 | // ── Relay (daemon → browser) ──────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/property_edit_mutators.rs | 611 | // ── Multi-fill (indexed) selected-node mutators ──────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_variables_transitions.rs | 33 | // ─── Menus ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_variables_transitions.rs | 119 | // ─── Header renames ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_variables_transitions.rs | 149 | // ─── Theme / variant CRUD ────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_variables_transitions.rs | 278 | // ─── Add variable ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_variables_transitions.rs | 343 | // ─── Axis resolution ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_press_transitions.rs | 10 | // ─── Toolbar shape-slot dropdown ─────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_press_transitions.rs | 31 | // ─── TopBar dropdowns ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_press_transitions.rs | 103 | // ─── Canvas ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_press_transitions.rs | 127 | // ─── History guard ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/agent_indicators_tests.rs | 563 | // ── Relay (daemon → browser) ──────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_ui_transitions.rs | 108 | // ─── Chat model-picker filter input ──────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_ui_transitions.rs | 151 | // ─── Settings-modal focused input ────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_ui_transitions.rs | 293 | // ─── Chat design-block apply ─────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 40 | // ─── Legacy draft mirrors ────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 81 | // ─── Focus predicates ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 135 | // ─── Inline layer rename ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 167 | // ─── Canvas text editing ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 191 | // ─── Variables-panel search filter ───────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 225 | // ─── Chat composer ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 248 | // ─── Per-focus character gates ───────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 331 | // ─── Typed-character routing ─────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 395 | // ─── Backspace / forward-delete ──────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 483 | // ─── Caret movement ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 567 | // ─── Select-all across focused inputs ────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 623 | // ─── Selection edit ops ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/host_keyboard_transitions.rs | 745 | // ─── Import-modal chord (Cmd+Shift+F / Cmd+Shift+H) ──────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 24 | // ── helper: parse justify_content keyword ──────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 37 | // ── helper: parse align_items keyword ──────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 47 | // ── helper: parse layout keyword ───────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 58 | // ── helper: parse text_align keyword ───────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 70 | // ── helper: parse text_align_vertical keyword ──────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 81 | // ── helper: parse text_growth keyword ──────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 92 | // ── helper: parse sizing keyword ────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 102 | // ── helper: build Padding from LayoutPropValue ──────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 123 | // ── impl EditorState ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/command_layout_prop.rs | 355 | // ── field writers ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/fills/edits.rs | 34 | // ── Multi-fill (indexed) ops ─────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/variables_resolve/palette.rs | 36 | // ── shadcn core (page / surfaces / brand) ───────────────────── | COMMENT |
| MEDIUM⚡ | crates/op-editor-core/src/variables_resolve/palette.rs | 56 | // ── sidebar family ──────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/op-editor-core/src/variables_resolve/palette.rs | 65 | // ── status colours ──────────────────────────────────────────── | COMMENT |
| 432 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …-host-web/src/widget_host/image_panel_overlay_tests.rs | 44 | host.editor_state.editor_ui.image_panel.search_query.text(), | CODE |
| CRITICAL | …-host-web/src/widget_host/image_panel_overlay_tests.rs | 87 | host.editor_state.editor_ui.image_panel.search_query.text(), | CODE |
| CRITICAL | …-host-web/src/widget_host/image_panel_overlay_tests.rs | 102 | host.editor_state.editor_ui.image_panel.search_query.caret(), | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/preview_frame.rs | 505 | let pressed = self.editor_state.editor_ui.preview.switcher_pressed.take(); | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/slides_panel.rs | 174 | || self.editor_state.editor_ui.slides_panel.drag.is_some(); | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/slides_panel.rs | 225 | if self.editor_state.editor_ui.slides_panel.pressed.is_none() { | CODE |
| CRITICAL⚡ | …ates/op-host-web/src/widget_host/collab_input_tests.rs | 54 | host.editor_state.editor_ui.collab.panel.join_input.text(), | CODE |
| CRITICAL⚡ | …ates/op-host-web/src/widget_host/collab_input_tests.rs | 59 | host.editor_state.editor_ui.collab.panel.join_input.text(), | CODE |
| CRITICAL⚡ | …ates/op-host-web/src/widget_host/collab_input_tests.rs | 64 | host.editor_state.editor_ui.collab.panel.join_input.text(), | CODE |
| CRITICAL | …ates/op-host-web/src/widget_host/collab_input_tests.rs | 261 | host.editor_state.editor_ui.collab.panel.join_input.text(), | CODE |
| CRITICAL | …ates/op-host-web/src/widget_host/collab_input_tests.rs | 270 | host.editor_state.editor_ui.collab.panel.join_input.text(), | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard_ime.rs | 97 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | …es/op-host-web/src/widget_host/keyboard_text_inputs.rs | 36 | && self.editor_state.editor_ui.agent_settings.focus.is_some()) | CODE |
| CRITICAL | …ost-web/src/widget_host/image_panel_selection_tests.rs | 65 | host.editor_state.editor_ui.image_panel.search_query.text(), | CODE |
| CRITICAL | …ost-web/src/widget_host/image_panel_selection_tests.rs | 169 | host.editor_state.editor_ui.image_panel.search_query.caret(), | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard_git.rs | 12 | if let Some(form) = self.editor_state.editor_ui.git_panel.clone_form.as_mut() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard_git.rs | 102 | if let Some(form) = self.editor_state.editor_ui.git_panel.clone_form.as_mut() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard_git.rs | 240 | if let Some(form) = self.editor_state.editor_ui.git_panel.clone_form.as_mut() { | CODE |
| CRITICAL | …/src/widget_host/agent_settings_compact_press_tests.rs | 126 | host.editor_state.editor_ui.agent_settings.acp_agents.len(), | CODE |
| CRITICAL | …/src/widget_host/agent_settings_compact_press_tests.rs | 147 | host.editor_state.editor_ui.agent_settings.acp_agents.len(), | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard.rs | 64 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard.rs | 169 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard.rs | 278 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard.rs | 383 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/io_tests.rs | 223 | assert!(borrowed.host.editor_state.editor_ui.recent_files.is_empty()); | CODE |
| CRITICAL | …p-host-web/src/widget_host/prompt_center_host_tests.rs | 260 | host.editor_state.editor_ui.prompt_center.search.text(), | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/preview_slideshow.rs | 420 | let Some(pressed) = self.editor_state.editor_ui.preview.toolbar_pressed.take() else { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/preview_slideshow.rs | 725 | let warnings_before = host.editor_state.editor_ui.preview.warnings.clone(); | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard_edit_ops.rs | 225 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | …host-web/src/widget_host/property_panel_press_tests.rs | 653 | host.editor_state.editor_ui.image_panel.search_query.text(), | CODE |
| CRITICAL | …host-web/src/widget_host/property_panel_press_tests.rs | 710 | host.editor_state.editor_ui.image_panel.search_query.text(), | CODE |
| CRITICAL | …tes/op-host-web/src/widget_host/overlay_press_tests.rs | 326 | host.editor_state.editor_ui.file_menu.hover.is_some(), | CODE |
| CRITICAL | …host-web/src/widget_host/agent_settings_press_tests.rs | 156 | assert!(host.editor_state.editor_ui.agent_settings.focus.is_none()); | CODE |
| CRITICAL | …es/op-host-web/src/widget_host/property_hover_tests.rs | 105 | host.editor_state.editor_ui.locale_picker.hover.is_some(), | CODE |
| CRITICAL | …ates/op-host-native/src/widget_host/keyboard_delete.rs | 89 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | …ates/op-host-native/src/widget_host/keyboard_delete.rs | 96 | if let Some(form) = self.editor_state.editor_ui.git_panel.clone_form.as_mut() { | CODE |
| CRITICAL | …ates/op-host-native/src/widget_host/keyboard_delete.rs | 346 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/preview_frame.rs | 398 | let pressed = self.editor_state.editor_ui.preview.switcher_pressed.take(); | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/slides_panel.rs | 310 | || self.editor_state.editor_ui.slides_panel.drag.is_some(); | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/slides_panel.rs | 334 | if self.editor_state.editor_ui.slides_panel.pressed.is_none() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/scroll.rs | 593 | && self.editor_state.editor_ui.git_panel.diff.is_some() | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/ime.rs | 194 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/home.rs | 44 | let caret = self.editor_state.editor_ui.home.input.text().len(); | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/home.rs | 272 | let brief = self.editor_state.editor_ui.home.draft.trim().to_string(); | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/shortcuts.rs | 205 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/shortcuts.rs | 213 | if let Some(form) = self.editor_state.editor_ui.git_panel.clone_form.as_mut() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/scroll_pan.rs | 105 | && self.editor_state.editor_ui.git_panel.diff.is_some() | CODE |
| CRITICAL | …tes/op-host-native/src/widget_host/release_feedback.rs | 9 | let home_pressed = self.editor_state.editor_ui.home.pressed.take().is_some(); | CODE |
| CRITICAL | …tive/src/widget_host/preview_replace_document_tests.rs | 45 | assert!(host.editor_state.editor_ui.preview.device.is_none()); | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/keyboard.rs | 104 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/keyboard.rs | 116 | if let Some(form) = self.editor_state.editor_ui.git_panel.clone_form.as_mut() { | CODE |
| CRITICAL | …es/op-host-native/src/widget_host/preview_slideshow.rs | 269 | let Some(pressed) = self.editor_state.editor_ui.preview.toolbar_pressed.take() else { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/input.rs | 59 | && self.editor_state.editor_ui.agent_settings.focus.is_some()) | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/input.rs | 84 | self.editor_state.editor_ui.agent_settings.focus.is_some() | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/keyboard_send.rs | 103 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | …s/op-host-native/src/widget_host/keyboard_clipboard.rs | 72 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-editor-ui/src/widgets/scene_template_panel.rs | 305 | filtered_style_guide_cards(self.state.editor_ui.scene_template_center.search.text()) | CODE |
| CRITICAL | …op-editor-ui/src/widgets/scene_template_user_layout.rs | 23 | user_template_cards(self.state.editor_ui.scene_template_center.search.text()) | CODE |
| CRITICAL | …op-editor-ui/src/widgets/scene_template_user_layout.rs | 31 | user_template_card_count(self.state.editor_ui.scene_template_center.search.text()) | CODE |
| CRITICAL | …/op-editor-ui/src/widgets/agent_settings_press_flow.rs | 271 | let text = state.editor_ui.agent_settings.mcp_server.port.to_string(); | CODE |
| 4 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/op-editor-core/src/hoist_app_state.rs | 15 | /// (agentic-loop finalize, MCP inserts). `usize::MAX` is the weakest | COMMENT |
| MEDIUM | crates/op-editor-core/src/agent_indicators.rs | 404 | /// alone would clear, but a worker mid `add_frame` loop (scaffold just | COMMENT |
| MEDIUM | crates/op-editor-core/src/page_mutators.rs | 220 | /// design) so the orchestrator's scaffold + role/cleanup passes are | COMMENT |
| MEDIUM | crates/op-editor-core/src/preview_slideshow.rs | 137 | /// That order IS the authored order — the scaffold inserts boards in order | COMMENT |
| MEDIUM | crates/op-orchestrator/src/prompt_subagent.rs | 237 | // Mobile UI guardrails live in the flag-gated `mobile-ui` skill rather than | COMMENT |
| MEDIUM | crates/op-orchestrator/src/prompt_subagent.rs | 540 | // (Mobile UI guardrails now load from the `mobile-ui` skill — see the | COMMENT |
| MEDIUM | crates/op-orchestrator/src/app_shell_evict.rs | 99 | /// placing them side by side. Measured on the agentic loop: MiniMax-M3 emits | COMMENT |
| MEDIUM | crates/op-orchestrator/src/screen_groups.rs | 16 | //! SEQUENTIALLY, one screen after another, through N scaffold roots instead | COMMENT |
| MEDIUM | crates/op-orchestrator/src/app_shell.rs | 8 | //! plan-level "dashboard bespoke scaffold" (that pre-built the two-column root) | COMMENT |
| MEDIUM | crates/op-orchestrator/src/app_shell.rs | 14 | //! passes already ran) and the agentic loop (`apply_loop_finalize` ran the | COMMENT |
| MEDIUM | crates/op-orchestrator/src/app_shell.rs | 45 | /// `dashboard_columns.rs` for parity with the removed scaffold. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 7 | //! scaffold 之后数一次,subtask 全跑完再数一次,没涨即零内容。 | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/cleanup.rs | 91 | /// Exposed `pub(crate)` so scaffold builders can pre-compute the same | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/cleanup.rs | 92 | /// baseline that [`descendant_count`] returns after applying the scaffold | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/cleanup.rs | 93 | /// commands — needed by the dashboard scaffold (Task C2) whose row/slot | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 113 | /// Pass ①:移动端重复状态栏去重。scaffold 注入了一个固定状态栏, | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 305 | /// orchestrator (and, in a later step, the agentic design loop) calls to run | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 311 | /// orchestrator's cleanup stage now routes through here so a future agentic | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 400 | // deleted sparse scaffold id can be replaced by the kept rich root id. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 425 | // orchestrator (per-subtask role passes already ran) and the agentic | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 436 | // horizontal layout (MiniMax-M3 in the agentic loop) — flip it to a row | COMMENT |
| MEDIUM | crates/op-orchestrator/src/types.rs | 20 | /// 只读访问当前文档 —— cleanup 判定空 scaffold、未来 S3c | COMMENT |
| MEDIUM | crates/op-orchestrator/src/ring_repair.rs | 293 | /// agentic loop's geometry echo shows the same fact the repair pass acts on. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_core.rs | 1 | //! Core `run` happy-path / scaffold / append / fallback tests. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_core.rs | 35 | // 至少有 scaffold + 两个 subtask 的 InsertSubtree。 | COMMENT |
| MEDIUM | crates/op-orchestrator/src/spacing_repair.rs | 69 | // The artboard is the only design-type signal a pass gets on the agentic | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup_desktop_dashboard.rs | 5 | //! scaffold, but weaker models can still emit a 1200px root whose main | COMMENT |
| MEDIUM | crates/op-orchestrator/src/unfilled_screens.rs | 2 | //! top-level screen the model (or a scaffold/seed pass) promised but | COMMENT |
| MEDIUM | crates/op-orchestrator/src/unfilled_screens.rs | 10 | //! detector both the agentic loop (`op-host-services::chat_agent_loop`, | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup_root_patches.rs | 63 | /// deck", which is prompt keywords and therefore blind three ways: the agentic | COMMENT |
| MEDIUM | crates/op-orchestrator/src/loop_finalize_tier_tests.rs | 1 | //! The repair-tier gate on the agentic-loop finalize path. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup_root_and_nav.rs | 160 | // agentic loop produces (measured: GLM-5.2 root 390×fit_content kept a | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_dashboard.rs | 17 | /// GOLDEN end-to-end (no LLM): dashboard plan → two-column scaffold → | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_dashboard.rs | 18 | /// scripted subtasks → finalize. The scaffold's Sidebar shell is authored | COMMENT |
| MEDIUM | crates/op-orchestrator/src/subagent.rs | 258 | // sink's state so this path and the agentic loop reach the same answer. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/app_shell_sidebar_tests.rs | 335 | // MiniMax-M3 in the agentic loop: the root already carries [Sidebar, Main] | COMMENT |
| MEDIUM | crates/op-orchestrator/src/dashboard_columns_tests.rs | 2 | //! plus section sizing. The tests for the removed bespoke-scaffold helpers | COMMENT |
| MEDIUM | crates/op-orchestrator/src/template_provenance.rs | 27 | //! (`DocSink::state()` on the orchestrator path, the live state on the agentic | COMMENT |
| MEDIUM | crates/op-orchestrator/src/template_provenance.rs | 31 | //! the plan: the agentic loop has no plan to read. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/screen_route_inventory.rs | 29 | /// after per-screen scaffold roots exist and before their workers run. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/loop_finalize_tests.rs | 1 | //! Tests for the Track-1 Step-4 agentic-loop finalize backstop. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/loop_finalize_tests.rs | 8 | /// children — the shape the agentic loop assembles by loop end (sections | COMMENT |
| MEDIUM | crates/op-orchestrator/src/loop_finalize_tests.rs | 232 | /// the realistic agentic-loop structure), the Class-A section passes run on the | COMMENT |
| MEDIUM | crates/op-orchestrator/src/concurrent.rs | 635 | /// each group's scaffold root via `agent_indicators::add_frame` before this | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 7 | //! dashboard(原 sidebar+main 专用 scaffold)收敛进单根路径:它的 per-subtask | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 8 | //! 产出与确定性后处理跟通用路径完全一致,只差 scaffold 形状(基准路径没用 | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 99 | /// Used to re-resolve the pre-built two-column scaffold's column ids after the | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 329 | // multiscreen-fanout-break fix (item A) — screen-group scaffold tests. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/wire_screen_navigation.rs | 36 | //! caller (orchestrator per-subtask cleanup + the agentic loop's whole-doc | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_screen_groups.rs | 2 | //! the per-screen-group N-root scaffold (item A) and the inter-group | COMMENT |
| MEDIUM | crates/op-orchestrator/src/dashboard_columns.rs | 6 | //! bespoke sidebar+main *scaffold* strategy (and the detection / surface-color / | COMMENT |
| MEDIUM | crates/op-orchestrator/src/dashboard_columns.rs | 41 | /// app-shell scaffold without requiring a dashboard-content gate. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/dashboard_columns.rs | 102 | /// structural gate for pre-building the two-column scaffold, so a landing page | COMMENT |
| MEDIUM | …s/op-orchestrator/src/prompt_subagent_content_tests.rs | 314 | // Mobile UI guardrails now load via the `mobile-ui` skill (system prompt), | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 7 | //! - Append mode: no scaffold `InsertSubtree` for the root, every subtask's | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/run_tests_b4.rs | 114 | /// (a) Append mode: run does NOT emit a scaffold-root InsertSubtree. | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/run_tests_b4.rs | 118 | /// (one per subtask), NOT a scaffold-root InsertSubtree. | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/run_tests_b4.rs | 122 | // replaces it with ctx.target_parent_id (the live id) before any scaffold call. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 162 | // NOT 3 (which would indicate a scaffold-root insert). | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 169 | // If scaffold were inserted, it would be 4. | COMMENT |
| 146 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/op-editor-core/assets/shadcn-kit.json | 2096 | "content": "John Doe", | CODE |
| LOW | crates/op-editor-core/assets/shadcn-kit.json | 2322 | "tags": ["skeleton", "loading", "placeholder", "shimmer"] | CODE |
| LOW | crates/op-html/src/special.rs | 204 | placeholder: element.attr("placeholder").map(str::to_string), | CODE |
| LOW | crates/op-html/src/special.rs | 265 | placeholder: element.attr("placeholder").map(str::to_string), | CODE |
| LOW | crates/op-html/src/special.rs | 285 | placeholder: element.attr("placeholder").map(str::to_string), | CODE |
| LOW | crates/op-html/src/special.rs | 330 | placeholder: element.attr("placeholder").map(str::to_string), | CODE |
| LOW | crates/op-html/src/special_tests.rs | 169 | vec![("type", "text"), ("placeholder", "Name")] | CODE |
| LOW | crates/op-html/src/css/selectors.rs | 552 | && element.attr("placeholder").is_some() | CODE |
| LOW | crates/op-orchestrator/src/cleanup_typography.rs | 209 | "placeholder", | CODE |
| LOW | crates/op-orchestrator/src/cleanup_typography.rs | 266 | "id": "placeholder", | CODE |
| LOW | crates/op-orchestrator/src/cleanup_typography.rs | 312 | assert!(pairs.contains(&("placeholder", 400))); | CODE |
| LOW | crates/op-orchestrator/src/orchestration_self_check.rs | 478 | "placeholder", | CODE |
| LOW | crates/op-orchestrator/src/role_infer_tests.rs | 198 | {"type":"text_input","id":"si","placeholder":"Search for food"} | CODE |
| LOW | crates/op-orchestrator/src/role_infer_tests.rs | 266 | {"type":"text_input","id":"input","placeholder":"Search"} | CODE |
| LOW | crates/op-orchestrator/src/role_infer_tests.rs | 348 | {"type":"text_input","id":"si","placeholder":"Search"} | CODE |
| LOW | crates/op-orchestrator/src/cleanup_nav_surface_tests.rs | 501 | "id": "placeholder", | CODE |
| LOW | …s/op-orchestrator/src/loop_finalize_recording_tests.rs | 60 | {"type":"text","id":"placeholder","content":"name@example.com", | CODE |
| LOW | …s/op-orchestrator/src/loop_finalize_recording_tests.rs | 71 | op_editor_core::walkers::find_node(replay.active_children(), &NodeId::new("placeholder")) | CODE |
| LOW | crates/op-orchestrator/src/parse_tests.rs | 121 | {"type":"text_input","id":"input","value":"","placeholder":"Search","_parent":"root"} | CODE |
| LOW | crates/op-orchestrator/src/parse_tests.rs | 122 | {"type":"text_area","id":"area","value":"","placeholder":"Notes","_parent":"root"} | CODE |
| LOW | crates/op-orchestrator/src/cleanup_empty_content_bar.rs | 20 | "placeholder", | CODE |
| LOW | crates/op-orchestrator/src/map_placeholder_tests.rs | 85 | "placeholder": "当前位置" | CODE |
| LOW | …tes/op-orchestrator/src/tree_heuristics_media_tests.rs | 77 | {"type":"text","content":"Jane Doe"} | CODE |
| LOW | …es/op-orchestrator/src/cleanup_repair_summary_tests.rs | 116 | { "type": "text", "id": "placeholder", "name": "Placeholder", | CODE |
| LOW | …es/op-orchestrator/src/cleanup_repair_summary_tests.rs | 277 | { "type": "text", "id": "placeholder", "name": "Placeholder", | CODE |
| LOW | …es/op-orchestrator/src/cleanup_repair_summary_tests.rs | 329 | { "type": "text", "id": "placeholder", "name": "Placeholder", | CODE |
| LOW | crates/op-orchestrator/src/subagent_coalesce_tests.rs | 244 | {"type":"frame","id":"sb","name":"Search Bar","children":[{"type":"text_input","id":"si","placeholder":"Sear | CODE |
| LOW | …ates/op-orchestrator/src/role_post_pass/color_utils.rs | 173 | .get("placeholder") | CODE |
| LOW⚡ | crates/op-cli/assets/skill-bundle.json | 4 | "skills/openpencil-design/SKILL.md": "---\nname: openpencil-design\ndescription: Use when designing UI with OpenPenc | CODE |
| LOW | crates/op-design-lint/src/detectors/widget_a11y.rs | 87 | "type": "text_input", "id": "i1", "placeholder": "Search…" | CODE |
| LOW | crates/op-design-lint/src/detectors/widget_a11y.rs | 112 | let empty = node(json!({"type": "text_input", "id": "i1", "placeholder": ""})); | CODE |
| LOW | crates/op-design-lint/src/detectors/widget_a11y.rs | 115 | let blank = node(json!({"type": "text_input", "id": "i2", "placeholder": " "})); | CODE |
| LOW | …t-native/src/widget_host/input_tests/property_input.rs | 184 | "x":24,"y":32,"width":220,"height":40,"placeholder":"Email"} | CODE |
| LOW | …t-native/src/widget_host/input_tests/property_input.rs | 212 | "x":24,"y":32,"width":220,"height":40,"placeholder":"Email"} | CODE |
| LOW | crates/op-pen-loader/src/adapter_text_widget_tests.rs | 411 | {"type":"text_input","id":"ti","value":"hi","placeholder":"Type"}, | CODE |
| LOW | crates/op-pen-loader/src/widget_payload_tests.rs | 21 | "placeholder":"Search","cornerRadius":8, | CODE |
| LOW | crates/op-pen-loader/src/widget_payload_tests.rs | 39 | "placeholder":"0","cornerRadius":6, | CODE |
| LOW | …es/op-pen-loader/src/layout_scene_tests/tokens_refs.rs | 171 | "leadingIcon":"mail","trailingIcon":"eye","placeholder":"you@example.com"}]}]}"##, | CODE |
| LOW | …/op-pen-loader/src/layout_scene_tests/widget_stroke.rs | 45 | "placeholder":"Pick one", | CODE |
| LOW | …p-editor-ui/src/widgets/property_panel_widget_tests.rs | 28 | "x":24,"y":32,"width":220,"height":40,"placeholder":"Email"} | CODE |
| LOW | …p-editor-ui/src/widgets/property_panel_widget_tests.rs | 56 | "placeholder":"Email address","value":"kai@example.com"} | CODE |
| LOW | …p-editor-ui/src/widgets/property_panel_widget_tests.rs | 89 | "placeholder":"Email address", | CODE |
| LOW | …p-editor-ui/src/widgets/property_panel_widget_tests.rs | 240 | "x":0,"y":0,"width":220,"height":40,"placeholder":"Email"} | CODE |
| LOW | crates/op-chat-agent/src/design_agent_diagnostics.rs | 517 | "frame" | "rectangle" | "box" | "slot" | "shape" | "placeholder" | CODE |
| LOW | crates/op-chat-agent/src/design_agent_diagnostics.rs | 558 | | "placeholder" | CODE |
| LOW | crates/op-codegen/src/codegen_targets.rs | 85 | opt_attr("placeholder", n.placeholder.as_deref()), | CODE |
| LOW | crates/op-codegen/src/codegen_targets.rs | 90 | opt_attr("placeholder", n.placeholder.as_deref()), | CODE |
| LOW | …tes/op-host-services/src/chat_subprocess_exit_tests.rs | 41 | upstream=https://agent.example.test/v1/plan?api_key=fake-key-000111222&trace=abc | CODE |
| LOW | …tes/op-host-services/src/chat_subprocess_exit_tests.rs | 220 | "fake-key-000111222", | CODE |
| LOW | crates/op-i18n/src/i18n/home_studio_key_tests.rs | 22 | "placeholder", | CODE |
| LOW | crates/op-image-enrich/src/targets.rs | 223 | // The generic name-derived fallback ("placeholder") loses to the | COMMENT |
| LOW | crates/op-image-enrich/src/targets.rs | 666 | | "placeholder" | CODE |
| LOW | crates/op-image-enrich/src/net/fetch.rs | 379 | "placeholder", | CODE |
| LOW | crates/op-image-enrich/src/targets/query.rs | 61 | .unwrap_or("placeholder") | CODE |
| LOW | crates/op-image-enrich/src/targets/query.rs | 117 | | "placeholder" | CODE |
| LOW | crates/op-acp/src/client_tests.rs | 612 | "#!/bin/sh\necho 'fatal: ANTHROPIC_API_KEY=sk-fake-000111 rejected' >&2\necho 'see https://agent.test/setup?toke | CODE |
| LOW | crates/op-acp/src/client_tests.rs | 623 | assert!(!text.contains("token=fake-token"), "{text}"); | CODE |
| LOW | crates/op-ai-skills/skills/knowledge/code-to-design.md | 229 | { "type": "text_input", "id": "email", "placeholder": "Email" } | CODE |
| LOW | …s/op-ai-skills/skills/phases/generation/design-code.md | 51 | - Never use lorem ipsum or generic "Your text here" placeholders. | CODE |
| LOW | crates/op-ai-skills/src/lib_tests.rs | 341 | prompt.contains("placeholder"), | CODE |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/check-web-browser-smoke.sh | 5 | # 1. `/smoke/step-1b.html` — pure CanvasKit mount harness. | COMMENT |
| MEDIUM | tools/check-collab-security-boundaries.sh | 748 | # comprehensive secret scanning remains a repository-host responsibility. | COMMENT |
| MEDIUM | crates/op-editor-core/src/history_snapshot.rs | 59 | /// and, being a real `PenDocument`, robust against schema growth. | COMMENT |
| MEDIUM | crates/op-editor-core/src/fills/tests.rs | 9 | /// stays robust to schema growth. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/app_shell_detect.rs | 54 | /// more robust than a root-name keyword (the bug root "Barbershop Client | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup_overflow_prepass.rs | 24 | // Absolutely-pinned, fixed-size controls that poke out of a | COMMENT |
| LOW⚡ | crates/op-cli/assets/skill-bundle.json | 4 | "skills/openpencil-design/SKILL.md": "---\nname: openpencil-design\ndescription: Use when designing UI with OpenPenc | CODE |
| MEDIUM | …s/op-host-native/src/backend/skia/font_import_tests.rs | 14 | //! generation counter use strict `>` (robust to concurrent bumps from other | COMMENT |
| MEDIUM | …ost-native/src/widget_host/variables_panel_ux_tests.rs | 42 | /// panel rect — keeps the tests robust against geometry tweaks. | COMMENT |
| MEDIUM | crates/op-ai/src/design_md.rs | 13 | pub const DESIGN_MD_SYSTEM_PROMPT: &str = r##"You are a Design Systems Lead. Analyze the provided PenNode design tree an | CODE |
| MEDIUM | crates/op-host-services/src/model_discovery.rs | 327 | /// robust whether the CLI replies newline-delimited or | COMMENT |
| MEDIUM | crates/op-smoke/Cargo.toml | 71 | # Direct openai-compat HTTP client for the smoke harness (OPENPENCIL_SMOKE_DIRECT=1) | COMMENT |
| MEDIUM | scripts/ab-v9/run_matrix.py | 34 | # ab-v3 corpus was restored to its new home under this harness after the TS | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/extract-op-auth-candidate.py | 4 | CODE | |
| LOW | tools/check-collab-bootstrap-urls.py | 9 | CODE | |
| LOW | tools/merge-settings-i18n.py | 16 | CODE | |
| LOW | tools/digest-op-auth-tree.py | 4 | CODE | |
| LOW | tools/export-i18n-catalogs.py | 4 | CODE | |
| LOW | tools/test_export_i18n_catalogs.py | 4 | CODE | |
| LOW | deploy/collab-relay-edge/verify-rate-rules.py | 4 | CODE | |
| LOW | templates/step0/_generators/tpl_card_spine.py | 60 | CODE | |
| LOW | templates/step0/_generators/tpl2.py | 5 | CODE | |
| LOW | templates/step0/_generators/tpl_compare_version_diff.py | 59 | CODE | |
| LOW | templates/step0/_generators/tpl_compare_time_shift.py | 62 | CODE | |
| LOW | templates/step0/_generators/tpl3.py | 5 | CODE | |
| LOW | templates/step0/_generators/tpl3.py | 5 | CODE | |
| LOW | templates/step0/_generators/tpl_bookreview_carousel.py | 84 | CODE | |
| LOW | templates/step0/_generators/scene_preview_cards.py | 20 | CODE | |
| LOW | templates/step0/_generators/tpl_tutorial_storage.py | 52 | CODE | |
| LOW | templates/step0/_generators/tpl1.py | 5 | CODE | |
| LOW | templates/step0/_generators/qa/freshcheck.py | 34 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/test_export_i18n_catalogs.py | 35 | def test_parser_supports_every_current_rhs_form(self) -> None: | CODE |
| LOW | tools/test_export_i18n_catalogs.py | 63 | def test_parser_rejects_unsupported_rhs(self) -> None: | STRING |
| LOW | tools/test_export_i18n_catalogs.py | 75 | def test_parser_rejects_duplicate_keys(self) -> None: | STRING |
| LOW | tools/test_export_i18n_catalogs.py | 88 | def test_parser_rejects_non_file_local_constant(self) -> None: | STRING |
| LOW | tools/test_export_i18n_catalogs.py | 100 | def test_check_mode_does_not_write(self) -> None: | STRING |
| LOW | tools/test_export_i18n_catalogs.py | 115 | def test_export_writes_exact_lazy_locale_set_deterministically(self) -> None: | STRING |
| LOW | tools/test_export_i18n_catalogs.py | 142 | def test_export_rejects_unexpected_output_entries(self) -> None: | STRING |
| LOW | crates/op-host-web/tests/paint_order.rs | 517 | && source.contains("export function opCkQuantizeTextRasterScale(scale)") | CODE |
| LOW | crates/op-host-web/src/figma_temp_worker.js | 460 | export function opCancelAllFigmaTempImports() { | CODE |
| LOW | crates/op-host-web/src/op_ck_bridge.js | 31 | export function opCkQuantizeTextRasterScale(scale) { | CODE |
| LOW | crates/op-host-web/src/op_ck_bridge.js | 67 | export function opCkNormalizeFontFamilyName(family) { | CODE |
| LOW | crates/op-host-web/src/op_ck_bridge.js | 114 | export function opCkResolveRegisteredTypeface(family, importedTypefaces, systemTypefacesByFamily, bundledTypefaces) { | CODE |
| LOW | crates/op-host-web/src/op_ck_bridge.js | 143 | export function opCkCreateRuntimeEffectCache(CK) { | CODE |
| LOW | crates/op-host-web/src/op_ck_bridge.js | 211 | export function opCkRuntimeEffectLocalMatrix( | CODE |
| LOW | crates/op-host-web/src/op_ck_bridge.js | 240 | export function opCkMakeRuntimeShaderForRect( | CODE |
| LOW | crates/op-host-web/src/op_ck_bridge.js | 264 | export function opCkBuildMeshGradientData(x, y, w, h, rows, cols, colors) { | CODE |
| LOW | packages/op-chrome-extension/design-capture.js | 19 | function collectDesignEvidenceInPage() { | CODE |
| LOW | packages/op-chrome-extension/client.js | 180 | export async function readBoundedDesignResponse(response, maxBytes) { | CODE |
| LOW | packages/op-chrome-extension/popup.js | 293 | function revokeWhenDownloadSettles(id, objectUrl) { | CODE |
| LOW | packages/op-chrome-extension/design-md.js | 20 | export function workerActionResponseError(response) { | CODE |
| LOW | packages/op-web-sdk/src/wheel.ts | 13 | export function normalizeViewerWheelDelta( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tools/check-collab-bootstrap-urls.py | 147 | except ValueError: | CODE |
| HIGH | scripts/ab-v9/run_matrix.py | 369 | except json.JSONDecodeError: | CODE |
| HIGH | scripts/ab-v9/run_matrix.py | 141 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …op-host-native/src/widget_host/deferred_press_tests.rs | 295 | // Step 1: the picker is modal over the card — the footer strip | COMMENT |
| LOW | …op-host-native/src/widget_host/deferred_press_tests.rs | 316 | // Step 2: with the picker gone the header is reachable — anywhere | COMMENT |
| LOW | crates/op-engine-jni/src/bindings.rs | 174 | // Step 1: attach the engine thread to the VM (permanent — detaches at | COMMENT |
| LOW | crates/op-engine-jni/src/bindings.rs | 185 | // Step 2: build the callbacks table and create the engine, both on the | COMMENT |
| LOW | …kills/skills/phases/planning/landing-page-predesign.md | 14 | ## Step 1: Concept Extraction | COMMENT |
| LOW | …kills/skills/phases/planning/landing-page-predesign.md | 29 | ## Step 2: Superfan Simulation | COMMENT |
| LOW | …kills/skills/phases/planning/landing-page-predesign.md | 45 | ## Step 3: Transformation Mapping | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/extract-op-auth-candidate.py | 43 | CODE | |
| LOW | tools/merge-settings-i18n.py | 873 | CODE | |
| LOW | tools/export-i18n-catalogs.py | 183 | CODE | |
| LOW | scripts/ab-v9/run_matrix.py | 105 | CODE | |
| LOW | scripts/ab-v9/run_matrix.py | 331 | CODE | |
| LOW | templates/step0/_generators/deckkit.py | 240 | CODE | |
| LOW | templates/step0/_generators/qa/cjkcheck.py | 65 | CODE | |
| LOW | templates/step0/_generators/qa/freshcheck.py | 148 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | crates/op-editor-core/src/editor_ui_state/groups.rs | 100 | /// True while the desktop host is waiting for an AI-generated | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/package-appimage.sh | 22 | # Usage: | COMMENT |
| LOW | scripts/install-op.sh | 8 | # Usage: | COMMENT |
| LOW | scripts/package-deb.sh | 17 | # Usage: | COMMENT |
| LOW | scripts/build-ohos.sh | 4 | # Usage: | COMMENT |
| LOW | …es/op-chrome-extension/scripts/check-extractor-sync.sh | 12 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …op-host-native/src/widget_host/deferred_press_tests.rs | 295 | // Step 1: the picker is modal over the card — the footer strip | COMMENT |
| LOW | …op-host-native/src/widget_host/deferred_press_tests.rs | 316 | // Step 2: with the picker gone the header is reachable — anywhere | COMMENT |
| LOW | crates/op-engine-jni/src/bindings.rs | 174 | // Step 1: attach the engine thread to the VM (permanent — detaches at | COMMENT |
| LOW | crates/op-engine-jni/src/bindings.rs | 185 | // Step 2: build the callbacks table and create the engine, both on the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/self-loop.sh | 88 | except Exception: | CODE |
| LOW | scripts/self-loop.sh | 92 | except Exception: | CODE |
| LOW | scripts/ab-g3/run.sh | 336 | except Exception: | CODE |
| LOW | scripts/ab-g3/run.sh | 432 | except Exception as err: | CODE |
| LOW | scripts/ab-g3/run.sh | 652 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | templates/step0/_generators/tpl_gradient_tech.py | 227 | mono("安装命令", "$ npm i -g edgegate && edgegate up", 28), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/check-collab-deployment-boundaries.sh | 5 | # This file is a FRAGMENT, not a runnable gate. Every assertion below is a | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | crates/op-cli/assets/skill-bundle.json | 4 | "skills/openpencil-design/SKILL.md": "---\nname: openpencil-design\ndescription: Use when designing UI with OpenPenc | CODE |
| LOW⚡ | crates/op-cli/assets/skill-bundle.json | 4 | "skills/openpencil-design/SKILL.md": "---\nname: openpencil-design\ndescription: Use when designing UI with OpenPenc | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | templates/step0/_generators/tpl_deck_ledger.py | 180 | CODE | |
| LOW | templates/step0/_generators/tpl_deck_dossier.py | 186 | CODE |