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.
pup_open_window page-health check counts placeholder <img> slots as broken (the broken_images_6 false alarm)
pup_open_window's page-health check counts placeholder <img> slots as broken images
Live repro (2026-08-19, Colby-ROG2): opening Hero Studio via pup_open_window returned a 200 but the verb's output led with:
⛔ THE PAGE YOU JUST OPENED IS BROKEN: broken_images_6 (HTTP 200) — it says "Hero Studio Adom TTS app · score 607 ..."
The page was not broken. Those 6 were placeholder <img> slots: the studio's live hero keeps two hidden image slots (showcase-img, fullimport-img) that CSS toggles by class, plus copies of each in the preview clones (homepage-marquee tile, index-grid card, desk-bar slot) rebuilt every render. None had a real source that failed to load; they had no src (or src=""), were display:none or 0×0, and are placeholders by construction.
This is the same false alarm that burned a review round in the kicad-bridge hero campaign (adom/hero-studio#32 point 1) and was chased through the wiki as adom/wiki#125 ("which tool emits broken_images?") — the wiki grepped its whole tree twice and found nothing, because the emitter is this verb's DOM scan. Catching it live with pup closes that hunt.
What the check should do (the wiki issue's own ask, now aimed at the right tool): count an <img> as broken only when it has a real, non-empty src that failed to load (complete && naturalWidth === 0 on a non-empty src). Skip entirely:
<img>with nosrcattribute, orsrc=""(Chrome reportsnaturalWidth 0for both;src=""even firesonerror, but neither is a broken resource).<img>with zero rendered size /display:noneand no src — a placeholder slot.
Suggested guard, one line in the scan:
const broken = [...document.querySelectorAll('img')].filter(i => i.getAttribute('src') && i.complete && i.naturalWidth === 0);
On the same Hero Studio page, that predicate returns 0 (measured: brokenRealSrc: 0 vs brokenByNaturalWidth: 3 after the studio's own cleanup, 6 before).
Why it matters beyond Hero Studio: any page with placeholder image slots (lazy-load skeletons, hidden preview clones, "generated image goes here" boxes) trips this and the verb tells the driving AI the page is BROKEN in caps, so agents report failure on healthy pages. The studio has already removed every empty-src img and stripped placeholders from its clones (hero-studio d23e7b3) so it is as clean as a page can reasonably be; the 3 structural slots that remain are exactly the kind the scan should ignore.
Not touching pup's code from the CLI thread per Colby; filing here for the owner.