Repository Analysis

SeleniumHQ/docker-selenium

Provides a simple way to run Selenium Grid with Chrome, Firefox, and Edge using Container Platform, making it easier to perform browser automation at scale

2.9 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of SeleniumHQ/docker-selenium, a Go project with 8,640 GitHub stars. SynthScan v2.0 examined 105,072 lines of code across 2757 source files, recording 212 pattern matches distributed across 14 syntactic categories. The overall adjusted score of 2.9 places this repository in the Likely human-written 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).

2.9
Adjusted Score
2.9
Raw Score
100%
Time Factor
2026-07-14
Last Push
8.6K
Stars
Go
Language
105.1K
Lines of Code
2.8K
Files
212
Pattern Hits
2026-07-14
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

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.

Severity Breakdown

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.

CRITICAL 1HIGH 0MEDIUM 37LOW 174

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 212 distinct pattern matches across 14 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.

Decorative Section Separators19 hits · 75 pts
SeverityFileLineSnippetContext
MEDIUM.monitoring/exporter/graphql.go70// ── GraphQL wire types ────────────────────────────────────────────────────────COMMENT
MEDIUM.monitoring/exporter/graphql.go137// ── Capability / stereotype parsing ──────────────────────────────────────────COMMENT
MEDIUM.monitoring/exporter/graphql.go165// ── HTTP client ───────────────────────────────────────────────────────────────COMMENT
MEDIUMVideo/entry_point.sh2#==============================================COMMENT
MEDIUMVideo/entry_point.sh5#==============================================COMMENT
MEDIUMNodeChrome/install-chromedriver.sh3#============================================COMMENT
MEDIUMNodeChrome/install-chromedriver.sh5#============================================COMMENT
MEDIUMNodeChrome/install-chromedriver.sh10#============================================COMMENT
MEDIUMNodeChrome/update-chrome-components.sh3#============================================COMMENT
MEDIUMNodeChrome/update-chrome-components.sh5#============================================COMMENT
MEDIUMNodeChrome/update-chrome-components.sh8#============================================COMMENT
MEDIUMNodeChrome/install-chrome-for-testing.sh3#============================================COMMENT
MEDIUMNodeChrome/install-chrome-for-testing.sh5#============================================COMMENT
MEDIUMNodeChrome/install-chrome-for-testing.sh11#============================================COMMENT
MEDIUMNodeChrome/install-chrome.sh3#============================================COMMENT
MEDIUMNodeChrome/install-chrome.sh5#============================================COMMENT
MEDIUMNodeChrome/install-chrome.sh10#============================================COMMENT
MEDIUMBase/entry_point.sh4#==============================================COMMENT
MEDIUMBase/entry_point.sh7#==============================================COMMENT
Excessive Try-Catch Wrapping48 hits · 68 pts
SeverityFileLineSnippetContext
LOWREADME.md916except Exception as exc:CODE
LOWVideo/video_graphQLQuery.py86 except Exception:CODE
LOWVideo/video_graphQLQuery.py88 except Exception:CODE
LOWVideo/video_graphQLQuery.py104 except Exception:CODE
LOWVideo/video_graphQLQuery.py108 except Exception:CODE
LOWVideo/video_graphQLQuery.py125 except Exception:CODE
LOWVideo/video_graphQLQuery.py150 except Exception:CODE
LOWVideo/video_service.py419 except Exception as e:CODE
LOWVideo/video_service.py510 except Exception as e:CODE
LOWVideo/video_service.py628 except Exception as e:CODE
LOWVideo/video_service.py702 except Exception as e:CODE
LOWVideo/video_service.py741 except Exception as e:CODE
LOWVideo/video_service.py842 except Exception as exc:CODE
LOWVideo/video_service.py1024 except Exception:CODE
LOWVideo/video_service.py1122 except Exception:CODE
LOWVideo/video_service.py1138 except Exception as e:CODE
LOWtests/test.py27 except Exception as e:CODE
LOWtests/test.py164 except Exception as e:CODE
LOWtests/test.py169 except Exception as e:CODE
LOWtests/test.py321 except Exception as e:CODE
LOWtests/test.py358 except Exception as e:CODE
LOWtests/test.py369 except Exception as e:CODE
MEDIUMtests/build-backward-compatible/add_selenium_version.py18 print(f"Error: Version '{version}' is not in the correct format (e.g., 4.36.0)")CODE
MEDIUMtests/build-backward-compatible/add_selenium_version.py39 print(f"Error reading YAML file: {e}")CODE
MEDIUMtests/charts/templates/test.py19 print("Error in configuration file: ", error)CODE
MEDIUMtests/charts/templates/test.py12def load_template(yaml_file):CODE
LOWtests/charts/templates/test.py586 except Exception as e:CODE
MEDIUMtests/charts/templates/test_scaled_job.py18 print("Error in configuration file: ", error)CODE
LOWtests/charts/templates/test_scaled_job.py43 except Exception as e:CODE
MEDIUMtests/charts/templates/test_scaled_job.py11def load_template(yaml_file):CODE
LOWtests/SmokeTests/__init__.py53 except Exception as e:CODE
LOWtests/AutoscalingTests/common.py94 except Exception as e:CODE
LOWtests/SeleniumTests/__init__.py149 except Exception as e:CODE
LOWtests/SeleniumTests/__init__.py210 except Exception as e:CODE
LOWtests/SeleniumTests/__init__.py260 except Exception as e:CODE
LOWtests/SeleniumTests/__init__.py315 except Exception as e:CODE
LOWtests/SeleniumTests/__init__.py363 except Exception as e:CODE
LOWtests/SeleniumTests/__init__.py376 except Exception as e:CODE
MEDIUMtests/SeleniumTests/__init__.py156def setUp(self):CODE
MEDIUMtests/SeleniumTests/__init__.py217def setUp(self):CODE
MEDIUMtests/SeleniumTests/__init__.py267def setUp(self):CODE
MEDIUMscripts/release_preparation/update_versions.py103 print("Error: Could not locate Makefile", file=sys.stderr)CODE
MEDIUMscripts/release_preparation/update_versions.py108 print(f"Error: {makefile_path} does not exist", file=sys.stderr)CODE
MEDIUMscripts/release_preparation/update_versions.py114 print(f"Error: {exc}", file=sys.stderr)CODE
LOWscripts/generate_list_env_vars/extract_env.py22 except Exception as e:CODE
MEDIUMscripts/generate_list_env_vars/extract_env.py23 print(f"Error reading file {file_path}: {e}")CODE
LOWscripts/generate_list_env_vars/extract_env.py40 except Exception as e:CODE
MEDIUMscripts/generate_list_env_vars/extract_env.py41 print(f"Error reading file {file_path}: {e}")CODE
Over-Commented Block46 hits · 40 pts
SeverityFileLineSnippetContext
LOWdocker-compose-v3-node-all-browsers.yml21# - SE_NODE_STEREOTYPE_CHROME=COMMENT
LOWNodeKubernetes/config.toml1[kubernetes]COMMENT
LOWNodeKubernetes/config.toml21# image tag which has video recorder/uploader inline).COMMENT
LOWNodeKubernetes/config.toml41# resource-limits = "cpu=1,memory=1Gi"COMMENT
LOWNodeChrome/install-chromedriver.sh1#!/bin/bashCOMMENT
LOWNodeChrome/install-chrome-for-testing.sh1#!/bin/bashCOMMENT
LOWNodeChrome/install-chrome.sh1#!/bin/bashCOMMENT
LOWtests/docker-compose-v3-test-parallel.yml121 timeout: 30sCOMMENT
LOWtests/docker-compose-v3-test-parallel.yml141# - SELENIUM_GRID_PROTOCOL=${SELENIUM_GRID_PROTOCOL}COMMENT
LOWtests/charts/ci/base-recorder-values.yaml1# Use different container sidecar for uploaderCOMMENT
LOWcharts/selenium-grid/multiple-nodes-platform-relay.yaml1# Utilize Relay Node to set up hybrid Autoscaling Grid with using on-premise and test cloud provider (e.g. SauceLabs, BrCOMMENT
LOWcharts/selenium-grid/multiple-nodes-platform-relay.yaml61 enabled: falseCOMMENT
LOWcharts/selenium-grid/multiple-nodes-platform.yaml1# In this case, each browser node has 2 scaler triggers, one for any platform and one for specific Linux.COMMENT
LOWcharts/selenium-grid/values.yaml41 type: RecreateCOMMENT
LOWcharts/selenium-grid/values.yaml61 # -- Specify number of max sessions per node. Can be overridden by individual component (this is also set to scaler COMMENT
LOWcharts/selenium-grid/values.yaml861 # -- Custom annotations for Session Queue serviceCOMMENT
LOWcharts/selenium-grid/values.yaml881 # name: secret-nameCOMMENT
LOWcharts/selenium-grid/values.yaml981 # valueFrom:COMMENT
LOWcharts/selenium-grid/values.yaml1121 setReplicasInSpec: trueCOMMENT
LOWcharts/selenium-grid/values.yaml1181 # When enabled, the chart deploys the external scaler (Deployment + Service) and switches node triggers toCOMMENT
LOWcharts/selenium-grid/values.yaml1261 # preStop:COMMENT
LOWcharts/selenium-grid/values.yaml1341 # -- SecurityContext for chrome-node containerCOMMENT
LOWcharts/selenium-grid/values.yaml1361 # valueFrom:COMMENT
LOWcharts/selenium-grid/values.yaml1441 # persistentVolumeClaim:COMMENT
LOWcharts/selenium-grid/values.yaml1481 # It means it will add a new container to the deployment itself.COMMENT
LOWcharts/selenium-grid/values.yaml1541 # -- Request resources for firefox-node podsCOMMENT
LOWcharts/selenium-grid/values.yaml1561 extraEnvironmentVariables: []COMMENT
LOWcharts/selenium-grid/values.yaml1581 # -- Set specific loadBalancerIP when serviceType is LoadBalancer (see https://kubernetes.io/docs/concepts/services-COMMENT
LOWcharts/selenium-grid/values.yaml1641 extraVolumes: []COMMENT
LOWcharts/selenium-grid/values.yaml1681 # It should be set using the --set-json optionCOMMENT
LOWcharts/selenium-grid/values.yaml1761 # - ip: "203.0.113.0"COMMENT
LOWcharts/selenium-grid/values.yaml1781 # -- Create a service for nodeCOMMENT
LOWcharts/selenium-grid/values.yaml1841 # - name: my-extra-volumeCOMMENT
LOWcharts/selenium-grid/values.yaml1901 # -- NOTE: Only used when autoscaling.enabled is falseCOMMENT
LOWcharts/selenium-grid/values.yaml1921COMMENT
LOWcharts/selenium-grid/values.yaml1961 hostAliases:COMMENT
LOWcharts/selenium-grid/values.yaml1981 # name: proxy-settingsCOMMENT
LOWcharts/selenium-grid/values.yaml2041 deregisterLifecycle:COMMENT
LOWcharts/selenium-grid/values.yaml2121 enabled: falseCOMMENT
LOWcharts/selenium-grid/values.yaml2141 # RCLONE_CONFIG_S3_NO_CHECK_BUCKET: "true"COMMENT
LOWcharts/selenium-grid/values.yaml2181 # httpGet:COMMENT
LOWcharts/selenium-grid/values.yaml2221 args: []COMMENT
LOWcharts/selenium-grid/values.yaml2321 tolerations: []COMMENT
LOWcharts/selenium-grid/values.yaml2341# matchLabels:COMMENT
LOWNodeDocker/config.toml1[docker]COMMENT
LOWNodeDocker/config.toml21COMMENT
Hyper-Verbose Identifiers33 hits · 33 pts
SeverityFileLineSnippetContext
LOWtests/test.py279def set_from_image_base_for_standalone(container):CODE
LOWtests/test.py293def standalone_browser_container_matches(container):CODE
LOW…ackward-compatible/fetch_chrome_for_testing_version.py10def fetch_chrome_for_testing_versions():CODE
LOWtests/charts/templates/test.py48 def test_ingress_traefik_annotations(self):CODE
LOWtests/charts/templates/test.py80 def test_ingress_traefik_servers_transport(self):CODE
LOWtests/charts/templates/test.py123 def test_sub_path_append_to_node_grid_url_and_basic_auth_should_not_include(self):CODE
LOWtests/charts/templates/test.py134 def test_sub_path_set_to_grid_env_var(self):CODE
LOWtests/charts/templates/test.py146 def test_graphql_url_for_autoscaling_constructed_without_basic_auth_in_url(self):CODE
LOWtests/charts/templates/test.py159 def test_distributor_new_session_thread_pool_size(self):CODE
LOWtests/charts/templates/test.py173 def test_disable_ui_set_to_grid_env_var(self):CODE
LOWtests/charts/templates/test.py185 def test_log_level_set_to_logging_config_map(self):CODE
LOWtests/charts/templates/test.py217 def test_node_port_set_when_service_type_is_node_port(self):CODE
LOWtests/charts/templates/test.py235 def test_all_metadata_name_is_prefixed_with_release_name(self):CODE
LOWtests/charts/templates/test.py245 def test_extra_script_import_to_node_configmap(self):CODE
LOWtests/charts/templates/test.py258 def test_extra_script_import_to_uploader_configmap(self):CODE
LOWtests/charts/templates/test.py269 def test_extra_script_import_to_recorder_configmap(self):CODE
LOWtests/charts/templates/test.py280 def test_upload_conf_mount_to_video_container(self):CODE
LOWtests/charts/templates/test.py343 def test_enable_leftovers_cleanup(self):CODE
LOWtests/charts/templates/test.py366 def test_update_strategy_in_all_components(self):CODE
LOWtests/charts/templates/test.py455 def test_scaler_triggers_auth_wiring(self):CODE
LOWtests/charts/templates/test.py508 def test_monitoring_service_monitor(self):CODE
LOWtests/charts/templates/test.py523 def test_monitoring_grafana_dashboards(self):CODE
LOWtests/charts/templates/test.py542 def test_monitoring_metrics_port(self):CODE
LOWtests/charts/templates/test.py556 def test_monitoring_metrics_container_port(self):CODE
LOWtests/charts/templates/test_scaled_job.py22 def test_scaled_job_has_zero_limits(self):CODE
LOWtests/AutoscalingTests/common.py84def create_sessions_in_parallel(new_request_sessions):CODE
LOWtests/SeleniumTests/__init__.py86 def test_select_from_a_dropdown(self):CODE
LOWtests/SeleniumTests/__init__.py102 def test_visit_basic_auth_secured_page(self):CODE
LOWtests/SeleniumTests/__init__.py320 def test_title_and_maximize_window(self):CODE
LOWtests/SeleniumTests/__init__.py385 def test_parallel_autoscaling(self):CODE
LOWtests/SeleniumTests/__init__.py395 def test_parallel_autoscaling(self):CODE
LOWscripts/generate_list_env_vars/extract_env.py8def extract_variables_from_shell_scripts(directory_path):CODE
LOWscripts/generate_list_env_vars/extract_env.py26def extract_variables_from_dockerfiles(directory_path):CODE
Redundant / Tautological Comments14 hits · 26 pts
SeverityFileLineSnippetContext
LOWgenerate_sbom.sh10# Check if there are any imagesCOMMENT
LOWgenerate_chart_changelog.sh28 # Check if there are tagsCOMMENT
LOWVideo/video_nodeQuery.py50 # Check if enabling to record video; fall back to SE_RECORD_VIDEO when capability is absentCOMMENT
LOWVideo/video_nodeQuery.py58 # Check if video file name is set via capabilitiesCOMMENT
LOWVideo/video_nodeQuery.py66 # Check if append session ID to the video file name suffixCOMMENT
LOWVideo/video_nodeQuery.py75 # Output the values for other scripts consumingCOMMENT
LOWNodeBase/start-selenium-node.sh3# Check if Chrome components update is enabledCOMMENT
LOWNodeChrome/update-chrome-components.sh12# Check if update is enabled via environment variableCOMMENT
LOWNodeChrome/update-chrome-components.sh20# Check if we have sudo accessCOMMENT
LOWStandalone/start-selenium-standalone.sh5# Check if Chrome components update is enabledCOMMENT
LOW…/build-backward-compatible/update_workflow_versions.py100 # Check if we're in the browser-versions sectionCOMMENT
LOWtests/build-backward-compatible/add_selenium_version.py42 # Check if version already existsCOMMENT
LOWcharts/selenium-grid/certs/add-jks-helper.sh80 # Check if the certificate is present in the cacerts fileCOMMENT
LOWcharts/selenium-grid/certs/add-cert-helper.sh91 # Check if the certificate is present in the bundleCOMMENT
Deep Nesting23 hits · 20 pts
SeverityFileLineSnippetContext
LOWVideo/video_graphQLQuery.py45CODE
LOWVideo/video_service.py342CODE
LOWVideo/video_service.py554CODE
LOWVideo/video_service.py657CODE
LOWVideo/video_service.py705CODE
LOWVideo/video_service.py801CODE
LOWVideo/video_service.py901CODE
LOWCHANGELOG/generate-matrix-readme.py45CODE
LOWCHANGELOG/generate-matrix-readme.py70CODE
LOWtests/test.py140CODE
LOWtests/test_grid_ui.py21CODE
LOW…/build-backward-compatible/update_workflow_versions.py91CODE
LOWtests/build-backward-compatible/fetch_version.py31CODE
LOWtests/charts/templates/test.py134CODE
LOWtests/charts/templates/test.py159CODE
LOWtests/charts/templates/test.py173CODE
LOWtests/charts/templates/test.py185CODE
LOWtests/charts/templates/test.py280CODE
LOWtests/charts/templates/test.py431CODE
LOWtests/charts/templates/test.py478CODE
LOWtests/SeleniumTests/__init__.py341CODE
LOWscripts/generate_list_env_vars/extract_env.py8CODE
LOWscripts/generate_list_env_vars/extract_env.py26CODE
Unused Imports12 hits · 12 pts
SeverityFileLineSnippetContext
LOWVideo/video_graphQLQuery.py3CODE
LOWVideo/video_graphQLQuery.py9CODE
LOW…ackward-compatible/fetch_chrome_for_testing_version.py1CODE
LOWtests/SmokeTests/__init__.py3CODE
LOWtests/AutoscalingTests/common.py5CODE
LOWtests/AutoscalingTests/common.py8CODE
LOWtests/AutoscalingTests/test_scale_chaos.py1CODE
LOWtests/AutoscalingTests/test_scale_chaos.py7CODE
LOWtests/AutoscalingTests/test_scale_chaos.py9CODE
LOWtests/AutoscalingTests/test_scale_up.py1CODE
LOWtests/AutoscalingTests/test_scale_up.py7CODE
LOWtests/AutoscalingTests/test_scale_up.py9CODE
Self-Referential Comments3 hits · 10 pts
SeverityFileLineSnippetContext
MEDIUMgenerate_chart_changelog.sh56 # Create a temporary fileCOMMENT
MEDIUMtests/build-backward-compatible/add_selenium_version.py47 # Create the new version entryCOMMENT
MEDIUMcharts/selenium-grid/certs/gen-cert-helper.sh109 # Create the specified directory if it does not existCOMMENT
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICALREADME.md2072at okhttp3.internal.connection.okhttps.internal.connection.RealConnection.connect(RealConnection.kt:207)CODE
Modern Structural Boilerplate5 hits · 6 pts
SeverityFileLineSnippetContext
LOWVideo/video_service.py59logger = logging.getLogger(__name__)CODE
LOWtests/test.py50logger = logging.getLogger(__name__)CODE
LOWtests/build-backward-compatible/builder.py7logger = logging.getLogger(__name__)CODE
LOWtests/charts/templates/test.py9logger = logging.getLogger(__name__)CODE
LOWtests/charts/templates/test_scaled_job.py8logger = logging.getLogger(__name__)CODE
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMVideo/video.sh224 # which handles it uniformly for both shell and event-driven modes.COMMENT
Verbosity Indicators3 hits · 2 pts
SeverityFileLineSnippetContext
LOWCHANGELOG/generate-matrix-readme.py192 # Step 1: Archive old versionsSTRING
LOWCHANGELOG/generate-matrix-readme.py197 # Step 2: Scan changelog directoriesSTRING
LOWCHANGELOG/generate-matrix-readme.py203 # Step 3: Generate READMESTRING
Structural Annotation Overuse3 hits · 2 pts
SeverityFileLineSnippetContext
LOWCHANGELOG/generate-matrix-readme.py192 # Step 1: Archive old versionsSTRING
LOWCHANGELOG/generate-matrix-readme.py197 # Step 2: Scan changelog directoriesSTRING
LOWCHANGELOG/generate-matrix-readme.py203 # Step 3: Generate READMESTRING
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWscripts/generate_list_env_vars/extract_env.py73# Example usageCOMMENT