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 presents the forensic synthetic code analysis of ZSeven-W/openpencil, a Rust project with 4,059 GitHub stars. SynthScan v2.0 examined 431,195 lines of code across 1373 source files, recording 1490 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 6.6 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 1490 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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 | 49 | # ── Invariant 2: mobile targets don't pull jian-host-desktop. ───────── | COMMENT |
| MEDIUM | tools/check-jian-boundaries.sh | 71 | # ── Invariant 3: wasm32 has no jian-host-desktop / jian-skia. ────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/agent_indicators.rs | 503 | // ── Relay (daemon → browser) ──────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/property_edit_mutators.rs | 473 | // ── Multi-fill (indexed) selected-node mutators ──────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/fills.rs | 868 | // ── Multi-fill (indexed) ops ─────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-editor-core/src/agent_indicators_tests.rs | 462 | // ── Relay (daemon → browser) ──────────────────────────────────────────── | 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 | 341 | // ── field writers ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 4 | // ── inject_missing_nav_surface_fill ────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 54 | // ── round_active_nav_tab ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 267 | // ── strip_redundant_section_fill ───────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 339 | // ── clip_card_image_corners ────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 376 | // ── fill_card_leading_image_width ──────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 447 | // ── fix_notification_badge_overlay ─────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 513 | // ── convert_stacked_overlay_to_absolute ────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 553 | // ── dominant_design_accent ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 574 | // ── strip_nested_card_decoration ───────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/tree_heuristics_tests.rs | 601 | // ── fix_invisible_text_band (glm banner-fill floor) ────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/validation_fixes_apply.rs | 17 | // ── B2: Types for fix application ───────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/validation_fixes_apply.rs | 54 | // ── B2: apply_validation_fixes ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/validation_fixes_apply.rs | 71 | // ── Property fixes ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/validation_fixes_apply.rs | 135 | // ── Virtual property translation ────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/validation_fixes_apply.rs | 170 | // ── Typed property dispatch ─────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/validation_fixes_apply.rs | 313 | // ── Structural fixes ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/validation_fixes_apply.rs | 411 | // ── B2: auto_fix_parent_layout_after_add_child ──────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/validation_fixes_apply.rs | 522 | // ── helpers for node introspection ─────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/plan_repair.rs | 21 | // ── public(crate) helpers ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/plan_repair.rs | 206 | // ── Task B2: repair_plan_object + finalize_plan ─────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/plan_repair.rs | 483 | // ── Task B3: parse_orchestrator_response cascade ────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/plan_repair.rs | 597 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/timeouts.rs | 13 | // ── 从 TS `ai-runtime-config.ts` 逐字搬来的毫秒常量 ──────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/timeouts.rs | 69 | // ── 公开类型 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/timeouts.rs | 123 | // ── 公开函数 ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/timeouts.rs | 222 | // ── 测试 ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/timeouts.rs | 228 | // ── bucket_for ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/timeouts.rs | 248 | // ── orchestrator_timeouts ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/timeouts.rs | 274 | // ── sub_agent_timeouts ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/op-orchestrator/src/timeouts.rs | 319 | // ── builtin_planning_timeouts ───────────────────────────────────────────── | COMMENT |
| 278 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Cargo.toml | 41 | thiserror = "1" | COMMENT |
| LOW | Cargo.toml | 61 | # release build in the graph, including the excluded vendor/* path deps (their | COMMENT |
| LOW | deny.toml | 41 | # async-openai 0.36.x still depends on backoff 0.4.x, and RustSec | 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_host) compiles for iOS / Android cargo check, leaving | 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/bundle-macos.sh | 1 | #!/bin/sh | COMMENT |
| LOW | tools/check-web-server-headless.sh | 1 | #!/usr/bin/env bash | 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/editor_ui_state.rs | 1 | //! Editor-UI overlay + panel state for `EditorState`. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 61 | New, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 101 | /// | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 121 | COMMENT | |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 261 | } | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 381 | COMMENT | |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 401 | Commit, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 421 | /// Merge the named branch into the current one through an | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 441 | /// then bind the cloned repo. Reads url / dest from `clone_form`. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 481 | } | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 501 | } | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 521 | /// cursor-move. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 541 | /// Ready-state header: whether the branch-picker dropdown (opened | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 561 | pub ahead: u32, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 581 | /// Draft URL typed into the Remotes section's input box. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 601 | /// Candidate `.op` files for the tracked-file picker subview, host-filled | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 621 | /// `commit_input` and the commit re-fires after a successful save. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 641 | pub loading: bool, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 801 | variant: usize, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 841 | /// Shared file-menu interaction state; `hover = None` means no | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 861 | pub export_dialog_hover: Option<crate::export_dialog_state::ExportDialogButton>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 881 | pub property_tab_hover: Option<PropertyTab>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 901 | pub figma_import_open: bool, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 921 | // --- Canvas preview (Play) mode ------------------------------- | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 941 | pub settings_input: jian_core::text_input::TextInputState, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 961 | pub icon_picker_search: String, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 981 | /// Which bare chat header button (chevron / maximize / new-chat) | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1001 | pub pressed_button: Option<crate::button_press_state::ButtonPressTarget>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1021 | pub window_fullscreen: bool, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1041 | /// Active flex-layout mode for the property panel's row. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1081 | pub fill_type_picker_index: usize, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1101 | /// Live type-ahead filter for the font-family picker (TS | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1121 | /// is "machine has none" rather than "not loaded yet"). | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1141 | /// Which row inside the open theme-preset dropdown the cursor is over — | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1161 | pub variables_theme_rename_axis: Option<String>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1181 | /// Variable row whose `⋯` overflow menu (Rename / Delete) is open. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1201 | pub layer_context_menu: Option<LayerContextMenuState>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1221 | /// computed each `apply_cursor_move` by `align_guides`, cleared on | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1241 | /// Whether the floating Design-MD panel is shown. | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1261 | pub design_md_request: Option<DesignMdRequest>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1281 | pub component_browser_category: Option<crate::uikit::ComponentCategory>, | COMMENT |
| LOW | crates/op-editor-core/src/editor_ui_state.rs | 1301 | /// `uikit-store.persist()` counterpart). | COMMENT |
| 859 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 | 312 | /// alone would clear, but a worker mid `add_frame` loop (scaffold just | COMMENT |
| MEDIUM | crates/op-editor-core/src/page_mutators.rs | 139 | /// design) so the orchestrator's scaffold + role/cleanup passes are | 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 | 30 | /// `dashboard_columns.rs` for parity with the removed scaffold. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/app_shell.rs | 679 | /// placing them side by side. Measured on the agentic loop: MiniMax-M3 emits | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 7 | //! scaffold 之后数一次,subtask 全跑完再数一次,没涨即零内容。 | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/cleanup.rs | 33 | /// Exposed `pub(crate)` so scaffold builders can pre-compute the same | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/cleanup.rs | 34 | /// baseline that [`descendant_count`] returns after applying the scaffold | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/cleanup.rs | 35 | /// commands — needed by the dashboard scaffold (Task C2) whose row/slot | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 63 | /// Pass ①:移动端重复状态栏去重。scaffold 注入了一个固定状态栏, | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 1300 | /// orchestrator (and, in a later step, the agentic design loop) calls to run | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 1306 | /// orchestrator's cleanup stage now routes through here so a future agentic | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 1354 | // deleted sparse scaffold id can be replaced by the kept rich root id. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 1377 | // orchestrator (per-subtask role passes already ran) and the agentic | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup.rs | 1388 | // horizontal layout (MiniMax-M3 in the agentic loop) — flip it to a row | COMMENT |
| MEDIUM | crates/op-orchestrator/src/types.rs | 19 | /// 只读访问当前文档 —— cleanup 判定空 scaffold、未来 S3c | COMMENT |
| MEDIUM | crates/op-orchestrator/src/app_shell_tests.rs | 669 | // MiniMax-M3 in the agentic loop: the root already carries [Sidebar, Main] | 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/dashboard_columns_tests.rs | 2 | //! plus section sizing. The tests for the removed bespoke-scaffold helpers | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests.rs | 136 | // 至少有 scaffold + 两个 subtask 的 InsertSubtree。 | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests.rs | 656 | /// GOLDEN end-to-end (no LLM): dashboard plan → two-column scaffold → | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests.rs | 657 | /// scripted subtasks → finalize. The scaffold's Sidebar shell is authored | COMMENT |
| MEDIUM | crates/op-orchestrator/src/cleanup_tests.rs | 105 | // minimax2 reproduction: the agentic loop's model already split the root into | 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 | 114 | /// the realistic agentic-loop structure), the Class-A section passes run on the | COMMENT |
| MEDIUM | crates/op-orchestrator/src/concurrent.rs | 4 | //! N-root scaffold + semaphore/`join_all` worker fan-in) was collapsed into the | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 8 | //! 专用 scaffold)都收敛进这条路径 —— 它们的 per-subtask 产出与确定性后处理 | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 9 | //! 完全一致,仅差并发并行度 / scaffold 形状(默认 + 基准路径都没用上)。 | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 54 | /// Used to re-resolve the pre-built two-column scaffold's column ids after the | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 112 | /// 规划 → 单根 scaffold → 顺序子 agent → 清理 的单一路径。 | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 146 | // sidebar+main scaffold) flow through this same single-root sequential | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 148 | // differing in wall-clock parallelism / scaffold shape, neither of which | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 216 | // scaffold 模板 bug —— 收尾后报内部错误。 | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 232 | // Route subtasks into the scaffold. For a pre-built two-column | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 426 | // 错误地移除 scaffold root 并返回 NoContent 而非 Aborted)。 | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 448 | // **全部**零内容(zero_content)才删 scaffold root。 | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run.rs | 524 | // 错误路径才移除空 scaffold root;abort / 正常零内容只回滚变量。 | 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 | 30 | /// app-shell scaffold without requiring a dashboard-content gate. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/dashboard_columns.rs | 64 | /// structural gate for pre-building the two-column scaffold, so a landing page | COMMENT |
| MEDIUM | crates/op-orchestrator/src/prompt_tests.rs | 219 | // Mobile UI guardrails now load via the `mobile-ui` skill (system prompt); | COMMENT |
| MEDIUM | crates/op-orchestrator/src/prompt_tests.rs | 617 | // 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 | 122 | /// (a) Append mode: run does NOT emit a scaffold-root InsertSubtree. | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/run_tests_b4.rs | 126 | /// (one per subtask), NOT a scaffold-root InsertSubtree. | COMMENT |
| MEDIUM⚡ | crates/op-orchestrator/src/run_tests_b4.rs | 130 | // replaces it with ctx.target_parent_id (the live id) before any scaffold call. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 170 | // NOT 3 (which would indicate a scaffold-root insert). | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 177 | // If scaffold were inserted, it would be 4. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 270 | // 1 pre-setup + 2 sub-agent InsertSubtrees = 3 total (no N scaffold roots). | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 332 | /// A request without `append_context` takes the normal scaffold+sequential | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 333 | /// path: it inserts a scaffold root frame AND the sub-agent nodes. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 376 | // Normal path: scaffold root + 2 subtask inserts = at least 3 InsertSubtree. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 450 | /// a multi-frame dashboard scaffold (sidebar + main + row frames). With the | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 451 | /// guard, the append fast-path takes priority — no scaffold-root InsertSubtree | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 534 | // No dashboard scaffold: total InsertSubtree count is exactly | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 535 | // 1 (pre-setup) + 2 (sub-agents) = 3. Dashboard scaffold would push | COMMENT |
| MEDIUM | crates/op-orchestrator/src/run_tests_b4.rs | 792 | // The scaffold root must now contain the sub-agent nodes (cleanup didn't | COMMENT |
| 72 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …p-host-web/src/widget_host/keyboard_settings_commit.rs | 14 | let Some(focus) = self.editor_state.editor_ui.agent_settings.focus.take() else { | CODE |
| CRITICAL | …s/op-host-web/src/widget_host/variables_panel_press.rs | 190 | self.editor_state.ui.variables.active_theme.remove(&axis); | CODE |
| CRITICAL | …s/op-host-web/src/widget_host/variables_panel_press.rs | 201 | self.editor_state.ui.variables.active_theme.insert( | CODE |
| CRITICAL | …es/op-host-web/src/widget_host/keyboard_text_inputs.rs | 32 | && self.editor_state.editor_ui.agent_settings.focus.is_some()) | 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 | 113 | host.editor_state.editor_ui.agent_settings.acp_agents.len(), | CODE |
| CRITICAL | …/src/widget_host/agent_settings_compact_press_tests.rs | 134 | host.editor_state.editor_ui.agent_settings.acp_agents.len(), | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/settings_caret.rs | 27 | if self.editor_state.editor_ui.agent_settings.focus.is_none() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/settings_caret.rs | 37 | if self.editor_state.editor_ui.agent_settings.focus.is_none() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard.rs | 16 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard.rs | 227 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard.rs | 408 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/io_tests.rs | 181 | assert!(borrowed.host.editor_state.editor_ui.recent_files.is_empty()); | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/release_input.rs | 197 | let chat_model_pressed = self.editor_state.editor_ui.chat_model_picker.pressed.take(); | CODE |
| CRITICAL | crates/op-host-web/src/widget_host/keyboard_edit_ops.rs | 180 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | …host-web/src/widget_host/property_panel_press_tests.rs | 571 | host.editor_state.editor_ui.image_panel.search_query.clear(); | CODE |
| CRITICAL | …tes/op-host-web/src/widget_host/overlay_press_tests.rs | 281 | host.editor_state.editor_ui.file_menu.hover.is_some(), | CODE |
| CRITICAL | …host-web/src/widget_host/agent_settings_press_tests.rs | 212 | assert!(host.editor_state.editor_ui.agent_settings.focus.is_none()); | CODE |
| CRITICAL | …/op-host-web/src/widget_host/variables_panel_commit.rs | 101 | if let Some(value) = self.editor_state.ui.variables.active_theme.remove(old_axis) { | 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 | crates/op-host-native/src/widget_host/scroll.rs | 532 | && self.editor_state.editor_ui.git_panel.diff.is_some() | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/scroll.rs | 693 | && self.editor_state.editor_ui.git_panel.diff.is_some() | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/shortcuts.rs | 90 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/shortcuts.rs | 98 | if let Some(form) = self.editor_state.editor_ui.git_panel.clone_form.as_mut() { | CODE |
| CRITICAL | …p-host-native/src/widget_host/variables_panel_press.rs | 188 | self.editor_state.ui.variables.active_theme.remove(&axis); | CODE |
| CRITICAL | …p-host-native/src/widget_host/variables_panel_press.rs | 199 | self.editor_state.ui.variables.active_theme.insert( | CODE |
| CRITICAL | …tes/op-host-native/src/widget_host/release_feedback.rs | 11 | let chat_model_pressed = self.editor_state.editor_ui.chat_model_picker.pressed.take(); | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/settings_caret.rs | 27 | if self.editor_state.editor_ui.agent_settings.focus.is_none() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/settings_caret.rs | 37 | if self.editor_state.editor_ui.agent_settings.focus.is_none() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/keyboard.rs | 70 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/keyboard.rs | 82 | if let Some(form) = self.editor_state.editor_ui.git_panel.clone_form.as_mut() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/keyboard.rs | 525 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/keyboard.rs | 532 | if let Some(form) = self.editor_state.editor_ui.git_panel.clone_form.as_mut() { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/keyboard.rs | 1265 | if self.editor_state.editor_ui.agent_settings.focus.is_some() { | CODE |
| CRITICAL | …es/op-host-native/src/widget_host/settings_dispatch.rs | 11 | let Some(focus) = self.editor_state.editor_ui.agent_settings.focus.take() else { | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/input.rs | 49 | && self.editor_state.editor_ui.agent_settings.focus.is_some()) | CODE |
| CRITICAL | crates/op-host-native/src/widget_host/input.rs | 63 | self.editor_state.editor_ui.agent_settings.focus.is_some() | CODE |
| CRITICAL | …-host-native/src/widget_host/variables_panel_commit.rs | 103 | if let Some(value) = self.editor_state.ui.variables.active_theme.remove(old_axis) { | CODE |
| 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-orchestrator/src/tree_heuristics_tests.rs | 402 | {"type":"text","content":"Jane Doe"} | 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 | 439 | "placeholder", | CODE |
| LOW | crates/op-orchestrator/src/role_infer_tests.rs | 194 | {"type":"text_input","id":"si","placeholder":"Search for food"} | CODE |
| LOW | crates/op-orchestrator/src/role_infer_tests.rs | 227 | {"type":"text_input","id":"si","placeholder":"Search"} | CODE |
| LOW | crates/op-orchestrator/src/subagent.rs | 1002 | {"type":"frame","id":"sb","name":"Search Bar","children":[{"type":"text_input","id":"si","placeholder":" | CODE |
| LOW | crates/op-orchestrator/src/cleanup_tests.rs | 947 | "id": "placeholder", | CODE |
| LOW | crates/op-orchestrator/src/role_post_pass.rs | 199 | .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 | crates/op-host-native/src/widget_host/input_tests.rs | 1270 | "x":24,"y":32,"width":220,"height":40,"placeholder":"Email"} | CODE |
| LOW | crates/op-host-native/src/widget_host/input_tests.rs | 1298 | "x":24,"y":32,"width":220,"height":40,"placeholder":"Email"} | CODE |
| LOW | crates/op-pen-loader/src/adapter_tests.rs | 721 | {"type":"text_input","id":"ti","value":"hi","placeholder":"Type"}, | CODE |
| LOW | crates/op-pen-loader/src/layout_scene_tests.rs | 884 | "leadingIcon":"mail","trailingIcon":"eye","placeholder":"you@example.com"}]}]}"##, | CODE |
| LOW | crates/op-pen-loader/src/widget_payload_tests.rs | 19 | "placeholder":"Search","cornerRadius":8, | CODE |
| LOW | crates/op-pen-loader/src/widget_payload_tests.rs | 37 | "placeholder":"0","cornerRadius":6, | 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 | 85 | "placeholder":"Email address", | CODE |
| LOW | …p-editor-ui/src/widgets/property_panel_widget_tests.rs | 219 | "x":0,"y":0,"width":220,"height":40,"placeholder":"Email"} | CODE |
| LOW | crates/op-codegen/src/codegen_targets.rs | 76 | opt_attr("placeholder", n.placeholder.as_deref()), | CODE |
| LOW | crates/op-codegen/src/codegen_targets.rs | 81 | opt_attr("placeholder", n.placeholder.as_deref()), | CODE |
| LOW | crates/op-host-desktop/src/image_search_session.rs | 552 | .unwrap_or("placeholder") | CODE |
| LOW | crates/op-host-desktop/src/image_search_session.rs | 608 | | "placeholder" | 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.rs | 304 | prompt.contains("placeholder"), | CODE |
| LOW | crates/op-ai-skills/src/loader.rs | 242 | assert!(skill.content.contains("placeholder")); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/check-web-browser-smoke.sh | 5 | # 1. `/smoke/step-1b.html` — pure CanvasKit mount harness. | COMMENT |
| MEDIUM | crates/op-editor-core/src/fills.rs | 1027 | /// stays robust to schema growth. | COMMENT |
| MEDIUM | crates/op-orchestrator/src/app_shell.rs | 118 | /// more robust than a root-name keyword (the bug root "Barbershop Client | 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 | crates/op-host-web/src/web_design_md.rs | 20 | const DESIGN_MD_SYSTEM_PROMPT: &str = r##"You are a Design Systems Lead. Analyze the provided PenNode design tree and ge | 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-host-services/src/design_md_llm.rs | 8 | const DESIGN_MD_SYSTEM_PROMPT: &str = r##"You are a Design Systems Lead. Analyze the provided PenNode design tree and ge | CODE |
| MEDIUM | crates/op-host-services/src/model_discovery.rs | 505 | /// robust whether the CLI replies newline-delimited or | COMMENT |
| MEDIUM | crates/op-smoke/Cargo.toml | 61 | # Direct openai-compat HTTP client for the smoke harness (OPENPENCIL_SMOKE_DIRECT=1) | COMMENT |
| MEDIUM | crates/op-host-desktop/src/design_md_host.rs | 17 | const DESIGN_MD_SYSTEM_PROMPT: &str = r##"You are a Design Systems Lead. Analyze the provided PenNode design tree and ge | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | crates/op-editor-core/src/editor_ui_state.rs | 1255 | /// True while the desktop host is waiting for an AI-generated | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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 | scripts/package-appimage.sh | 22 | # Usage: | COMMENT |
| LOW | scripts/install-op.sh | 8 | # Usage: | COMMENT |
| LOW | scripts/package-deb.sh | 17 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/merge-settings-i18n.py | 888 | CODE | |
| LOW | tools/convert-locales.py | 90 | CODE | |
| LOW | scripts/ab-v9/run_matrix.py | 102 | CODE | |
| LOW | scripts/ab-v9/run_matrix.py | 328 | CODE |
| 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 | scripts/self-loop.sh | 88 | except Exception: | CODE |
| LOW | scripts/self-loop.sh | 92 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/merge-settings-i18n.py | 16 | CODE |