The headless browser for AI agents and web scraping
This report summarizes scanner evidence for h4ckf0r0day/obscura, a Rust project with 29,870 GitHub stars. SynthScan examined 198,393 lines of code across 324 source files, recording 363 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 2.9 (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? 293 finding(s).
Are imports declared and package/API names verified? 61 finding(s).
Are wrappers, guards, and repeated structures necessary? 97 finding(s).
Which changes need focused human review? 363 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 363 distinct pattern matches across 13 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 |
|---|---|---|---|---|
| HIGH | render-repros/test_paired_corpus.py | 82 | '\\"requested\\":null,\\"controlled_scroll\\":null}",' | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 82 | ";geometryIndex++)nodes.push(descendants[geometryIndex]);" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 86 | "(nodeIndices.has(node.parentElement)?nodeIndices.get(node.parentElement):null)," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 242 | "transformReasons.push('transform');" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 244 | "transformReasons.push('translate');" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 246 | "transformReasons.push('rotate');" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 248 | "transformReasons.push('scale');" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 250 | "transformReasons.push('perspective');" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 255 | "category.candidates.push(featureProbeCandidate(" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 259 | "truncationReasons.push('text-overflow');" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 261 | "truncationReasons.push('-webkit-line-clamp');" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 266 | "category.candidates.push(featureProbeCandidate(" | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 465 | "document_client_width:root?root.clientWidth:null," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 466 | "document_client_height:root?root.clientHeight:null," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 467 | "document_scroll_width:root?root.scrollWidth:null," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 468 | "document_scroll_height:root?root.scrollHeight:null," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 469 | "body_client_width:body?body.clientWidth:null," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 470 | "body_client_height:body?body.clientHeight:null," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 471 | "body_scroll_width:body?body.scrollWidth:null," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 472 | "body_scroll_height:body?body.scrollHeight:null}," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 473 | "fonts:{supported:!!fonts,status:fonts?fonts.status:null," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 474 | "face_count:fonts?Array.from(fonts).length:null," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 475 | "ready_at_sample:fonts?fonts.status==='loaded':null}," | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 943 | document_client_width: root ? root.clientWidth : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 944 | document_client_height: root ? root.clientHeight : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 945 | document_scroll_width: root ? root.scrollWidth : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 946 | document_scroll_height: root ? root.scrollHeight : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 947 | body_client_width: body ? body.clientWidth : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 948 | body_client_height: body ? body.clientHeight : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 949 | body_scroll_width: body ? body.scrollWidth : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 950 | body_scroll_height: body ? body.scrollHeight : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 961 | status: fonts ? fonts.status : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 962 | face_count: fonts ? Array.from(fonts).length : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 969 | image.complete && image.naturalWidth > 0).length, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 971 | image.complete && image.naturalWidth === 0).length, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 979 | : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 980 | root_class: root ? root.className : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 981 | root_data_theme: root ? root.getAttribute("data-theme") : null, | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 982 | body_class: body ? body.className : null, | CODE |
| HIGH | render-repros/paired-corpus.py | 181 | "rects:rects,error:null};" | CODE |
| HIGH | render-repros/paired-corpus.py | 182 | "}catch(error){return {selector:selector,valid:false,count:null," | CODE |
| HIGH | render-repros/paired-corpus.py | 230 | "client_rect_count:clientRectCount,computed:computed,box_quads:null};};" | CODE |
| HIGH | render-repros/paired-corpus.py | 281 | "source:null,coordinate_space:null,attempted_candidates:0," | CODE |
| HIGH | render-repros/paired-corpus.py | 916 | : null, | CODE |
| HIGH | render-repros/paired-corpus.py | 919 | : null, | CODE |
| HIGH | render-repros/paired-corpus.py | 2481 | "as unavailable and candidate quads remain null; bounding " | CODE |
| HIGH⚡ | render-repros/paired-corpus.py | 1337 | failures.push({ | STRING |
| HIGH⚡ | render-repros/paired-corpus.py | 1339 | name: error && error.name ? String(error.name) : "Error", | STRING |
| HIGH⚡ | render-repros/paired-corpus.py | 1340 | message: error && error.message | STRING |
| HIGH | scripts/ci/perf_smoke.py | 43 | "(() => {let n=0;for(let i=0;i<1500;i++){let h=document.createElement('div');document.body.append(h);let r=h.att | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/obscura-cli/src/main.rs | 41 | #[arg(long, global = true)] | COMMENT |
| LOW | crates/obscura-cli/src/main.rs | 61 | /// Pass raw flags to V8, in the same form V8/Chromium/Node accept | COMMENT |
| LOW | crates/obscura-cli/src/main.rs | 81 | #[arg(long)] | COMMENT |
| LOW | crates/obscura-cli/src/main.rs | 101 | #[arg(long, value_name = "N")] | COMMENT |
| LOW | crates/obscura-cli/src/main.rs | 121 | ready_file: Option<std::path::PathBuf>, | COMMENT |
| LOW | crates/obscura-cli/src/main.rs | 141 | quiet: bool, | COMMENT |
| LOW | crates/obscura-cli/src/main.rs | 341 | /// or passed only whitespace; in those cases V8 is left untouched. | COMMENT |
| LOW | crates/obscura-cli/src/main.rs | 1441 | // before observing image/font readiness. Obscura resolves retained | COMMENT |
| LOW | crates/obscura-cli/src/main.rs | 2441 | DEFAULT_V8_FLAGS, | COMMENT |
| LOW | crates/obscura-mcp/src/lib.rs | 181 | } | COMMENT |
| LOW | crates/obscura-mcp/src/lib.rs | 2941 | } | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 261 | /// declaration order, so the frames must go first. | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 281 | /// viewport and survives navigation, matching device-metrics emulation. | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 301 | /// encoding override on `<a>`/`<area>` hrefs in legacy-charset documents. | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 341 | // contract. Includes `Runtime.addBinding` shims so puppeteer's | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 1501 | else { | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 1901 | // a suspended prior document whose allocator may reuse them. | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 2361 | // fetch + execute loop can blow past a Puppeteer/Playwright goto | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 3301 | } | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 3741 | // Seed their image/font dependencies concurrently through the page | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 3881 | if reached_idle && !terminated { | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 5061 | /// Register a passive callback fired for every JS `fetch()`/XHR (and | COMMENT |
| LOW | crates/obscura-browser/src/page.rs | 9241 | #[tokio::test(flavor = "current_thread")] | COMMENT |
| LOW | crates/obscura-browser/src/fork_virtual_url.rs | 1 | //! Fork-only: adopt a URL the page routed to itself. | COMMENT |
| LOW | crates/obscura-browser/src/context.rs | 21 | pub platform: String, | COMMENT |
| LOW | crates/obscura-net/src/wreq_client.rs | 241 | // Honor SSL_CERT_FILE / SSL_CERT_DIR in the stealth client too. | COMMENT |
| LOW | crates/obscura-net/src/encoding.rs | 1 | //! Charset detection and decoding for HTTP response bodies. | COMMENT |
| LOW | crates/obscura-cdp/tests/concurrent_navigations.rs | 1 | //! Issue #19 smoke test: 5 parallel CDP clients each performing | COMMENT |
| LOW | crates/obscura-cdp/tests/page_close_destroys_target.rs | 1 | //! `Page.close` closed nothing: obscura fell through to its | COMMENT |
| LOW | …cdp/tests/accept_thread_survives_silent_connections.rs | 1 | //! The accept thread must survive connections that never send a request head. | COMMENT |
| LOW | crates/obscura-cdp/tests/input_mouse_event_parity.rs | 21 | #inner { width: 700px; height: 800px; } | COMMENT |
| LOW | crates/obscura-cdp/tests/concurrent_page_isolation.rs | 1 | //! #872 / #873 — concurrent pages over ONE CDP connection must each keep their | COMMENT |
| LOW | …ates/obscura-cdp/tests/dom_get_outer_html_object_id.rs | 1 | //! `DOM.getOuterHTML` is the one DOM call a CDP client makes while holding a | COMMENT |
| LOW | …obscura-cdp/tests/concurrent_connections_heavy_page.rs | 1 | //! Issue #430 regression: concurrent CDP connections driving a subresource-heavy | COMMENT |
| LOW | crates/obscura-cdp/tests/scroll_event_on_assignment.rs | 1 | //! Assigning `scrollTop` / `scrollLeft` must fire a `scroll` event. | COMMENT |
| LOW | …obscura-cdp/tests/concurrent_navigations_with_fetch.rs | 1 | //! Issue #19 hard repro: 5 parallel clients with Fetch interception enabled | COMMENT |
| LOW | …es/obscura-cdp/tests/structured_clone_crypto_parity.rs | 1 | // Regression parity for issue #389: Cloudflare managed challenges hang because | COMMENT |
| LOW | crates/obscura-cdp/tests/max_connections_cap.rs | 1 | //! `--max-connections` bounds the thread-per-connection server. | COMMENT |
| LOW | …-cdp/tests/runtime_get_properties_objectid_escaping.rs | 1 | //! `Runtime.getProperties` mints a child objectId as `parentOid + '::' + key` | COMMENT |
| LOW | crates/obscura-cdp/src/dispatch.rs | 81 | // Which sessions asked for each `Runtime.addBinding` name. A binding is a | COMMENT |
| LOW | crates/obscura-cdp/src/dispatch.rs | 101 | // Playwright locator path described in issue #51. | COMMENT |
| LOW | crates/obscura-cdp/src/dispatch.rs | 761 | // Target.sendMessageToTarget. Unwrap and recurse BEFORE acquiring the | COMMENT |
| LOW | crates/obscura-cdp/src/dispatch.rs | 781 | // | COMMENT |
| LOW | crates/obscura-cdp/src/dispatch.rs | 1081 | } | COMMENT |
| LOW | crates/obscura-cdp/src/util.rs | 1 | /// Helpers shared across CDP domain handlers. | COMMENT |
| LOW | crates/obscura-cdp/src/util.rs | 21 | /// Embed an objectId as a JS string literal, quotes included. | COMMENT |
| LOW | crates/obscura-cdp/src/util.rs | 101 | // kicks in. `file` appearing anywhere except as the leading scheme | COMMENT |
| LOW | crates/obscura-cdp/src/server.rs | 21 | // PR #36 comment 4341743194: the deferral queue in `process_with_interception` | COMMENT |
| LOW | crates/obscura-cdp/src/server.rs | 41 | const MAX_PENDING_WS_HANDOFFS: usize = 128; | COMMENT |
| LOW | crates/obscura-cdp/src/server.rs | 421 | // A connection that is accepted but never sends its request head | COMMENT |
| LOW | crates/obscura-cdp/src/server.rs | 701 | } | COMMENT |
| LOW | crates/obscura-cdp/src/server.rs | 721 | /// connections per round: 350 / 619 / 826 MiB over three rounds uncapped and | COMMENT |
| LOW | crates/obscura-cdp/src/server.rs | 1041 | /// Cap on connections parked without a request head. Bounds the accept | COMMENT |
| LOW | crates/obscura-cdp/src/server.rs | 2001 | // Issue #19 follow-up (PR #36 maintainer's fetch-intercept repro): | COMMENT |
| LOW | crates/obscura-cdp/src/domains/page.rs | 1321 | WaitUntil::NetworkIdle0 => 3, | COMMENT |
| LOW | crates/obscura-cdp/src/domains/runtime.rs | 401 | // | COMMENT |
| LOW | crates/obscura-cdp/src/domains/io.rs | 21 | fn io_stream_max_bytes() -> usize { | COMMENT |
| LOW | crates/obscura-cdp/src/domains/dom.rs | 541 | } | COMMENT |
| LOW | crates/obscura-cdp/src/domains/dom.rs | 1001 | COMMENT | |
| LOW | crates/obscura-cdp/src/domains/input.rs | 1 | use serde_json::{json, Value}; | COMMENT |
| 123 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/obscura-js/js/bootstrap.js | 272 | define(Object, 'getOwnPropertyDescriptors', function getOwnPropertyDescriptors(t) { | CODE |
| LOW | crates/obscura-js/js/bootstrap.js | 16716 | DedicatedWorkerGlobalScope: function DedicatedWorkerGlobalScope() {}, | CODE |
| LOW | render-repros/check.py | 90 | def bidirectional_edge_distance(ours_edges, chromium_edges): | CODE |
| LOW | render-repros/test_paired_corpus.py | 18 | def test_canonical_light_default_motion_environment_matches(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 25 | def test_dark_or_reduced_environment_is_rejected(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 38 | def test_bottom_expression_resolves_live_document_height(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 49 | def test_chromium_reassert_records_settled_and_final_offsets(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 77 | def test_capture_report_uses_post_settle_state(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 113 | def test_obscura_capture_exports_final_scroll_request_to_cli(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 124 | def test_obscura_capture_exports_explicit_animation_sample(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 128 | def test_paired_state_expression_is_read_only_at_capture_boundary(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 141 | def test_every_capture_expression_samples_page_state_without_scrolling(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 153 | def test_capture_report_keeps_dom_state_and_authoritative_geometry(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 170 | def test_legacy_pre_settle_report_is_not_relabelled_as_capture_state(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 189 | def test_page_state_comparison_reports_provenance_and_geometry_deltas(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 228 | def test_scroll_y_parser_accepts_bottom_and_integer(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 260 | def test_delayed_route_at_zero_settle_is_different_live_state_and_not_fidelity(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 291 | def test_delayed_route_after_settle_is_comparable_despite_hashes(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 323 | def test_matching_contentless_canvases_are_not_fidelity_evidence(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 342 | def test_live_and_deterministic_modes_with_same_dom_provenance_are_comparable(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 368 | def test_capture_boundary_instability_excludes_otherwise_matching_state(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 383 | def test_one_moderate_provenance_difference_does_not_overreject(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 416 | def test_default_state_expressions_do_not_include_probe_work(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 438 | def test_feature_discovery_is_bounded_selector_free_and_avoids_nested_scroll(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 464 | def test_obscura_records_quad_capability_instead_of_fabricated_corners(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 473 | def test_chromium_cdp_attaches_content_and_border_quads_once_per_element(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 518 | def test_missing_chromium_cdp_session_leaves_quads_null(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 532 | def test_chromium_snapshot_paints_before_host_hashing(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 596 | def test_chromium_resource_warmup_discards_one_shot_then_yields(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 616 | def test_repeatable_selectors_are_passed_safely_in_one_state_expression(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 664 | def test_probe_comparison_reports_raw_deltas_and_invalid_errors(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 758 | def test_geometry_verdict_accepts_matching_bounded_subtrees(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 812 | def test_geometry_target_accepts_repeated_angular_id_salt_variants(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 897 | def test_geometry_target_rejects_one_off_generated_id_salt(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 923 | def test_geometry_target_rejects_repeated_semantic_id_changes(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 962 | def test_geometry_verdict_excludes_different_dynamic_subtree_only(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 1029 | def test_legacy_geometry_report_is_insufficient_for_verdict(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 1062 | def test_truncated_equal_subtrees_are_insufficient_for_verdict(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 1108 | def test_feature_comparison_reports_presence_computed_geometry_and_quad_capability(self): | CODE |
| LOW | render-repros/test_paired_corpus.py | 1218 | def test_explicit_sample_pauses_and_seeks_current_animations(self): | CODE |
| LOW⚡ | render-repros/paired-corpus.py | 73 | def geometry_probe_javascript(selectors_expression): | CODE |
| LOW | render-repros/paired-corpus.py | 329 | def reassert_chromium_controlled_scroll(page, scroll): | CODE |
| LOW | render-repros/paired-corpus.py | 384 | def obscura_state_eval_expression( | CODE |
| LOW | render-repros/paired-corpus.py | 492 | def parse_obscura_capture_report(stdout): | CODE |
| LOW | render-repros/paired-corpus.py | 540 | def parse_obscura_scroll_report(stdout): | CODE |
| LOW | render-repros/paired-corpus.py | 615 | def with_controlled_scroll_environment(env, scroll): | CODE |
| LOW | render-repros/paired-corpus.py | 810 | def chromium_identity_override(session): | CODE |
| LOW | render-repros/paired-corpus.py | 1028 | def finalize_chromium_state_hashes(state): | CODE |
| LOW | render-repros/paired-corpus.py | 1045 | def attach_chromium_box_quads(session, state): | CODE |
| LOW | render-repros/paired-corpus.py | 1133 | def mark_chromium_box_quads_unavailable(state): | CODE |
| LOW | render-repros/paired-corpus.py | 1149 | def prepare_chromium_feature_probes(state, cdp_session): | CODE |
| LOW | render-repros/paired-corpus.py | 1155 | def chromium_capture_signature(state): | CODE |
| LOW | render-repros/paired-corpus.py | 1309 | def freeze_chromium_animations(page, sample_ms): | CODE |
| LOW | render-repros/paired-corpus.py | 1442 | def classify_state_comparability( | CODE |
| LOW | render-repros/paired-corpus.py | 1676 | def canonical_geometry_dom_structure(dom): | CODE |
| LOW | render-repros/paired-corpus.py | 1717 | def split_generated_id_variance(obscura_id, chromium_id): | CODE |
| LOW | render-repros/paired-corpus.py | 1861 | def compare_geometry_dom_structures(obscura_dom, chromium_dom): | CODE |
| LOW | render-repros/paired-corpus.py | 1908 | def geometry_verdict_exclusions(comparisons): | CODE |
| LOW | render-repros/paired-corpus.py | 1921 | def summarize_geometry_verdicts(comparisons): | CODE |
| LOW | render-repros/test_check.py | 20 | def test_absent_color_check_rejects_an_unexpected_component(self): | CODE |
| 28 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …-cdp/tests/runtime_get_properties_objectid_escaping.rs | 155 | // helper #709 cites as already robust - but that was the same two `replace` calls | COMMENT |
| MEDIUM | …-cdp/tests/runtime_get_properties_objectid_escaping.rs | 155 | // helper #709 cites as already robust - but that was the same two `replace` calls | COMMENT |
| MEDIUM | crates/obscura-render/src/dom.rs | 3246 | // them keeps this robust to document fragments and template wrappers. | COMMENT |
| MEDIUM | crates/obscura-render/src/dom.rs | 12364 | // Absolutely positioned descendants are not grid items. Preserve the | COMMENT |
| MEDIUM | render-repros/check.py | 194 | # enough per-engine signal for the paired harness to exclude blank or | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/obscura-cli/tests/mcp_client.rs | 124 | // ── minimal MCP client ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/obscura-cli/tests/mcp_client.rs | 229 | // ── tests ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/obscura-mcp/src/http.rs | 377 | // ── routing ────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | render-repros/paired-corpus.py | 1124 | except Exception: | CODE |
| HIGH | scripts/ci/perf_smoke.py | 114 | except ProcessLookupError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/obscura-mcp/src/lib.rs | 1660 | if (!label) label = el.getAttribute('aria-label') || el.getAttribute('placeholder') || ''; | CODE |
| LOW | crates/obscura-browser/src/accessibility.rs | 556 | return node.get_attribute("placeholder").and_then(nonempty); | CODE |
| LOW | crates/obscura-js/js/bootstrap.js | 5119 | get placeholder() { return this.getAttribute("placeholder") || ""; } | CODE |
| LOW | crates/obscura-js/js/bootstrap.js | 5120 | set placeholder(v) { this.setAttribute("placeholder", v); } | CODE |
| LOW | crates/obscura-render/src/paint.rs | 5452 | if let Some(placeholder) = node.get_attribute("placeholder") { | CODE |
| LOW | crates/obscura-render/src/dom.rs | 4132 | "placeholder" | "value" => &["placeholder-shown"], | CODE |
| LOW | crates/obscura-render/src/css.rs | 2926 | if let Some(base) = strip_pseudo_element(sel_trim, "placeholder") { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | render-repros/check.py | 205 | CODE | |
| LOW | render-repros/paired-corpus.py | 1045 | CODE | |
| LOW | render-repros/paired-corpus.py | 2245 | CODE | |
| LOW | render-repros/test_check.py | 20 | CODE | |
| LOW | scripts/ci/test_repair_v8_cache.py | 25 | CODE | |
| LOW | scripts/ci/pr_policy.py | 113 | CODE | |
| LOW | scripts/ci/perf_smoke.py | 65 | CODE | |
| LOW | scripts/ci/perf_smoke.py | 152 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/obscura-js/build.rs | 66 | // Step 1: Generate a host snapshot to extract the deno_core sidecar data. | COMMENT |
| LOW | crates/obscura-js/build.rs | 98 | // Step 2: Run cross-mksnapshot to generate the target-architecture raw blob. | COMMENT |
| LOW | crates/obscura-js/build.rs | 115 | // Step 3: Patch the snapshot version in the raw blob header. | COMMENT |
| LOW | crates/obscura-js/build.rs | 133 | // Step 4: Combine the patched raw blob with the extracted sidecar. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/obscura-js/build.rs | 66 | // Step 1: Generate a host snapshot to extract the deno_core sidecar data. | COMMENT |
| LOW | crates/obscura-js/build.rs | 98 | // Step 2: Run cross-mksnapshot to generate the target-architecture raw blob. | COMMENT |
| LOW | crates/obscura-js/build.rs | 115 | // Step 3: Patch the snapshot version in the raw blob header. | COMMENT |
| LOW | crates/obscura-js/build.rs | 133 | // Step 4: Combine the patched raw blob with the extracted sidecar. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/ci/pr_policy.py | 4 | CODE | |
| LOW | scripts/ci/pr_policy.py | 9 | CODE | |
| LOW | scripts/ci/compare_obstacle.py | 4 | CODE | |
| LOW | scripts/ci/perf_smoke.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/Markdown-extraction.md | 32 | ## For RAG / LLM context | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | render-repros/paired-corpus.py | 1113 | except Exception as error: | CODE |
| LOW | render-repros/paired-corpus.py | 1124 | except Exception: | CODE |
| LOW | render-repros/paired-corpus.py | 2701 | except Exception as error: | CODE |
| LOW | render-repros/paired-corpus.py | 2716 | except Exception as error: | CODE |