Pup - the AI's own browser
Public Made by Adomby adom
pup gives your AI a real browser on your desktop that it drives completely, in the background, signed in as you: windows that never jump in front of your work, one shared profile that learns your logins, and every window labeled on the taskbar with its AI thread's name.
st.com: ERR_HTTP2_PROTOCOL_ERROR on every request after the first in pup (CfT 148) while nb (Chrome 152) loads fine; renderCheck says ok on chrome-error://
Symptom
st.com loads once in pup, then every further navigation on the domain fails with
ERR_HTTP2_PROTOCOL_ERROR (chrome-error://chromewebdata/), including the site root. The
identical URLs load normally in nb (the user's real Chrome) at the same minute, and
nbrowser_fetch_url pulls the 3.4 MB datasheet PDF from the same origin with HTTP 200.
Environment
- Adom Bridge 2.1.104 (253743b6-dirty), Rust shell; Windows box AdomLapper; caller in the cloud container.
- pup (puppeteer bridge) 2.0.464, browser
chrome-for-testing(cache)build 148.0.7778.97, UAChrome/148.0.0.0, durable adom-you profile, background window, 32 default permissions applied. - nb (native-browser) 0.16.14, extension 0.2.10, profile
chrome:[email protected], UAChrome/152.0.0.0. - Observed 2026-09-12 ~08:20–08:45 CT, thread "ranch ToF sensor".
Repro (verbatim sequence)
pup_open_window {url:"https://www.st.com/en/imaging-and-photonics-solutions/vl53l9cx.html"}→ ok, 4.8 s, page rendered,pup_evalread the full product description. First load works.pup_open_tab {url:"https://www.st.com/en/evaluation-tools/steval-vl53l9.html"}→ body 207 chars:This site can't be reached … ERR_HTTP2_PROTOCOL_ERROR.pup_reloadon it → same.pup_open_tab {url:"https://www.st.com/resource/en/data_brief/vl53l9cx.pdf"}→ the PDF DID render (screenshot 41 KB, 2510×1358). So/resource/(CDN) is fine; the HTML site is what fails.- On tab-1,
pup_evalthat setlocation.hash="#tools-software"→ the SPA reloaded and landed onchrome-error://chromewebdata/withERR_HTTP2_PROTOCOL_ERROR. From here on tab-1 never recovered. pup_navigate {tabId:"tab-1", url:"…/vl53l9cx.html"}(no hash) →renderCheck.ok:true, then 2 s later the tab ischrome-error://again.pup_open_tab {url:"https://www.st.com/content/st_com/en.html"}(site root) →ERR_HTTP2_PROTOCOL_ERROR.- Same minute,
nbrowser_open_window {profile:"chrome:[email protected]", url:"…/vl53l9cx.html#tools-software"}→ loads,nbrowser_evalreturns the whole Tools & Software panel (STSW-IMG052/053/054, X-CUBE-53L9A1, STEVAL-VL53L9, X-NUCLEO-53L9A1).nbrowser_fetch_urlonhttps://www.st.com/resource/en/datasheet/vl53l9cx.pdf→ 200, application/pdf, 4 478 756 b64 chars.
What it looks like
st.com sits behind Akamai Bot Manager. ERR_HTTP2_PROTOCOL_ERROR on every request after the first
burst, root included, while the CDN path still serves, is the classic "edge sent RST_STREAM/GOAWAY to a
client it fingerprinted" pattern, not a site outage. Differences between the two clients that the edge
can see:
- UA major version 148 (cached CfT) vs 152 (the user's installed Chrome) — four majors behind.
- CfT TLS/H2 fingerprint + the automation launch flags vs a stock Chrome profile with history/cookies.
- pup fired ~6 requests in ~90 s from a cold profile; nb had a warm, trusted profile.
I can't tell from outside which of these trips it, but nb proves it is the client, not the network or the page.
Two secondary problems this exposed
renderCheck.ok:trueon achrome-error://page. Steps 2, 5 and 6 all returnedrenderCheck:{ok:true, title:"www.st.com", signals:[]}with the body being Chrome's "This site can't be reached" text. That page should trip a signal (chrome_error_page,net_error:ERR_HTTP2_PROTOCOL_ERROR) andok:false, otherwise_verifyRenderis telling the caller the opposite of the truth.pup_downloadtimed out at 60 s with nothing to poll.pup_download {tabId:"tab-3", url:"…/datasheet/vl53l9cx.pdf"}→timed_out, stillRunning:true, statusVerb:"pup_readiness", butpup_readinessshowedactive:[]and no download ever appeared. (The same PDF came back in <1 s vianbrowser_fetch_url.)
Asks
- When a navigation lands on
chrome-error://with a net error, returnok:false+ the error code inrenderCheck.signals, and add a_hintthat names the fallback:nbrowser_open_window/nbrowser_fetch_urlfor vendor sites that fingerprint the client. Most electronics vendors (st.com, mouser.com — which returned "Access to this page has been denied" to pup in this same session — ti.com, digikey.com) block non-human clients on purpose; the hint is the moment the AI learns to switch lanes instead of retrying. - Keep the cached CfT within one major of the installed Chrome (or refresh it when the installed browser is newer) so the UA/fingerprint isn't years stale to a bot manager.
- Consider a per-domain HTTP/1.1 fallback (
--disable-http2is too blunt; a retry once withUpgradedisabled on that origin would confirm whether it is the H2 fingerprint). pup_download: either register the download inpup_readiness.active[]so the poll hint is true, or fail fast with the real cause.
Happy to re-run any of this on request; the pup window ranch-ToF-sensor and the nb session
tof-st-compare were closed after capturing the above.