Automation signal and Chrome settings
In the controlled matrix, outcomes follow the native value of navigator.webdriver, independently of the presence of --enable-automation. This finding concerns the tested conditions, not a universal Google rule.
Factorial comparison
Chrome 153.0.8010.52, same binary and SHA-256, same VPS, unchanged IPv4 and IPv6 addresses, same query “musée du Louvre site officiel”, fr-FR/fr language, 1280 × 720 viewport. Each navigation uses a fresh profile. The getter remains native; its value is checked before and after navigation. CDP is connected in every cell.
The Blink AutomationControlled feature is disabled in all four combinations. The CDP command Emulation.setAutomationOverride controls the native signal independently of the flag. Two blocks each contain all four combinations in a randomised order fixed before execution (seed 20261019). Two ordinary controls, without feature disabling or the flag, bracket the trials.
| --enable-automation flag | Native webdriver | Outcome |
|---|---|---|
| Absent | false | 2 results out of 2 |
| Present | false | 2 results out of 2 |
| Absent | true | 2 refusals out of 2 |
| Present | true | 2 refusals out of 2 |
Both controls display results. All ten navigations are complete, without technical errors or changes to exit addresses. No independent flag effect is distinguishable in this matrix. The native-signal intervention supports a causal role in this environment; it does not reveal the server score or attribute the verdict to a particular VM read.
Launch-setting and browser-control checks
The browser and launch-setting comparison contains 37 navigations, separate from the factorial matrix. Options come from the Chrome process launched by Playwright 1.51, excluding the control channel, profile and starting URL.
| Configuration | Observation |
|---|---|
| Ordinary Chrome with a debugging port open | Results, with or without Playwright attached |
| List of 17 disabled features | 3 results out of 3 |
| Other 29 Playwright settings | 3 results out of 3 |
| --enable-automation alone, without signal intervention | 1 refusal; webdriver=true |
| All 31 settings, without Playwright | Refusal |
The groups cover all 31 settings; combining the 30 settings without the flag was not tested. Refusals in this launch-setting comparison are measured only once per configuration. Flag and grouped-option controls also verify the IPv6 exit used by Chrome; the general Chrome/Camoufox and debugging-port comparisons check IPv4 only.
A JavaScript replacement getter returning false also receives a refusal, while the following native control displays results. This replacement is therefore not a neutral intervention and must be distinguished from the native control in the matrix.
Classification and scope
Accepted documents display Search results in HTTP 200 with #search. Refusals take the main document to /sorry, followed by a 429 response. Classification cross-checks navigation, content and screenshots; a background request to /sorry is not a main-document refusal. In the flag-only comparison, the verification page is followed by a reload about 0.2 seconds later.
Two repetitions per cell, one machine, network and query: these counts cannot estimate a generalisable detection rate. Fresh profiles are not bit-for-bit identical and server states are uncontrolled. Interventions remain browser commands in an environment where AutomationControlled is disabled. Neither the signal’s uniqueness in Google’s decision nor its sufficiency across all environments is established. No CAPTCHA is solved. Profiles, cookies, tokens and raw traces remain private.