pup is the AI's own browser: a real, full Chrome on the user's desktop that the AI fully controls (a sandbox, not the user's signed-in browser). Rides Bridge; pup_* verbs open windows and tabs, navigate, screenshot, and eval JS.
The stale-injection accumulation bug: evaluateOnNewDocument scripts from every prior bridge process persist on long-lived pages and run oldest-first, so the plain boolean guard let the oldest floaty win forever, which is why John kept seeing the big hover zone after reloads that faithfully re-ran ancient code. The floaty guard is now versioned with the bridge version: the newest module tears down any elder host and rebuilds, so a reload always lands the current behavior
A dedicated pen button joins the browser toolbar (John: show the pen inline with the extension icons). Chrome permits exactly one action button per extension and no inline toolbars, so the pen is its own tiny third extension, Adom Annotate: one family tile (teal rounded tile, dark-teal pencil mark), pinned first so pen, pup, and identity read as one inline Adom toolbar. The click fires annotate via an instantly self-closing popup on the popup rail, the one extension surface proven reliable under load-extension here, resolving the window by tab URL like every other user path
The stale-injection accumulation bug: evaluateOnNewDocument scripts from every prior bridge process persist on long-lived pages and run oldest-first, so the plain boolean guard let the oldest floaty win forever, which is why John kept seeing the big hover zone after reloads that faithfully re-ran ancient code. The floaty guard is now versioned with the bridge version: the newest module tears down any elder host and rebuilds, so a reload always lands the current behavior
The stale-injection accumulation bug: evaluateOnNewDocument scripts from every prior bridge process persist on long-lived pages and run oldest-first, so the plain boolean guard let the oldest floaty win forever, which is why John kept seeing the big hover zone after reloads that faithfully re-ran ancient code. The floaty guard is now versioned with the bridge version: the newest module tears down any elder host and rebuilds, so a reload always lands the current behavior
The dashboard err chip stops counting its own plumbing (John saw a red 10 err chip on a healthy dashboard after the window reopen). Both sources were self-inflicted 404s on the dashboard page: the badge preview endpoint now answers a transparent pixel while a freshly opened window has no composed overlay yet, and the bridge answers Chromes automatic favicon.ico probe with a redirect to the dashboard icon instead of a 404. The chip now only fires on real page errors
The dashboard err chip stops counting its own plumbing (John saw a red 10 err chip on a healthy dashboard after the window reopen). Both sources were self-inflicted 404s on the dashboard page: the badge preview endpoint now answers a transparent pixel while a freshly opened window has no composed overlay yet, and the bridge answers Chromes automatic favicon.ico probe with a redirect to the dashboard icon instead of a 404. The chip now only fires on real page errors
The PowerShell deletion on ab 2.0.16 native verbs, closing the ab64 commitment: z-order, foreground reads, user-idle, window enumeration by pid and class, hwnd owner validation, parent-pid checks, send-to-back, lower-by-pid, and the taskbar attention clear are all precompiled-Rust ab calls now (roughly 20ms each versus 300ms runtime-compiled PowerShell spawns), the EnumWindows resolver and its temp-file EBUSY class are gone, the zero-caller osMinimizeToBackground and osBackgroundWatchdog are deleted, the synchronous PowerShell runner itself is deleted with zero callers remaining, internal identifiers adCommand and adPayload renamed to abCommand and abPayload, and the user-foreground doctrine got the fix John's question exposed: an ever-user-raised window stays hands-off for as long as it remains OS-foreground with no ten-minute clock, the recency window only applies once the user has left. Five scripts remain by design: the focus-raise dance x3 (works today, wishlisted for a native raise verb), base-icon extraction, and the credential import scan, all async-only
Credential import goes LIVE against AD 1.9.220's desktop_decrypt_browser_credentials. Vault (credential_vault.js) now identity-tagged: keep BOTH on a (host,username) conflict from different source accounts, newest-wins within an identity, getCredentialForUrl picks by preferred identity then most-recently-used; passwords in keytar under per-entry composite accounts, index never holds a password (offline-tested). Dashboard Import button calls the decrypt helper LOCALLY (bridge->AD direct API, never relay), handles consent_declined/elevation_declined/relay_forbidden/helper_missing, merges rows, drops plaintext, returns counts only.
Fix debugger-pause freeze: every pup tab now skips ALL debugger pauses (Debugger.setSkipAllPauses+resume) so a page's 'debugger;' statement or a stray breakpoint can never freeze the window and its 3D viewer (John's wiki viewer locked up behind a 'Debugger paused in another tab' banner). Fix overlay-paint spam: dedup desktop_taskbar — only paint when the composed icon+tooltip+target actually changed since the last paint, instead of re-sending identical overlays every few seconds and flooding AD's activity log. Enforcer now treats a genuinely no-favicon page's generic glyph as final after 3 upgrade attempts (retried on navigation) rather than re-composing it every 10s forever.
The 'NOT foregrounded by Adom' caption now stays silent when JOHN raised the window (John: 'i tend to click the taskbar icon to bring the window to the foreground, then you show this message. i only want to see it if it was some other reason'). YES pup can differentiate: a taskbar click is recent USER INPUT the OS records (GetLastInputInfo); a JavaScript/Chrome self-raise has none. The no-fault watch now checks time-since-last-input before captioning - if input happened within the last 1.5s, it assumes the user raised it and stays silent; only a raise with NO recent input (genuinely not the user) gets the caption. Errs toward silence (a JS raise coinciding with the user typing elsewhere is also suppressed - the polite direction), so the caption never fires on his click while still catching real non-user raises. Setting kept ON with its description updated.
Restore full src/ HEAD to the unified 1.9.87 tree (Kyle's 1.9.85 base + puppeteer 24.43.1 bump). The 1.9.86 subset-push had left git HEAD with Windows-only server.js and missing recorder-icon.ico + mac icons; this makes HEAD match the shipped 1.9.87 zip exactly.
The stale-injection accumulation bug: evaluateOnNewDocument scripts from every prior bridge process persist on long-lived pages and run oldest-first, so the plain boolean guard let the oldest floaty win forever, which is why John kept seeing the big hover zone after reloads that faithfully re-ran ancient code. The floaty guard is now versioned with the bridge version: the newest module tears down any elder host and rebuilds, so a reload always lands the current behavior
Close out wiki discussion 557 (startup hang after an ab cycle with orphaned Chrome windows): timeout-cap every hangable await in session recovery (CDP version probe 5s, puppeteer.connect 15s, browser.pages 10s, window.name evaluate 3s) so one wedged or orphaned Chrome window costs seconds instead of wedging the whole recovery pass, and sweep the remaining Adom Desktop and AD naming out of user-facing errors, hints, tooltips, dashboard copy, welcome and recorder pages to the canonical ab, Bridge, adom-bridge-cli names, leaving frozen code identifiers untouched
The dashboard err chip stops counting its own plumbing (John saw a red 10 err chip on a healthy dashboard after the window reopen). Both sources were self-inflicted 404s on the dashboard page: the badge preview endpoint now answers a transparent pixel while a freshly opened window has no composed overlay yet, and the bridge answers Chromes automatic favicon.ico probe with a redirect to the dashboard icon instead of a 404. The chip now only fires on real page errors
Close out wiki discussion 557 (startup hang after an ab cycle with orphaned Chrome windows): timeout-cap every hangable await in session recovery (CDP version probe 5s, puppeteer.connect 15s, browser.pages 10s, window.name evaluate 3s) so one wedged or orphaned Chrome window costs seconds instead of wedging the whole recovery pass, and sweep the remaining Adom Desktop and AD naming out of user-facing errors, hints, tooltips, dashboard copy, welcome and recorder pages to the canonical ab, Bridge, adom-bridge-cli names, leaving frozen code identifiers untouched