This report summarizes scanner evidence for zhom/donutbrowser. SynthScan examined 367,347 lines of code across 609 source files, recording 679 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 2.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 366 finding(s).
Are imports declared and package/API names verified? 270 finding(s).
Are wrappers, guards, and repeated structures necessary? 119 finding(s).
Which changes need focused human review? 679 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 679 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | osv-scanner.toml | 1 | # Advisories the scan may pass over, and why. This list is NOT a way to quiet a | COMMENT |
| LOW | packaging/flatpak/com.donutbrowser.DonutBrowser.yml | 1 | # Flatpak manifest for Donut Browser. | COMMENT |
| LOW | packaging/linux/smoke-test.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | donut-sync/docker-compose.yml | 1 | # Storage for developing and testing donut-sync itself. It runs an S3 server | COMMENT |
| LOW | donut-sync/src/jsval.rs | 1 | //! Request bodies read the way the original server read them. | COMMENT |
| LOW | donut-sync/src/migrate.rs | 1 | //! `donut-sync migrate-at-rest`: seals the plaintext objects already in the | COMMENT |
| LOW | donut-sync/src/at_rest.rs | 1 | //! Encryption at rest with the server's own key (`SYNC_AT_REST_KEY`). | COMMENT |
| LOW | .github/workflows/i18n-review.yml | 1 | name: Translation Review | COMMENT |
| LOW | .github/workflows/publish-sidecars.yml | 1 | name: Publish sidecars to R2 | COMMENT |
| LOW | .github/scripts/ai-infer.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/prompts/release-notes.prompt.yml | 21 | Use this format: | COMMENT |
| LOW | src-tauri/.cargo/audit.toml | 1 | # cargo-audit configuration. | COMMENT |
| LOW | src-tauri/.cargo/audit.toml | 21 | # arrives via tauri-plugin-log -> byte-unit -> rust_decimal. No enabled | COMMENT |
| LOW | src-tauri/src/autostart.rs | 1 | //! Launch at login, and the profiles to open again at the next start. | COMMENT |
| LOW | src-tauri/src/app_proxy.rs | 1 | //! The proxy Donut's own requests go through: Wayfern and app downloads, | COMMENT |
| LOW | src-tauri/src/profile_templates.rs | 21 | pub name_prefix: Option<String>, | COMMENT |
| LOW | src-tauri/src/remote_handoff.rs | 1 | //! What a remote session owes this machine, and the gate that collects it. | COMMENT |
| LOW | src-tauri/src/remote_handoff.rs | 301 | let mut transitioned = false; | COMMENT |
| LOW | src-tauri/src/remote_handoff.rs | 641 | } | COMMENT |
| LOW | src-tauri/src/profile_dns.rs | 1 | //! The DNS server a profile resolves names with. | COMMENT |
| LOW | src-tauri/src/proxy_distribution.rs | 1 | //! Handing a fleet of profiles one proxy each. | COMMENT |
| LOW | src-tauri/src/proxy_distribution.rs | 41 | pub unpaired_profile_ids: Vec<String>, | COMMENT |
| LOW | src-tauri/src/browser_runner.rs | 1661 | COMMENT | |
| LOW | src-tauri/src/proxy_server.rs | 1921 | Ok(Ok(())) => {} | COMMENT |
| LOW | src-tauri/src/proxy_server.rs | 2241 | crate::dialer::connect_host("direct", host, port, DIRECT_CONNECT_TIMEOUT).await | COMMENT |
| LOW | src-tauri/src/proxy_server.rs | 2261 | /// forwarding path. | COMMENT |
| LOW | src-tauri/src/portable_update.rs | 1 | //! Self-update of the portable Windows ZIP. | COMMENT |
| LOW | src-tauri/src/group_bookmarks.rs | 1 | //! Bookmarks a profile group shares with every profile in it. | COMMENT |
| LOW | src-tauri/src/group_bookmarks.rs | 41 | /// One bookmark shared by every profile in a group. | COMMENT |
| LOW | src-tauri/src/mcp_views.rs | 1 | //! What MCP tools answer with, kept small: an agent pays for every byte in | COMMENT |
| LOW | src-tauri/src/window_decorations.rs | 1 | //! Client-side window decorations on Linux. | COMMENT |
| LOW | src-tauri/src/window_decorations.rs | 21 | pub struct WindowDecorations { | COMMENT |
| LOW | src-tauri/src/window_decorations.rs | 41 | /// works. KWin honors it, so Plasma would be free to draw a Breeze titlebar | COMMENT |
| LOW | src-tauri/src/remote_session.rs | 141 | /// Whether this profile's exit rules out running it on a leased host. | COMMENT |
| LOW | src-tauri/src/remote_session.rs | 161 | /// itself needs a remote host. | COMMENT |
| LOW | src-tauri/src/remote_session.rs | 421 | #[serde(default)] | COMMENT |
| LOW | src-tauri/src/remote_session.rs | 441 | #[serde(default)] | COMMENT |
| LOW | src-tauri/src/remote_session.rs | 521 | /// Where to attach a CDP client for one session. | COMMENT |
| LOW | src-tauri/src/remote_session.rs | 641 | .lock() | COMMENT |
| LOW | src-tauri/src/remote_session.rs | 661 | /// as "finished" would lift the local launch gate during the one minute a host | COMMENT |
| LOW | src-tauri/src/remote_session.rs | 981 | COMMENT | |
| LOW | src-tauri/src/remote_session.rs | 1161 | } | COMMENT |
| LOW | src-tauri/src/recorder.rs | 1 | //! Recording what a person does, as a recipe. | COMMENT |
| LOW | src-tauri/src/app_dirs.rs | 121 | /// directory, so the only lever is the file name. Handing it an ABSOLUTE path | COMMENT |
| LOW | src-tauri/src/app_dirs.rs | 241 | COMMENT | |
| LOW | src-tauri/src/proxy_manager.rs | 141 | /// routed through it at all. Receipts written before this existed | COMMENT |
| LOW | src-tauri/src/proxy_manager.rs | 1521 | } | COMMENT |
| LOW | src-tauri/src/proxy_manager.rs | 2601 | // No proxy found for this profile | COMMENT |
| LOW | src-tauri/src/proxy_manager.rs | 2761 | } | COMMENT |
| LOW | src-tauri/src/system_proxy.rs | 1 | //! The proxy the operating system hands Donut's own HTTP clients. | COMMENT |
| LOW | src-tauri/src/launch_gate.rs | 1 | //! The pre-spawn gate. | COMMENT |
| LOW | src-tauri/src/launch_gate.rs | 141 | /// Say which of the three states a non-blocking check landed in. | COMMENT |
| LOW | src-tauri/src/launch_gate.rs | 321 | // But a profile that DOES declare one and still arrives here with no upstream | COMMENT |
| LOW | src-tauri/src/launch_gate.rs | 421 | pub exit_probe_pending: bool, | COMMENT |
| LOW | src-tauri/src/fs_secure.rs | 1 | //! Best-effort secure deletion. | COMMENT |
| LOW | src-tauri/src/fs_secure.rs | 61 | #[cfg(not(unix))] | COMMENT |
| LOW | src-tauri/src/dns_blocklist.rs | 61 | } | COMMENT |
| LOW | src-tauri/src/proxy_udp.rs | 41 | COMMENT | |
| LOW | src-tauri/src/proxy_udp.rs | 61 | /// Only an accepted association counts as `Yes`. Every other reply is a | COMMENT |
| LOW | src-tauri/src/lib.rs | 381 | COMMENT | |
| 220 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src-tauri/src/mcp_server.rs | 44 | const ATTRS = ['type','name','id','role','aria-label','aria-checked','aria-expanded','placeholder','title','value','hr | CODE |
| LOW | src-tauri/src/mcp_server.rs | 1531 | const ATTRS = ['id', 'name', 'type', 'role', 'href', 'src', 'placeholder', 'aria-label', 'title', 'alt', 'data-testid' | CODE |
| LOW | src-tauri/src/mcp_server.rs | 1566 | const ph = el.getAttribute('placeholder'); if (ph && norm(ph)) return norm(ph).slice(0, 300); | CODE |
| LOW | src-tauri/src/mcp_server.rs | 16172 | assert!(field_took(" Doe", "Jane", "Jane Doe", false, false)); | CODE |
| LOW | src-tauri/src/mcp_server.rs | 16175 | assert!(!field_took("Doe", "Jane Doe", "Jane Doe", false, false)); | CODE |
| LOW | src-tauri/src/log_redaction.rs | 142 | "user@example.com", | CODE |
| LOW | src/components/multiple-selector.tsx | 65 | "value" | "placeholder" | "disabled" | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 3105 | "placeholder": "搜索要启动的配置文件...", | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 3111 | "placeholder": "搜索运行中的配置文件...", | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 3117 | "placeholder": "搜索配置文件...", | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 3123 | "placeholder": "搜索分组...", | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 4513 | "placeholder": "发生了什么?你原本期望的结果是什么?提供复现步骤会很有帮助。" | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 4517 | "placeholder": "怎样能让 Donut 更好用?" | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 4521 | "placeholder": "你喜欢哪些地方?团队会很高兴听到。" | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 4525 | "placeholder": "想说什么都可以。" | CODE |
| LOW | src/i18n/locales/zh.json | 327 | "placeholder": "socks5://user:password@host:1080", | CODE |
| LOW | src/i18n/locales/zh.json | 522 | "placeholder": "添加备注..." | CODE |
| LOW | src/i18n/locales/zh.json | 547 | "placeholder": "https://example.com/track-launch" | CODE |
| LOW | src/i18n/locales/zh.json | 615 | "placeholder": "https://example.com/hooks/profile-launch" | CODE |
| LOW | src/i18n/locales/zh.json | 833 | "placeholder": "https://provider.example/change-ip?key=…", | CODE |
| LOW | src/i18n/locales/zh.json | 1303 | "placeholder": "在此粘贴 Cookie。JSON(数组或 {cookies: [...]} 对象)、Netscape cookies.txt,或 name=value; name2=value2", | CODE |
| LOW | src/i18n/locales/zh.json | 1700 | "placeholder": "https://example.com/hooks/profile-launch", | CODE |
| LOW | src/i18n/locales/zh.json | 1978 | "placeholder": "输入 DNS 地址或留空", | CODE |
| LOW | src/i18n/locales/zh.json | 2013 | "placeholder": "https://mail.example.com\nhttps://shop.example.com" | CODE |
| LOW | src/i18n/locales/zh.json | 2263 | "placeholder": "选择代理或 VPN", | CODE |
| LOW | src/i18n/locales/zh.json | 2282 | "placeholder": "选择分组", | CODE |
| LOW | src/i18n/locales/zh.json | 3086 | "placeholder": "输入命令或搜索...", | CODE |
| LOW | src/i18n/locales/zh.json | 4548 | "placeholder": "you@example.com", | CODE |
| LOW⚡ | src/i18n/locales/tr.json | 3105 | "placeholder": "Başlatılacak profilleri arayın...", | CODE |
| LOW⚡ | src/i18n/locales/tr.json | 3111 | "placeholder": "Çalışan profilleri arayın...", | CODE |
| LOW⚡ | src/i18n/locales/tr.json | 3117 | "placeholder": "Profilleri arayın...", | CODE |
| LOW⚡ | src/i18n/locales/tr.json | 3123 | "placeholder": "Grupları arayın...", | CODE |
| LOW⚡ | src/i18n/locales/tr.json | 4513 | "placeholder": "Ne oldu ve ne bekliyordunuz? Tekrarlama adımları çok yardımcı olur." | CODE |
| LOW⚡ | src/i18n/locales/tr.json | 4517 | "placeholder": "Donut'u sizin için ne daha iyi yapardı?" | CODE |
| LOW⚡ | src/i18n/locales/tr.json | 4521 | "placeholder": "Neyi seviyorsunuz? Ekip bunu duymaktan mutlu olur." | CODE |
| LOW⚡ | src/i18n/locales/tr.json | 4525 | "placeholder": "Bize her şeyi yazabilirsiniz." | CODE |
| LOW | src/i18n/locales/tr.json | 327 | "placeholder": "socks5://user:password@host:1080", | CODE |
| LOW | src/i18n/locales/tr.json | 522 | "placeholder": "Not ekleyin..." | CODE |
| LOW | src/i18n/locales/tr.json | 547 | "placeholder": "https://example.com/track-launch" | CODE |
| LOW | src/i18n/locales/tr.json | 615 | "placeholder": "https://example.com/hooks/profile-launch" | CODE |
| LOW | src/i18n/locales/tr.json | 833 | "placeholder": "https://provider.example/change-ip?key=…", | CODE |
| LOW | src/i18n/locales/tr.json | 1303 | "placeholder": "Çerezleri buraya yapıştırın. JSON (bir dizi veya {cookies: [...]} nesnesi), Netscape cookies.txt y | CODE |
| LOW | src/i18n/locales/tr.json | 1700 | "placeholder": "https://example.com/hooks/profile-launch", | CODE |
| LOW | src/i18n/locales/tr.json | 1978 | "placeholder": "Bir DNS adresi girin veya boş bırakın", | CODE |
| LOW | src/i18n/locales/tr.json | 2013 | "placeholder": "https://mail.example.com\nhttps://shop.example.com" | CODE |
| LOW | src/i18n/locales/tr.json | 2263 | "placeholder": "Bir proxy veya VPN seçin", | CODE |
| LOW | src/i18n/locales/tr.json | 2282 | "placeholder": "Bir grup seçin", | CODE |
| LOW | src/i18n/locales/tr.json | 3086 | "placeholder": "Bir komut yazın veya arayın...", | CODE |
| LOW | src/i18n/locales/tr.json | 4548 | "placeholder": "siz@example.com", | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 3105 | "placeholder": "起動するプロファイルを検索...", | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 3111 | "placeholder": "実行中のプロファイルを検索...", | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 3117 | "placeholder": "プロファイルを検索...", | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 3123 | "placeholder": "グループを検索...", | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 4513 | "placeholder": "何が起きて、本来はどうなるべきでしたか?再現手順があると助かります。" | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 4517 | "placeholder": "Donut がどうなれば、もっと使いやすくなりますか?" | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 4521 | "placeholder": "気に入っている点を教えてください。チームの励みになります。" | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 4525 | "placeholder": "どんなことでもお聞かせください。" | CODE |
| LOW | src/i18n/locales/ja.json | 327 | "placeholder": "socks5://user:password@host:1080", | CODE |
| LOW | src/i18n/locales/ja.json | 522 | "placeholder": "メモを追加..." | CODE |
| LOW | src/i18n/locales/ja.json | 547 | "placeholder": "https://example.com/track-launch" | CODE |
| 178 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | sdk/python/src/donutbrowser/client.py | 775 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | sdk/python/src/donutbrowser/client.py | 777 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | sdk/python/src/donutbrowser/client.py | 1282 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | sdk/python/src/donutbrowser/client.py | 1284 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 205 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 207 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 274 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 276 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 598 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 600 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 742 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 744 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 908 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 910 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 936 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 938 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 967 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 969 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 1031 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 1033 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 1117 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 1119 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 1165 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 1167 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 1309 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sdk/python/src/donutbrowser/client.py | 1311 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 71 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 73 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 88 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 90 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 164 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 166 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 199 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 201 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 213 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/publish-repo.sh | 215 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src-tauri/src/proxy_manager.rs | 4118 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/proxy_manager.rs | 4120 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | sdk/python/tests/test_coverage.py | 28 | def test_the_snapshot_is_readable_and_not_empty() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_coverage.py | 36 | def test_every_published_operation_is_wrapped_or_omitted() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_coverage.py | 45 | def test_the_sdk_claims_nothing_the_app_does_not_publish() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_coverage.py | 54 | def test_an_operation_is_either_wrapped_or_omitted_but_not_both() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_coverage.py | 59 | def test_every_omission_gives_a_reason() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_coverage.py | 64 | def test_every_wrapped_operation_names_a_real_method() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_coverage.py | 70 | def test_no_two_operations_share_a_method() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 11 | def test_arguments_are_used_as_given() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 19 | def test_the_environment_fills_in_what_was_not_passed() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 25 | def test_arguments_win_over_the_environment() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 35 | def test_the_port_falls_back_to_the_app_default() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 40 | def test_a_base_url_overrides_host_and_port() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 50 | def test_a_base_url_prefix_is_kept_on_every_path(fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 58 | def test_an_unusable_port_in_the_environment_is_reported() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 64 | def test_an_unsupported_scheme_is_refused() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 69 | def test_the_websocket_address_is_built_from_the_same_base() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_configuration.py | 77 | def test_a_reopened_client_still_works(fake: FakeDonut) -> None: | CODE |
| LOW | sdk/python/tests/test_errors.py | 44 | def test_status_maps_to_its_exception( | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 56 | def test_every_error_is_a_donut_error(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 62 | def test_the_five_hundreds_share_one_base(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 70 | def test_rate_limited_carries_retry_after(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 81 | def test_rate_limited_without_the_header_is_still_raised( | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 90 | def test_an_unreadable_retry_after_does_not_break_the_error( | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 99 | def test_a_structured_code_body_is_decoded(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 108 | def test_a_structured_code_body_keeps_its_params(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 116 | def test_a_plain_text_body_leaves_code_unset(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 124 | def test_an_undocumented_status_still_raises_something_catchable( | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 133 | def test_an_undocumented_server_status_is_a_server_error( | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 141 | def test_the_message_names_the_call(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 149 | def test_an_unreachable_app_is_not_an_api_error(fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 158 | def test_a_missing_token_fails_before_any_request() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_errors.py | 164 | def test_a_non_json_answer_is_reported_as_such(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW | sdk/python/tests/test_session.py | 13 | def test_the_block_gets_the_cdp_endpoint(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW | sdk/python/tests/test_session.py | 30 | def test_nothing_launches_until_the_block_is_entered( | CODE |
| LOW | sdk/python/tests/test_session.py | 38 | def test_the_browser_is_stopped_when_the_block_raises( | CODE |
| LOW | sdk/python/tests/test_session.py | 54 | def test_a_failed_stop_never_hides_why_the_block_failed( | CODE |
| LOW | sdk/python/tests/test_session.py | 68 | def test_a_failed_stop_is_raised_when_the_block_was_fine( | CODE |
| LOW⚡ | sdk/python/tests/test_session.py | 79 | def test_a_failed_launch_stops_nothing(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_session.py | 89 | def test_the_cdp_url_is_refused_before_the_block(client: DonutClient) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_session.py | 95 | def test_a_browser_taken_over_is_left_running(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW | sdk/python/tests/test_requests.py | 848 | def test_method_sends_the_documented_request( | CODE |
| LOW⚡ | sdk/python/tests/test_requests.py | 863 | def test_every_client_method_is_exercised_here() -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_requests.py | 870 | def test_the_token_travels_as_a_bearer_header(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_requests.py | 878 | def test_a_body_is_sent_as_json(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_requests.py | 885 | def test_path_ids_are_escaped(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_requests.py | 891 | def test_none_arguments_are_left_out_of_the_body(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_requests.py | 896 | def test_an_empty_string_still_reaches_the_app(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_requests.py | 902 | def test_a_no_content_answer_becomes_none(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_requests.py | 907 | def test_a_json_answer_is_returned_as_sent(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/tests/test_requests.py | 915 | def test_a_bare_boolean_answer_is_returned(client: DonutClient, fake: FakeDonut) -> None: | CODE |
| LOW⚡ | sdk/python/src/donutbrowser/client.py | 779 | def list_cookie_bot_schedules(self, *, scope: Optional[str] = None) -> CookieBotScheduleList: | CODE |
| LOW⚡ | sdk/python/src/donutbrowser/client.py | 1275 | def remove_extension_from_group(self, group_id: str, extension_id: str) -> ExtensionGroup: | CODE |
| LOW | sdk/python/src/donutbrowser/client.py | 833 | def delete_cookie_bot_schedule(self, profile_id: str) -> CookieBotScheduleDeleted: | CODE |
| LOW | sdk/python/src/donutbrowser/client.py | 1015 | def create_profiles_from_template( | CODE |
| LOW | src/app/page.tsx | 143 | function consistencyFromErrorParams( | CODE |
| LOW | src/components/window-resize-warning-dialog.tsx | 22 | export function WindowResizeWarningDialog({ | CODE |
| LOW | src/components/cookie-management-dialog.tsx | 106 | function initSelectionFromCookieData(data: CookieReadResult): SelectionState { | CODE |
| LOW | src/components/extension-management-dialog.tsx | 151 | export function ExtensionManagementDialog({ | CODE |
| LOW | src/components/extension-group-assignment-dialog.tsx | 36 | export function ExtensionGroupAssignmentDialog({ | CODE |
| LOW | src/components/proxy-import-dialog.tsx | 52 | function isFirstHopCipherUndecided(proxy: ParsedProxyLine): boolean { | CODE |
| 14 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sdk/tools/extract-api-paths.py | 19 | CODE | |
| LOW | sdk/python/tests/conftest.py | 1 | CODE | |
| LOW | sdk/python/tests/test_coverage.py | 9 | CODE | |
| LOW | sdk/python/tests/test_configuration.py | 3 | CODE | |
| LOW | sdk/python/tests/test_errors.py | 3 | CODE | |
| LOW | sdk/python/tests/test_session.py | 3 | CODE | |
| LOW | sdk/python/tests/fake_donut.py | 8 | CODE | |
| LOW | sdk/python/tests/test_requests.py | 10 | CODE | |
| LOW | sdk/python/src/donutbrowser/models.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/client.py | 10 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 16 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 16 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 16 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 16 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 17 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 17 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/__init__.py | 18 | CODE | |
| LOW | sdk/python/src/donutbrowser/coverage.py | 15 | CODE | |
| LOW | sdk/python/src/donutbrowser/errors.py | 27 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | donut-sync/docker-compose.yml | 16 | # `rclone serve s3` is what scripts/sync-test-harness.mjs uses too. | COMMENT |
| MEDIUM | .github/codeql/codeql-config.yml | 7 | # fixtures, and the E2E harness downloads its own driver and browser bundle, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sdk/python/src/donutbrowser/models.py | 22 | __all__ = [ | CODE |
| LOW | sdk/python/src/donutbrowser/client.py | 80 | __all__ = ["DonutClient", "RunSession", "DEFAULT_PORT", "DEFAULT_HOST"] | CODE |
| LOW | sdk/python/src/donutbrowser/__init__.py | 37 | __all__ = [ | CODE |
| LOW | sdk/python/src/donutbrowser/coverage.py | 19 | __all__ = ["OPERATIONS", "OMITTED"] | CODE |
| LOW | sdk/python/src/donutbrowser/errors.py | 32 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/dev.sh | 99 | # Check if process is still running | COMMENT |
| LOW | scripts/dev.sh | 125 | # Check if sync backend died | COMMENT |
| LOW | scripts/dev.sh | 131 | # Check if Tauri died | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | AGENTS.md | 54 | │ │ ├── browser_runner.rs # Profile launch/kill orchestration | CODE |
| MEDIUM | CLAUDE.md | 54 | │ │ ├── browser_runner.rs # Profile launch/kill orchestration | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sdk/tools/extract-api-paths.py | 83 | CODE | |
| LOW | sdk/python/src/donutbrowser/client.py | 135 | CODE | |
| LOW | sdk/python/src/donutbrowser/client.py | 214 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sdk/python/src/donutbrowser/client.py | 294 | CODE | |
| LOW | sdk/python/src/donutbrowser/client.py | 346 | CODE |