Rebases @garrytan's PR #1112 (Apr 2026, abandoned) onto the current
browse/src/stealth.ts contract. The existing minimal "codex narrowed"
stealth (webdriver-mask + AutomationControlled launch arg) stays the
default. PR #1112's six additional patches are added behind an opt-in
GSTACK_STEALTH=extended env flag.
Extended-mode patches (applied AFTER the default mask, in order):
1. delete navigator.webdriver from prototype (not just the getter —
detectors check `"webdriver" in navigator`)
2. WebGL renderer spoof to Apple M1 Pro (SwiftShader was the #1
software-GPU tell in containers)
3. navigator.plugins returns a PluginArray-prototype-passing array
with MimeType objects and namedItem()
4. window.chrome populated with chrome.app, chrome.runtime,
chrome.loadTimes(), chrome.csi() with realistic shapes
5. navigator.mediaDevices backfilled when headless drops it
6. CDP cdc_*-prefixed window globals cleared
Why opt-in: the default mode's contract is fingerprint CONSISTENCY,
which protects against detectors that flag spoofing mismatch. Extended
mode actively lies about the environment; sites that reflect on these
properties can break. Users who hit detection in default mode can flip
GSTACK_STEALTH=extended for SannySoft 100% pass-rate.
Twenty unit tests pin the env-flag semantics, all six patches' code
presence, and the applyStealth wiring order. Live SannySoft pass-rate
verification stays in the periodic-tier E2E suite.
Contributed by @garrytan via #1112 (rebased — original PR opened
before the codex-narrowed minimum landed; rebase preserves the
narrowed default while adding the SannySoft-passing path as opt-in).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>