Pup - Puppeteer Bridge
Public Made by Adomby adom
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.
Packages 1150
Installable versions you add with adom-wiki. Semver and dist-tags resolve which one you get; the latest is pinned on top.
All versions
Windows survive an upgrade AND the user's close is final. pup relaunches a missing window only when it knows the browser died for this pass (it ended it for an upgrade or restart, it crashed, or it was already dead at boot); any other missing window was closed and is forgotten. Closing a window during a relaunch queue cancels the queued relaunches of that thread (its taskbar icon). 2.0.681 dropped every window after the first on an upgrade; 2.0.680 and earlier reopened windows the user closed while pup restarted (John, AdomLapper, 2026-09-23). Promoted to public on 2026-09-23.
adom-wiki pkg install adom/[email protected]Windows survive an upgrade AND the user's close is final. pup relaunches a missing window only when it knows the browser died for this pass (it ended it for an upgrade or restart, it crashed, or it was already dead at boot); any other missing window was closed and is forgotten. Closing a window during a relaunch queue cancels the queued relaunches of that thread (its taskbar icon). 2.0.681 dropped every window after the first on an upgrade; 2.0.680 and earlier reopened windows the user closed while pup restarted (John, AdomLapper, 2026-09-23).
adom-wiki pkg install adom/[email protected]The user's close is final during a restore too: closing a window while an upgrade relaunches a thread's windows cancels every queued relaunch of that thread (the same taskbar icon), and each relaunch first picks up closes reported since the last one. Before, closing a thread's icon mid-queue brought its next window back 13-28 s later (John, AdomLapper, 2026-09-23). Plus 2.0.681: a window is restored only when its browser is gone.
adom-wiki pkg install adom/[email protected]A window is restored only when its browser is GONE (crash, sleep, upgrade). If the browser is alive and does not have the window, the window was CLOSED and pup forgets it. Before, any missing window read as a crash to repair, so windows the user closed while pup was restarting came back at the next boot (John, AdomLapper, 2026-09-23).
adom-wiki pkg install adom/[email protected]The cache prune never races a browser install: it refuses while one is in flight (the boot pass waits for it) and never touches a folder written in the last 5 minutes, so a first install unpacking into .partial cannot be deleted under it. Plus everything in 2.0.679.
adom-wiki pkg install adom/[email protected]pup accepts only plain-version folders as a usable browser build, so a half-unpacked .partial folder or a renamed copy is never launched (found while testing ab 2.1.153's prewarm of pup, which works end to end: ab calls pup_prewarm, pup downloads and unpacks the pinned build in the background, ab records ok). Plus everything in 2.0.678.
adom-wiki pkg install adom/[email protected]pup-bridge#126: bridge.json declares prewarm.verb pup_prewarm (timeout 900 s), so ab 2.1.153+ asks pup to fetch its browser in the background once per installed version instead of the first window paying for it. Plus everything in 2.0.677.
adom-wiki pkg install adom/[email protected]pup-bridge#125: pup prunes its browser download cache a minute after every boot and on demand (pup_cache_prune, with dryRun): superseded builds, the Node-era headless-shell builds and partial downloads go; the pinned build, the newest complete build when the pinned one is missing, and anything a running process or the default browser uses are kept. Plus everything in 2.0.676.
adom-wiki pkg install adom/[email protected]pup-bridge#124 (one verb surface, image fullPath/safePath, ok and output fields on every reply) plus two recovery fixes for multi-tab windows after an upgrade: a new extension-lane tab opens only in the window pup names (the extension refuses rather than guess; tabs had landed in another thread's window), and reopened tabs are de-duplicated by exact URL (stripping the query had dropped different pages on one path).
adom-wiki pkg install adom/[email protected]pup-bridge#124 (one verb surface, image fullPath/safePath, ok and output fields on every reply) plus: a new tab on the extension lane opens only in the window pup names (a live tab of it, or its Chrome window id); the extension refuses rather than guess. After an upgrade, recovery used to reopen a window's extra tabs into another thread's window (AdomLapper, 2026-09-22).
adom-wiki pkg install adom/[email protected]pup-bridge#124: one verb surface (bridge.json and pup_describe generated from the same 96 routed verbs; the build stops if one lacks a catalog entry; pup_describe carries verbCount and its notes). Every image reply carries ab's fullPath and safePath so ab auto-pulls the picture. pup now lifts its output fields onto every reply and always states ok true/false itself, because ab 2.1.14x stopped doing both: ok had vanished from error replies and pup_record_stop reported the call time as the recording's duration.
adom-wiki pkg install adom/[email protected]pup-bridge#124: one verb surface (bridge.json and pup_describe generated from the same 96 routed verbs; the build stops if one lacks a catalog entry; pup_describe carries verbCount and its notes). Every image reply carries ab's fullPath and safePath so ab auto-pulls the picture. And pup now lifts the fields of its output block onto every reply itself, because ab 2.1.14x stopped doing it: 'ok' had vanished from error replies and pup_record_stop reported the call time as the recording's duration.
adom-wiki pkg install adom/[email protected]pup-bridge#124: one verb surface. bridge.json's verb list and pup_describe are generated from the same list of routed verbs (96 each; they said 55 and 85), the build stops if a routed verb has no catalog entry, and pup_describe carries verbCount and its advisory notes separately. Every image reply (pup_screenshot and friends) now carries ab's fullPath and safePath, so ab's CLI auto-pulls the picture to the caller.
adom-wiki pkg install adom/[email protected]Every profile's lane survives a restart in its own jar: pup restores each profile's lane browser at boot (validated by the folder its processes run), adopts an unknown lane browser only into the profile it reports and only after that restore, re-adopts each window on its own profile's lane, and relaunches any window it finds inside another profile's browser. Before, the first unknown browser after an upgrade became the adom-you lane, so adom-you windows ran with another profile's cookies, and windows on a second profile were never re-adopted (AdomLapper and CRR, 2026-09-21). Promoted to public on 2026-09-21.
adom-wiki pkg install adom/[email protected]Every profile's lane survives a restart in its own jar: pup restores each profile's lane browser at boot (validated by the folder its processes run), adopts an unknown lane browser only into the profile it reports, and relaunches any window it finds inside another profile's browser. Before, after an upgrade the first unknown browser became the adom-you lane, so adom-you windows ran with another profile's cookies (AdomLapper, 2026-09-21).
adom-wiki pkg install adom/[email protected]Windows survive an upgrade: recovery no longer counts a window that is still on screen (waiting for the extension to reconnect) as a failed relaunch, so it never deletes a live window's record. Before, three quiet checks after a restart forgot the window, leaving it ownerless with no taskbar badge and making its thread open a duplicate. The identity audit also reads ab's nested reply now instead of reporting every window as unstamped.
adom-wiki pkg install adom/[email protected]No more taskbar-identity residue: a window's AUMID is unregistered when it closes; a sweep a minute after boot (and pup_sweep_identities on demand) unregisters every thread, per-window and category identity no live window holds, deletes dead shortcuts in pup's Start Menu folder and stale tile/icon generations. arav-rog had 116 dead keys and 20 dead shortcuts (John, 2026-09-20). Promoted to public on 2026-09-21.
adom-wiki pkg install adom/[email protected]No more taskbar-identity residue: a window's AUMID is unregistered when it closes; a sweep a minute after boot (and pup_sweep_identities on demand) unregisters every thread, per-window and category identity no live window holds, removes its Start Menu anchor and deletes stale tile/icon generations. arav-rog had 116 dead keys (John, 2026-09-20).
adom-wiki pkg install adom/[email protected]No more taskbar-identity residue: a window's AUMID is unregistered when it closes, a sweep a minute after boot (and pup_sweep_identities on demand) unregisters every thread/category identity no live window holds, removes its Start Menu anchor and deletes stale tile/icon generations. arav-rog had 116 dead keys.
adom-wiki pkg install adom/[email protected]No toast when a human raises a pup window: the jump list's relaunch command (pup_focus_window as user-taskbar-menu) used to warn the user about their own click. The foreground gate now judges by pup browser PID so a user's own Chrome can no longer fail it. Promoted to public on 2026-09-20.
adom-wiki pkg install adom/[email protected]extension lane: a stuck mouse button is released before the next mouse event (the jump-list gate caught it; same bookkeeping as the CDP branch) Promoted to public on 2026-09-20.
adom-wiki pkg install adom/[email protected]skills + README for the public publish: extension-lane mental model, CDP off by default, isolation per lane, landed, vault; no code change from 2.0.662
adom-wiki pkg install adom/[email protected]dock health: serve /dashboard/status and /dashboard/health as aliases of /status (the dock appends its health path to the served URL; the LED read HTTP 404)
adom-wiki pkg install adom/[email protected]skills only: one owned window + explicit tabs (PR #1 ported), Windows Firewall prompt note (#91); no code change from 2.0.660
adom-wiki pkg install adom/[email protected]pup-bridge#113/#112: per-profile extension lanes (isolated:true and profile: open their own lane browser, no CDP); throwaway lanes end with their last window, staging removed, swept at boot
adom-wiki pkg install adom/[email protected]pup-bridge#113/#112: the extension lane is per profile; isolated:true and profile: open their own lane browser with their own staged extension, token and queue, no CDP; throwaway lanes end with their last window and are swept at boot
adom-wiki pkg install adom/[email protected]extension lane: no readiness wait or page scripts on blank/extension pages (20 s per about:blank navigate); smoke gaps closed (download fields, wiki view + auto-sign, owner chip); adom-desktop -> adom-bridge; CDP lane off by default
adom-wiki pkg install adom/[email protected]diagnostic: readiness wait logs each attempt
adom-wiki pkg install adom/[email protected]extension lane: page scripts after the wiki view flip; readiness wait accepts about:blank; carries the smoke gap fixes, the adom-bridge rename and the CDP-off default
adom-wiki pkg install adom/[email protected]extension lane: wait for the navigated document before page scripts, the landed probe and the wiki probe (scripts ran in the old document); owner chip, download fields, wiki view; adom-desktop -> adom-bridge; CDP lane off by default
adom-wiki pkg install adom/[email protected]extension lane: owner chip script built exactly as the CDP path builds it (an unreplaced placeholder threw before the chip drew); download fields, wiki view + auto-sign; adom-desktop -> adom-bridge; CDP lane off by default
adom-wiki pkg install adom/[email protected]extension lane: pup_download reports savedTo/bytes at top level; wiki view probe + desktop-token auto-sign; owner chip + floaty per page (the smoke on the extension lane found all three); carries 2.0.652 rename + CDP off by default
adom-wiki pkg install adom/[email protected]adom-desktop -> adom-bridge everywhere (vault service renamed with in-store key migration); CDP lane off by default (cdp_lane_disabled), John: the extension lane must solve every use case
adom-wiki pkg install adom/[email protected]HOTFIX: vault migration no longer holds the cache lock across save (2.0.650 hung every vault verb) and saves before deleting legacy entries; upgrade cycle takes hwnds from live sessions
adom-wiki pkg install adom/[email protected]vault migration keyed by the real service name (adom-desktop-pup); upgrade cycle waits for the old windows to vanish before relaunching them
adom-wiki pkg install adom/[email protected]pup-bridge#122 DPAPI secret store (no Credential Manager slot per login; legacy entries migrated and freed); #107 selector targeting for pup_input_dispatch; #106 captured metadata on every screenshot + identity guard on the OS-window path; #105 recording encode is a pollable job
adom-wiki pkg install adom/[email protected]pup-bridge#104 fetch_url: credentials fallback for wildcard CORS, binary-safe body (bodyBase64 + sha256), typed failure stage; #120 trusted input on the extension lane (Input.* through the worker's cdp action); #112 isolated:true mints an iso- profile removed on close; #90 slow opens answer loading:true after 35 s and finish in the background
adom-wiki pkg install adom/[email protected]pup-bridge#121: a stale lane worker after an upgrade is cycled through the crash-restore path (every window relaunched from its file); worker version reset on every lane kill; orphan sweep at launch; pup_readiness orphanedBrowser
adom-wiki pkg install adom/[email protected]pup-bridge#121: orphaned lane browser ended at launch (WMI by profile dir) and reported by pup_readiness; no in-place worker reload after an upgrade, pup's own kill + recovery restore instead
adom-wiki pkg install adom/[email protected]pup-bridge#119: HTTP auth from the vault on the extension lane (retry keyed per request); no_credential on navigate/fetch; pup_fetch_url on the extension lane; skill note
adom-wiki pkg install adom/[email protected]pup-bridge#119: HTTP Basic/Digest auth answered from the vault on the extension lane (onAuthRequired -> /extauth, registrable-domain match); no vault entry cancels the challenge and navigate/fetch return no_credential with the host; pup_fetch_url runs on the extension lane
adom-wiki pkg install adom/[email protected]landed probes the DOM: a visible Log in link means NOT signed in (chatgpt.com/codex fooled the URL rule); a password or email+continue form means a sign-in page; also on pup_open_tab
adom-wiki pkg install adom/[email protected]open/navigate responses carry landed:{url,title,loginPage,signedIn,_hint} so an AI never asks the user to sign in where the profile already is; login recipes for claude.ai and chatgpt.com
adom-wiki pkg install adom/[email protected]birth hold: busy spin for the first 100 ms after the first show (Chrome re-tops between 1 ms re-bottoms)
adom-wiki pkg install adom/[email protected]birth: bottomed in the same instant Chrome first shows it (native spin) and held 300 ms; the park never re-shows a visible window
adom-wiki pkg install adom/[email protected]birth: park while still invisible (the watcher holds the handle 150 ms before Chrome's first show); normal unfocused birth instead of minimized (no restore surface)
adom-wiki pkg install adom/[email protected]z-watch armed before the extension creates the window (names the window and the last pup action when a newborn reaches the top)
adom-wiki pkg install adom/[email protected]no ab attention-clear on pup's own open/navigate paths (it raised and briefly activated every newborn, z-watch measured 40-80 ms); native FlashWindowEx stop instead; install.sh and package.json say adom-bridge, not adom-desktop
adom-wiki pkg install adom/[email protected]z-watch instrumentation during birth grace, ms log timestamps, last-log; re-show keeps z-position
adom-wiki pkg install adom/[email protected]cold birth: arm the birth watcher after the launch (it expired before the window existed, so the cold window wore the stock CfT icon for 12 s); stamp identity at the token bind as a backstop
adom-wiki pkg install adom/[email protected]default ext lane finally gets --no-startup-window + --keep-alive-for-test (2.0.617 only put them on the stock branch): Chrome's New Tab startup window was on top at every cold start
adom-wiki pkg install adom/[email protected]cold launch: no empty url argument on the default lane either (Chrome opened its cwd as a file listing on top); gate counts by process
adom-wiki pkg install adom/[email protected]ext birth.js (CSP blocked inline token script); cold launch passes no url so --no-startup-window holds (unowned about:blank window sat on top 18 s)
adom-wiki pkg install adom/[email protected]The Rust half of the birth-token binding, which 2.0.630 shipped without: pup binds every newborn by its birth-page title token before anything else, falls back to the set-diff handle only when the token is not found, and navigates every birth from the birth page to its real URL after the window is bound and parked.
adom-wiki pkg install adom/[email protected]Every extension-lane window is born on the extension's own birth page with a unique token as its title, and pup binds the OS window by that title, deterministically, before anything else: the set-diff bound a placeholder Chrome makes at launch and parked that while the real window came up unparked (measured: 4.5 s on top on every cold start). The real URL is navigated to only after the window is bound and parked. The birth re-assert starts at 40 ms.
adom-wiki pkg install adom/[email protected]The birth re-assert runs after every extension-lane birth, dense in the first second (measured: the cold window was pulled back down within seconds while warm windows, which had no re-assert, came up on top and stayed). The post-navigate park uses the idle-hands rule. The fit step sets bounds only and never restores a minimized window: state normal was a raise, and it un-minimized windows the user had put away.
adom-wiki pkg install adom/[email protected]The idle-hands rule applies on the extension lane too: a cold first window is activated by Chrome's own restore (measured: the re-assert answered foreground with no input since birth), so a foreground window inside the birth grace with no input since birth is Chrome's raise and is bottomed; any input means a person and pup stands down. A birth that bound a placeholder and rebinds the live window later now parks that window and re-asserts from there; it used to stamp it and leave it on top.
adom-wiki pkg install adom/[email protected]A cold birth's first window gets the doctrine's bounded re-assert inside the birth grace, at 1, 2.5 and 5 seconds: measured with the fixed bottom call, a warm birth ended behind at z11 while the first window of a fresh browser settled on top after every park. The primitive never touches a foreground window, so a human's click is never undone. The foreground-proof harness clears every thread's windows by name first.
adom-wiki pkg install adom/[email protected]The park raised the window. Measured from a fresh process on the conference-room box: SetWindowPos(HWND_BOTTOM, NOMOVE|NOSIZE|NOACTIVATE) on a pup Chrome window returned true and moved it to the TOP, where it stayed; the same call with SWP_NOOWNERZORDER put it at the bottom and it stayed. Chrome's frame owns helper windows and without that flag Windows re-orders the owner with them. Every 'parked at z-bottom: true' was a raise: the birth flash, the navigate that surfaced the window, the lower that succeeded with the window on top. One flag on every bottom call.
adom-wiki pkg install adom/[email protected]The minimized birth is created with no bounds: Chrome answers 'Invalid value for state' when minimized is combined with a rect, which failed every open in 2.0.624. The fit step sizes the window right after birth, as it always has.
adom-wiki pkg install adom/[email protected]The extension lane's birth transient is MINIMIZED, not off-screen and not in place: the extension API refuses off-screen bounds, and a visible in-place birth measured on top for 42 of 52 samples even unfocused with no startup window. A minimized window cannot be raised or activated, pup shows it already at the bottom the moment it has the handle, and it can never strand because a taskbar click restores it. tools/foreground-proof.sh counts truncated titles correctly.
adom-wiki pkg install adom/[email protected]A warm open that finds the worker silent relaunches the lane by re-entering the open routine; it did so while holding the non-re-entrant birth lock, so the open deadlocked on itself and every later open queued forever (exact 60 s timeouts, a dead-looking lane, no launch line). The lock is released before the re-entry. Bites whenever the browser dies between a poll and an open.
adom-wiki pkg install adom/[email protected]The extension API refuses an off-screen window (bounds must be 50% on screen), so the extension lane births each window in place at its final rect, one call, relying on R2: with --no-startup-window the browser holds no foreground rights. A window the browser refuses is reported as ext_open_failed with Chrome's own message, not as a busy lane.
adom-wiki pkg install adom/[email protected]The extension lane follows placement rule R1 at last: every window is born off-screen at -32000,-32000 and moved on-screen within 50 ms, unconditionally, the way the CDP lane has since v2.0.276. Gone with it, per the doctrine: the hide-until-ready watcher (a strandable staging state), every focus handback (deleted in August for foregrounding the wrong window), the minimized birth, and the post-navigate attention clear, whose Bridge implementation raises the window (adom-bridge#199) and was the navigate-puts-it-on-top bug. tools/foreground-proof.sh is the gate: a pinned window, a cold lane, opens and navigates, zero samples with a pup window on top.
adom-wiki pkg install adom/[email protected]A navigation no longer leaves a pup window on top of the user's work. Measured: a navigate makes the pup window ACTIVE, and Windows refuses to lower whatever is active, so every lower reported success while the window stayed in front. The order is forced: return the screen to the window the user was in, which makes the pup window ordinary again, and only then lower it. Either half alone does nothing.
adom-wiki pkg install adom/[email protected]The extension reports which path a navigate used, and pup logs a fallback to Chrome's tab API with the reason, because that path surfaces the window and the failure was invisible.
adom-wiki pkg install adom/[email protected]A navigate no longer surfaces the window. Measured with a window pinned in front: the pup window sat behind it, and one chrome.tabs.update({url}) moved it to the very top, which every later call then inherited. That is what flashed a pup window at the user several times per sign-in. Navigation now goes over the DevTools channel (Page.navigate), which does not touch Chrome's tab or window UI.
adom-wiki pkg install adom/[email protected]The cold start is invisible and the consent prompt is gone. The lane launches with --no-startup-window so Chrome never draws or activates a window of its own, plus --keep-alive-for-test which holds a windowless browser open: without it the browser exited within 6 seconds on John's laptop, which is why 2.0.611 had to revert the first flag. The first pup window is now created by the extension like every other one, minimized and shown already at the bottom.
adom-wiki pkg install adom/[email protected]The screen goes back to the user ONCE, at the end of the open and at the end of a Google sign-in, instead of in the middle where the rest of the flow walks over it. Measured on John's laptop: a consented cold start held his screen for 40 seconds because every navigation re-activates the window and Windows will not lower an active window.
adom-wiki pkg install adom/[email protected]The cold-start consent prompt reads ab's answer fields instead of searching the response text. ab echoes both button labels back, so the old contains("not now") check turned every 'Open it' click into a decline and pup opened nothing three times in a row.
adom-wiki pkg install adom/[email protected]Windows will not send the ACTIVE window to the bottom, which is why every park call succeeded while the pup window stayed on top: z-order and focus are one problem. A warm open is invisible. A cold one cannot be, so pup now ASKS the user with a two-button toast and waits for the answer before starting the browser, and afterwards raises the window they were working in so the park finally sticks.
adom-wiki pkg install adom/[email protected]Either invisible or warned, never a surprise. A warm open is invisible: the window is created minimized and made visible already at the bottom of the z-order. A cold open has to start the browser, which draws its own window before pup owns anything, so pup now TOASTS THE USER FIRST and waits a beat before launching.
adom-wiki pkg install adom/[email protected]A pup window is never drawn in front of the user. The keyboard-restoring code is gone: it treated the symptom. Windows are created minimized, the cold-launch watcher HIDES anything new before it is drawn, and the window is then made visible ALREADY at the bottom of the z-order in one call. Foreground happens only when the user is warned or clicks the toast.
adom-wiki pkg install adom/[email protected]Windows pup creates are born minimized and shown without activation, so they never take the keyboard. The cold start keeps its startup window: an extension-lane Chrome launched with --no-startup-window exits before its worker calls home, which broke three opens in a row on John's laptop. The focus guard covers that one case.
adom-wiki pkg install adom/[email protected]pup windows can no longer take the keyboard. The extension creates every window MINIMIZED and pup shows it with SW_SHOWNOACTIVATE before dropping it to the bottom, and the cold lane launches with --no-startup-window so Chrome never makes a window of its own. The CDP lane has carried --no-startup-window since the Node build called it THE fix for the focus-steal war; the extension lane, which is the default, never got it.
adom-wiki pkg install adom/[email protected]The focus guard WATCHES instead of peeking. Checking once right after the park is a race: Chrome can take the keyboard a beat later, after the check has passed, which is how the third of three windows stole it while the first two did not. pup now holds the user's focus for the whole open and for several seconds after a navigate, and hands it back every time a window it owns takes it.
adom-wiki pkg install adom/[email protected]pup gives the keyboard back. Pushing a new window behind the user's work was never enough: Chrome's startup window ACTIVATES, so the user loses whatever they were typing. pup now remembers which window held focus before it opens anything and hands focus straight back the instant a pup window takes it, on both the cold launch and the per-window birth.
adom-wiki pkg install adom/[email protected]A window an AI navigates while the user never asked to see it goes straight back behind their work. It came forward on the navigate, which is how a pup window landed in front of John with the explaining toast 21 seconds behind it. Never applies to a window that is foreground or that he has touched recently.
adom-wiki pkg install adom/[email protected]The cold-launch window watcher now outlives the launch call, which returns as soon as the process ids appear, seconds before Chrome paints its startup window. The first cut of this parked nothing at all.
adom-wiki pkg install adom/[email protected]A cold browser launch no longer throws its startup window over the user's work: pup watches from the instant it spawns the browser and puts any new window behind within 25ms, which is the one case the birth park could not cover.
adom-wiki pkg install adom/[email protected]A new pup window goes behind the user's work the instant its handle exists, instead of after the identity, fit and jump-list work: measured 4 seconds of every new window sitting on top of what the user was typing in. Raising now warns first and the warning is clickable: the toast carries the window, is a warning not an info, and the raise waits a beat behind it.
adom-wiki pkg install adom/[email protected]pup toasts the user the moment it needs them for a password, and the toast carries the window: clicking it opens the exact pup window that is waiting. Covers the Google sign-in answers, a site with no saved login, and the browser-login import's consent wait, which arrives as a Hydrogen notification and was being missed.
adom-wiki pkg install adom/[email protected]Login capture works on the DEFAULT lane. It only ever existed on the CDP lane, so a password typed into a normal pup window was thrown away and pup kept asking for it (John, 2026-09-17). The extension now injects the same capture rail and forwards the credential to pup over loopback, and on a Google password page, which has no username field, it takes the address Google prints on the page.
adom-wiki pkg install adom/[email protected]mac: hide and raise a pup window through NSRunningApplication instead of System Events, so macOS never prompts to control System Events (Kyle's PR #2, merged). Node shell for the public tier. Promoted to public on 2026-09-17.
adom-wiki pkg install adom/[email protected]pup's own kill is no longer read as the user closing a window: a browser pup ends itself (profile handover, lane relaunch, restart) has its windows restored, and only a browser that exits on its own with code 0 is forgotten. Lane adoption no longer learns the pids of a CDP browser pup already owns on another profile, which made a lane relaunch kill it.
adom-wiki pkg install adom/[email protected]A pup holding a lane token whose browser is gone now adopts the live token-less one instead of refusing every poll until a restart (measured on a test PC: 20 minutes of dead lane). Every no-password answer names ab's credential reader, with its real limit: a browser never saves the password of the account it is itself signed in as.
adom-wiki pkg install adom/[email protected]Google sign-in survives the 60s command cap: it runs in the background and re-attaches when called again, instead of reporting a timeout while pup is mid-sign-in (same fix as the password import). Includes the merged mac window fix (PR #2, NSRunningApplication, no System Events prompt) and the pup-bridge#118 embedded-file push fix so a fresh checkout builds.
adom-wiki pkg install adom/[email protected]Google sign-in as the right account: pup_google_accounts searches every browser profile, nb's profiles, the vault and pup's own signed-in sessions; pup_google_signin fills the email and that account's saved password, hands back the verification step with the exact next call, and never guesses between accounts. The vault keeps one login per site and username. pup_login no longer reports success when it filled nothing. The browser-login import runs in the background and re-attaches instead of timing out while the user approves it.
adom-wiki pkg install adom/[email protected]Google sign-in as the right account: pup_google_accounts searches every browser profile, nb's profiles, the vault and pup's own signed-in sessions; pup_google_signin fills the email and that account's saved password, hands back the verification step with the exact next call, and never guesses between accounts. The vault keeps one login per site AND username (a second Google account no longer overwrites the first). pup_login no longer reports success when it filled nothing.
adom-wiki pkg install adom/[email protected]The user's close is final: a pup window closed by hand is forgotten at once and never restored; restore only on a proven browser crash (nonzero exit code) or a pup restart. The orphan about:blank sweep no longer closes a lane's last window or a window being born (it killed a cold lane and triggered a 7-window restore on 2026-09-15). rust/ ships with every release (pup-bridge#117).
adom-wiki pkg install adom/[email protected]skillpack install script deploys pup-lanes (it was in the tarball but not in the install list, so every container kept the pre-parity lane text; pup-bridge#116).
adom-wiki pkg install adom/[email protected]skills: the main pup skill's capability paragraph and the screenshots-and-recording skill now describe the extension lane as it is (input parity, pup_select, CSP and Trusted Types eval fallback, recording through ab's native recorder); the old 'no trusted input, not in the session model' text and the three-recorder table were from the era when the lane was a fallback verb and sent the Work thread to file pup-bridge#116.
adom-wiki pkg install adom/[email protected]pup_select {selector, value|label}: choose a option in the background on both lanes (DevTools evaluate, CSP and Trusted Types cannot refuse it); pup_eval on the extension lane falls back to DevTools for Trusted Types refusals too (Google Calendar, Admin). Closes pup-bridge#116.
adom-wiki pkg install adom/[email protected]pup_eval on the extension lane falls back to DevTools for Trusted Types refusals too (Google Calendar, Admin); the fallback matched only the CSP wording (pup-bridge#116).
adom-wiki pkg install adom/[email protected]extension worker: the packaged port.json read had no deadline and hung on every fresh worker instance after a reload in place (hellos continued, /extcmd never hit; measured on winvm), which is the 'worker stalls after a cold launch or update' bug. Now a 2 s deadline with the last good lane and port remembered in extension storage, and every poll step bounded. Plus 2.0.589: per-command deadlines, an unsticking drain guard, the hello on its own alarm, and the birth grace that demotes only a no-input-since-birth self-raise on the CDP lane.
adom-wiki pkg install adom/[email protected]worker watchdog: every extension command races a deadline (a hung Chrome API answers as a named error instead of freezing the lane; measured: fit after a cold launch, debugger capture), the drain guard cannot stick, and the hello has its own alarm so pup can always tell a quiet worker from a dead one. Birth grace: pup may demote a newborn only when nobody has touched the machine since it was born, CDP lane only; any input, a 200 ms taskbar click included, is a person for the full 10 minutes.
adom-wiki pkg install adom/[email protected]the user's foreground window is the user's, always: the demotion primitive no longer expires a raised window after 5 s of idle reading (only a NEWBORN self-raised with idle hands inside the birth grace is demoted); the silent-lane restore checks ground truth first and never relaunches a session whose window is alive on glass (it relaunched a window John was looking at); a relaunch refuses a file whose window is alive; the attention-clear workaround re-checks foreground after the clear.
adom-wiki pkg install adom/[email protected]close: the lane's close result is checked, an unbound extension session resolves its handle before the OS close, and a window that survives both keeps its session and is reported (close_failed) instead of being left ownerless on the user's glass (eight orphans after a worker reload, 2026-09-15).
adom-wiki pkg install adom/[email protected]extension lane: a cold open blocks until the lane is up and relaunches once if the first browser never calls home, returning a real window or a real error instead of starting:true with no session (the caller's next verb hit session_not_found; parity's pup_open_tab, and other threads' trouble opening pup).
adom-wiki pkg install adom/[email protected]z-order: ab's desktop_clear_window_attention raises the window to z1 (adom-bridge#199), undoing every park at open and after navigation; pup re-bottoms after any attention clear unless the window is the user's foreground. Plus 2.0.584: input beats the birth grace, extension windows park at birth, inset frame.
adom-wiki pkg install adom/[email protected]foreground doctrine: the birth grace may override session flags, never input (a human taskbar click inside the first 8 s was undone by the +2.5 s re-assert); extension-lane windows park to z-bottom once at birth (they landed at z1, right under the active window) with no re-assert, since Chrome never self-activates an unfocused-created window; the lane's fit uses the standard 10 px inset frame.
adom-wiki pkg install adom/[email protected]overlay badges: SVG favicons rasterize (resvg, pure Rust); the wiki serves only an SVG icon and every wiki window wore the generic globe since the compositor moved into the binary in 2.0.568. The favicon guard now rejects HTML only. Lane status counts live windows correctly when no lane pids are known (an empty pid list meant no filter and counted the user's own browsers).
adom-wiki pkg install adom/[email protected]recording via ab: frames, bytes and duration ride at the top level of pup_record_stop (the CLI drops a non-string output; ab-smoke reads frames there); start carries width/height/fps at the top level too.
adom-wiki pkg install adom/[email protected]recording rides ab's native recorder: pup_record_start/stop/status/list delegate to desktop_record_window_* keyed on the window's hwnd (Windows Graphics Capture, hardware H.264 MP4; a covered window records live; measured 2542x1520, 2.1 MB per 20 s). Works on the extension lane. The CDP screencast remains only as a fallback where ab's recorder is absent.
adom-wiki pkg install adom/[email protected]recovery: a lane whose worker goes silent (3 min with no lane window on glass, or 10 min regardless) is declared dead and every extension session is restored from its file, tabs included (a dead lane sat listed as 1 window for 14 h); a relaunch whose open answers starting:true waits for the worker and opens again instead of dropping the session; the another-caller guard compares Chrome window ids and treats a missing session as a failed relaunch; a token-less extension browser after a restart is adopted (token minted into port.json, pids learned from CfT frames); status reports live lane windows.
adom-wiki pkg install adom/[email protected]ext lane: pup_type inserts the whole string in one trusted Input.insertText on the extension lane (per-key dispatch was two poll round trips per character and overran 30 s on a 20-char password); CDP lane unchanged.
adom-wiki pkg install adom/[email protected]ext lane at input parity: click, hover, type, press_key, scroll, fill, element and full-res screenshots, and CSP-proof eval now run on extension-lane windows through nbe's DevTools driver (one driver, synced from nb; chrome.debugger attached on demand). Recording and selector downloads still need lane:cdp (they wait on DevTools events).
adom-wiki pkg install adom/[email protected]ext lane: windows born with the early native stamp now get their jump list (right-click menu) too; a busy lane no longer gets relaunched by an unanswered open (that killed every thread's windows five times today), the open fails with ext_busy instead; lane-rule refusals are logged.
adom-wiki pkg install adom/[email protected]ext lane: launch with CalculateNativeWinOcclusion disabled (as the CDP lane always has) so screenshots of a pup window buried under the user's other windows capture; compositor-only, nothing on the wire. The 2.0.575 debugger screencast produced no frame for an occluded tab and stays only as a fallback.
adom-wiki pkg install adom/[email protected]ext lane: screenshots of a fully occluded window now capture via a one-frame Page.startScreencast under chrome.debugger (a captured tab is treated as visible; Page.captureScreenshot never returns for an occluded tab in stock Chrome and hung the lane in 2.0.574). Every debugger await has a deadline so a capture can never freeze the lane again.
adom-wiki pkg install adom/[email protected]ext lane: screenshots work on a fully occluded window. captureVisibleTab first; on Chrome's image-readback failure the extension attaches chrome.debugger to that one tab, Page.captureScreenshot, detach (Page domain only, no port, no automation flag). --silent-debugger-extension-api hides the bar.
adom-wiki pkg install adom/[email protected]ext lane: one AI thread, one window. Restored the birth lock (R4) so only one window birth is in flight at a time, refused any hwnd another session already owns, filtered births to the lane's own Chrome pids (Edge shares the window class), and dropped the sole-window guess that handed every asking session the same handle. Also ships the annotate preview thumbnail as raw RGBA.
adom-wiki pkg install adom/[email protected]pup-bridge#114: users hear 'pup window'. A naming rule at the top of the root skill (never name the browser build or how pup drives it unless asked), the build taken out of the frontmatter descriptions of pup, pup-lanes, pup-browsers-and-chrome and pup-why-cft (the last two are marked maintainer detail), and plain mode described as the browser's own stock button. Skills only, no code change from 2.0.571.
adom-wiki pkg install adom/[email protected]Skills describe what shipped on 2026-09-14: the thread tile and the overlay badge are composed in the binary (pup-taskbar-states); annotate works on both lanes and the CDP-only list shrinks accordingly, plus the worker self-reload note (pup-lanes, pup-settings); the extension lane's architecture for maintainers, from the shared birth watcher to the queued channel (pup-bridge-dev). The last 41 em-dashes are gone from pup-settings and pup-taskbar-states. No code change from 2.0.570.
adom-wiki pkg install adom/[email protected]Two fixes found by 2.0.569's proofs. (1) The extension-lane command channel is a QUEUE: it was one slot, so two callers at once (the annotate watcher polling every 500 ms and a pup_eval, or the health tick's overlay and a verb) overwrote each other, one timed out, and the annotate watcher died on its first read. Commands queue by id, results are keyed by id, the worker drains the queue on every poll, and everything the worker had taken is re-queued on a fresh hello. (2) The annotate overlay no longer uses innerHTML: pages that enforce Trusted Types (Google Docs) refused it, so annotate had never worked there on either lane. Carries 2.0.569 (annotate on the extension lane, worker self-reload after an install).
adom-wiki pkg install adom/[email protected]Annotate works on the extension lane, and a pup update no longer waits for every window to close. (1) pup_annotate on the default lane: the overlay script is now ONE file shipped in the extension (src/extension/annotate-overlay.js), file-injected into the page's MAIN world on the extension lane (a page CSP cannot refuse a file injection, unlike eval; the pen showed 'Annotating...' and did nothing on Google Docs, John 2026-09-14) and evaluated over CDP on the CDP lane; start, result polling and the Done callback go through lane-generic helpers (inject_script, call_window_fn, read_window, capture_viewport_png); the capture's caption strip and preview are composed in the binary (pup_identity::badge::annotate_compose, fontdue text) instead of an in-page canvas. (2) Worker self-reload: on each health tick, if the lane's worker is behind the bridge version, pup re-stages the extension folder in place and asks the worker to chrome.runtime.reload(); it comes back on the new files with the same lane token and in-flight commands are re-queued. Carries 2.0.568 (overlay badge in the binary) and 2.0.567 (ext windows branded before first show).
adom-wiki pkg install adom/[email protected]The taskbar overlay badge is composed IN THE BINARY (pup_identity::badge) for both lanes. It used to be JavaScript evaluated inside the page, which a strict Content-Security-Policy refused (Google Docs, claude.ai, the wiki), so those windows never got an overlay: 'no badge could be composed' (John, 2026-09-14, the all-engineering agenda). Same card as before: 48 px, radius 6, #202124 or #f1f3f4 when the icon is dark-dominant and transparent, the icon cover-fitted into a 44 px inset, scaled to overlaySize and pinned north-east; the generic globe and PDF sheet are embedded PNGs. The icon is sourced per lane: the extension reads by injected function (page CSP cannot refuse it) and fetches with the page's cookies; the CDP lane reads the hrefs over Runtime.evaluate and the bridge fetches; /favicon.ico is the fallback with the same 30 min negative cache. badge_js and the extension lane's duplicate composer are deleted. Carries 2.0.567 (ext windows branded before first show).
adom-wiki pkg install adom/[email protected]Extension-lane windows are branded BEFORE Chrome shows them, with the same birth watcher the CDP lane has had since 2.0.446 (now one function shared by both opens): the AUMID is registered ahead of time, a thread polls every top-level frame every millisecond from before the window exists, and the newborn is stamped natively while still invisible so the shell bakes pup's icon into the button at its first show. Until now the ext lane stamped only after the page had navigated, so every ext window was born on the stock Chrome icon (John, 2026-09-14, opening the all-engineering agenda). The ext lane's own 6 s bind loop is deleted; the watcher's hwnd is the window.
adom-wiki pkg install adom/[email protected]Extension-lane channel survives a service-worker restart. An MV3 worker can be torn down between taking a command and answering it (measured 2026-09-14: a second hello 31 s after the first, mid-command); the reply never came and the bridge waited out the full timeout, which on a cold open pushed pup_open_window past ab's 60 s and the AI saw a timeout while the window opened anyway. The bridge now remembers the command it handed out and re-issues it when a fresh hello arrives from the lane. Cold-open budgets also fit inside 60 s now (brands 6 s, tabs 10 s, birth navigate 30 s, badge eval 25 s). Carries 2.0.565 (ext eval matches the CDP result contract) and 2.0.564 (extension lane default, CDP opt-in, pup-lanes skill, dashboard on ext).
adom-wiki pkg install adom/[email protected]pup_eval on the extension lane now returns exactly what the CDP lane returns: a string result stays a string even when its text is JSON (JSON.stringify(...) expressions came back as objects on this lane, which broke any caller written against the CDP contract, ab-smoke's dashboard check first). The worker tags the result type; the bridge reconstructs it. Carries 2.0.564 (extension lane default, CDP only on explicit lane:cdp, pup-lanes skill, dashboard on the extension lane).
adom-wiki pkg install adom/[email protected]Same as 2.0.563 (extension lane is the default; CDP only on explicit lane:cdp; pup-lanes skill) plus: pup_dashboard opens like every other pup window, on the extension lane on adom-you, with no profile and nothing from CDP (John, 2026-09-14: why does pup_dashboard even need cdp). The Node-era pup-dashboard profile is retired. ab-smoke on 2.0.563 had caught the dashboard being refused by the new cdp_lane_required rule.
adom-wiki pkg install adom/[email protected]The extension lane IS pup (John, 2026-09-14): it is the lane every vendor site loads on, so it is the default and the CDP lane opens ONLY on an explicit lane:"cdp". The silent fallback to CDP for profile/isolated/highFps/webSecurity requests is gone; such a request without lane:"cdp" is refused with cdp_lane_required and the fix. New user skill pup-lanes compares the two lanes with pros and cons, lists exactly which verbs need CDP, and states the cost of lane:"cdp" on adom-you. pup-taskbar-states no longer says the browser renders the name tile.
adom-wiki pkg install adom/[email protected]Extension lane: no more orphan about:blank windows. A lane relaunch or a concurrent open went through the worker's open action and left Chrome's startup window on the desktop (John, 2026-09-14). pup now sweeps, after every ext open and on each health tick, every window no session owns whose tabs are all about:blank, the same rule the CDP lane applies in close_orphan_blank_targets. Carries 2.0.561 (a session is matched to its own window by title) and 2.0.560 (thread tile rendered in the binary; stamp at birth and on re-adoption).
adom-wiki pkg install adom/[email protected]Extension lane: a session is matched to ITS OWN OS window by the active tab's title (Chrome titles a window ' - Google Chrome for Testing'), because one lane browser now hosts several threads' windows and 'the lane window' was ambiguous: 2.0.560's rebind bound one thread's session to another thread's window and then to a dead handle. With no title match pup leaves the session unbound and says so in pup_audit_icons rather than guess. Carries 2.0.560 (thread tile rendered in the binary; stamp at birth and on re-adoption).
adom-wiki pkg install adom/[email protected]Same as 2.0.559 (thread tile rendered in the binary; the extension lane stamps the live window at birth and on re-adoption) minus a dead 'tile' action left in the extension worker by an earlier revert.
adom-wiki pkg install adom/[email protected]The thread tile is rendered in the binary (John, 2026-09-14: 'it should just be in pup's rust binary. why would we use javascript?'). Until now the taskbar name tile was JavaScript evaluated inside whatever page the window was on, a leftover from the Node bridge that could not draw text; a strict Content-Security-Policy (claude.ai, the wiki) refused it and the button silently fell back to a nameless per-window icon. pup_identity::tile now lays out and rasterises the tile with fontdue from the same Familjen Grotesk Bold face (fg-700 converted to TTF), same layout rules, same plate, every ICO entry at its own pixel size; output verified pixel-for-pixel against the browser-rendered tiles on the laptop. The page-evaluation path, tile_js and the embedded woff2 are deleted. Also: the extension lane stamps the LIVE window before pup_open_window returns (birth used to bind Chrome's transient launch window), and recovery stamps a re-adopted window immediately; the 15 s health-tick rebind is now only a backstop. identity.rs was reconstructed after a bad restore this afternoon; all identity and verbs tests pass.
adom-wiki pkg install adom/[email protected]Extension-lane taskbar identity, second pass, from pup.log rather than theory. Birth bound the window to a TRANSIENT hwnd (the about:blank launch window Chrome replaces) and the stamp failed with 'not a valid window'; recovery then re-adopted the real window after each bridge restart but never stamped it; 2.0.557's late rebind only handled hwnd None so it skipped a window that was bound-but-unstamped. Now the health-tick rebind covers all three states (unbound, bound to a dead hwnd, bound but unstamped) and stamps. pup_audit_icons reads identity back from Windows through ab instead of trusting the in-memory app_id, which does not survive a restart and produced a false 'unstamped' finding on a correctly stamped window.
adom-wiki pkg install adom/[email protected]Taskbar identity regression in the extension lane, fixed (John, 2026-09-14: 'why is my windows taskbar icon just this? did you regress on the windows taskbar icons?'). An ext-lane window whose birth outran open_window_ext's 3 s hwnd wait (the 2.0.545 birth goes about:blank, identity shim, then the real URL, which can take longer on a cold browser) kept hwnd None for ever, so identity::stamp had nothing to stamp and the button wore Chrome's stock icon under its native per-profile AUMID. Three changes: (1) extdrive::rebind_unbound runs on every 15 s health tick and on pup_rescan, binding every unbound ext session to the lane window and stamping it exactly as a timely birth would; (2) pup_audit_icons now reports an unbound or unstamped session as a finding instead of zero findings; (3) pup_rescan judges ext sessions by the lane's liveness rather than a debug port they deliberately never have, so it stops calling a live ext window 'their Chrome is gone'. The birth wait is also 6 s. Carries 2.0.556's --disable-extensions-except bubble fix.
adom-wiki pkg install adom/[email protected]The real fix for the external-extension Action required bubble, replacing the 2.0.553 attempt. Diagnosis: on Windows, extension settings live in Secure Preferences under MAC protection, not in Preferences, so pre-seeding extensions.settings..ack_external (2.0.553) never landed and is removed as an approach. The registry-installed extensions (Adobe Acrobat efaidnbmnnnibpcajpcglclefindmkaj, Application Launcher for Drive lmjegmlicamnimmfhcmpkclmigmmcbeh) were confirmed present in adom-you Secure Preferences with location 6 (external registry) and unacknowledged, which is exactly the state that raises the bubble. Fix: every Chrome for Testing launch now passes --disable-extensions-except=<pup's own extension paths> alongside --load-extension, so only pup's toolbar extensions are enabled and Chrome's external registry providers do not install anything into pup profiles. Profile-scoped via launch flags; the machine registry is untouched.
adom-wiki pkg install adom/[email protected]Corrects a claim 2.0.552 through 2.0.554 shipped, and labels an unproven fix honestly. (1) WITHDRAWN: the statement that neither profile state nor cookie history is the discriminator for Akamai vendor sites. That rested on a warm-versus-fresh profile comparison, but isolated:true does not create a separate profile (it forces the CDP lane and the anonymous tile while the jar stays adom-you, filed as pup-bridge#112), so the comparison ran adom-you twice. Profile state is now documented as UNTESTED rather than excluded, across the root skill, pup-why-cft and pup-bot-walls. (2) The ack_external seeding added in 2.0.553 for the external-extension Action required bubble is retained but is UNVERIFIED: repeated readings of the same profile disagreed and extensions.settings read back empty, so there is no evidence it suppresses the dialog. Do not describe the bubble as fixed. (3) Carries forward 2.0.554's corrected 19-of-20 vendor-site score with analog.com intermittent, the measurement-hygiene section, pup_close_all_windows, and the em-dash sweep.
adom-wiki pkg install adom/[email protected]Skills updated with what today actually established, replacing what it only appeared to. (1) The 20-of-20 vendor-site score is corrected to 19 of 20: analog.com was denied as the 7th of 20 sequential loads having rendered fine on a single visit minutes earlier, and the clean run did not reproduce. analog.com is documented as intermittent under sequential load rather than solved. (2) New measurement-hygiene section in pup-browser-detection covering the five mistakes that produced four wrong causal stories in one day: comparing pup against a hand-rolled Chrome launch, reading window titles instead of screenshots, poisoning your own egress reputation by repeated probing, promoting a single passing run to documentation, and leaving orphaned Chrome processes holding profiles. Carries forward 2.0.553's ack_external fix for the external-extension Action required bubble, pup_close_all_windows, and the em-dash sweep.
adom-wiki pkg install adom/[email protected]Three fixes. (1) The Action required bubble: Chrome's ExternalInstallManager gates the 'Another program on your computer added an extension' dialog per-extension on extensions.settings..ack_external, NOT on the extensions.alerts.initialized flag pup was setting, so the old suppression never applied to it (John hit it again on 2026-09-14 for Application Launcher For Drive). prepare_profile now pre-acknowledges every machine-wide registered id, profile-scoped; pup still never edits the machine's registry. The registry read lives behind a new defaulted Host::external_extension_ids implemented only in host-win. (2) pup_close_all_windows is served instead of erroring not_in_rust_yet with no equivalent named, the same defect class as #108; it aliases onto close_window's existing all:true path, so it closes only the caller's own windows. (3) Em-dashes removed from the four pup skill files, 156 of them, per John's standing style rule.
adom-wiki pkg install adom/[email protected]Two corrections. (1) adom/pup-bridge#108: pup_list_sessions now resolves to the same caller-scoped implementation as pup_my_windows (registered passive, so it never launches a browser) and carries a catalog entry that survives regeneration, instead of erroring not_in_rust_yet while naming no supported equivalent. (2) WITHDRAWN across the root skill, pup-why-cft, pup-browser-detection and pup-bot-walls: the claim that matching CfT to the installed Chrome is what makes vendor sites load. That comparison was uncontrolled, every denied trial was a raw hand-rolled Chrome launch without pup's flag set while every passing trial was pup. Re-measured with screenshots on 2026-09-14, analog.com renders in pup on CfT 152 on both a warm profile and a brand-new isolated jar, so neither the build nor the cookie jar is the established discriminator. Keep the pin near the installed Chrome as hygiene, not as an explanation.
adom-wiki pkg install adom/[email protected]Correct the causal story for vendor walls in the skills: a stale Chrome-for-Testing did NOT break Akamai's bmak sensor. analog.com answered HTTP 403 from AkamaiGHost on CfT 148, which is a refusal at the HTTP layer before any page JavaScript runs; CfT 148 executes JavaScript fine. typeof bmak === undefined on a deny page is a symptom (the Access Denied page carries no sensor script), not the cause. The discriminator is the connection fingerprint (the TLS ClientHello differs between CfT builds); which element flips the verdict is not isolated. Corrected in the root pup skill, pup-why-cft, pup-browser-detection and pup-bot-walls.
adom-wiki pkg install adom/[email protected]A Chrome-for-Testing version bump now actually fetches the new build. detect_cft falls back to any cached CfT so an offline box still drives, but ensure_background short-circuited on that fallback, so 148 stayed cached and the pinned 152 was never downloaded. ensure_background now gates on the PINNED build: present = ready; missing = download it in the background while a cached fallback drives meanwhile, so a box upgrades on its own after a bump.
adom-wiki pkg install adom/[email protected]Match Chrome for Testing to the user's installed Chrome: CFT_BUILD_ID 148.0.7778.97 -> 152.0.7977.82 (the CfT build closest to the measured installed Chrome 152.0.7977.83). Pup drove CfT 148 while presenting 152 in the UA, a version mismatch that shows in the TLS ClientHello: the extension SET Chrome offers changes between 148 and 152 (post-quantum key share, ECH, cert compression roll in over versions), which is where the lane's JA4 diverged from real Chrome and where Akamai on analog.com keys. Matching the version makes the UA rewrite truthful and the ClientHello native-152. The box fetches 152 on the next pup_prewarm / ext open (~150 MB); the identity brand-list shim still runs because CfT omits the Google Chrome brand regardless of version.
adom-wiki pkg install adom/[email protected]Correction to 2.0.546's claim: the startup-promo bar was NOT suppressed by disabling the named features (read from a screenshot after the promotion, which was my error). The promo is field-trial gated; laneFieldTrials (default on) adds --disable-field-trial-config to the stock launch when off, the flag that removed the bar in 2.0.505. Whether that flag changes what analog.com's edge sees is measured before it becomes the default.
adom-wiki pkg install adom/[email protected]The stock lane launch keeps the UI-only suppressions. 2.0.545's stock flag set brought back the 'Chromium now launches when Windows starts' bar (John's 2.0.505 fix) and the sign-in promos, because it dropped the whole feature list. The startup-promo and sign-in features are disabled by name again; they change nothing on the wire. Field trials stay on, since --disable-field-trial-config alters feature rollouts and with them the request fingerprint that this launch exists to keep stock (analog.com denies the non-stock one).
adom-wiki pkg install adom/[email protected]analog.com loads on the extension lane. Measured on AdomLapper 2026-09-13: with the lane presenting the installed Chrome 152 on the wire and in JS AND launching with only the firewall guards (no QUIC, no Cast/mDNS) and everything else stock, analog answered its real page with the Akamai sensor running; the identity alone under the old flag set was still denied, so the launch flags (the TLS ClientHello they shape) were the decisive tell. laneStockFlags now defaults on. A cold launch goes to about:blank, applies the identity, and only then navigates, so the very first real request carries it (the launch page used to load before the rule existed).
adom-wiki pkg install adom/[email protected]JS identity shim that actually holds: navigator.userAgentData is a NEW object on every access in Chrome 148 (measured: navigator.userAgentData === navigator.userAgentData is false), so a property defined on one instance was lost and userAgentData.brands still read Not/A)Brand/99 Chromium/148 while the wire said 152. The shim now installs a Navigator.prototype.userAgentData getter that wraps the real object in a Proxy (brands, fullVersionList, getHighEntropyValues, toJSON), and userAgent/appVersion on the prototype too. Plus laneStockFlags (default off): an experiment lever that launches the lane with only the firewall guards (no QUIC, no Cast/mDNS listener) and everything else stock, so the TLS ClientHello is real Chrome's, for edges that still deny after every header matches (analog.com).
adom-wiki pkg install adom/[email protected]The extension lane presents the user's INSTALLED Chrome, on the wire and in JS. Measured via nbe on AdomLapper: the user's Chrome is 152 and sends Chromium;v=152, Not?A_Brand;v=24, Google Chrome;v=152, while Chrome for Testing 148 sent Not/A)Brand;v=99, Chromium;v=148 and analog.com's edge denied it as real Chrome passed on the same IP over the same protocol. The lane now rewrites User-Agent, Sec-CH-UA and Sec-CH-UA-Full-Version-List to the installed version with real Chrome's brand order and GREASE (consumerBrandsHeader pins the exact header), and a document_start MAIN-world shim (baked at staging) mirrors navigator.userAgent and userAgentData. The CDP lane's metadata uses the same order and GREASE, so both lanes match the user's Chrome.
adom-wiki pkg install adom/[email protected]A lane browser that outlives a pup update no longer runs the old extension unnoticed. The hello now carries the worker's versioned filename; pup_status.extensionLane reports workerVersion and stale, with a hint; and the health tick cycles a stale lane the moment no extension-lane window is open, so the next open stages the current extension (measured: worker.2-0-539 kept serving under pup 2.0.541, and the brand rewrite shipped in .540 never ran until the lane was cycled by hand). Also pup_clear_site_data {origin|origins}: cache, cookies, storage and service workers for an origin, through chrome.browsingData on the lane and Storage.clearDataForOrigin over CDP.
adom-wiki pkg install adom/[email protected]Apply the consumer brand rewrite at the session birth (2.0.540 hooked it into dress_window, which the session-based birth never calls, so it never ran). setBrands now reports whether Chrome accepted the declarativeNetRequest rule and how many dynamic rules are live, so a silently ignored header shows in the log instead of being guessed at.
adom-wiki pkg install adom/[email protected]The extension lane sends real Chrome's brand list. Measured on AdomLapper: Chrome for Testing's first request carries Sec-CH-UA without the Google Chrome brand ('Not/A)Brand;v=99, Chromium;v=148'), and analog.com's Akamai edge answers that first request with a live 403 (cache bypassed, cookies cleared, sensor never runs) while arrow, mouser and st accept the same jar, IP and UA. The control extension now installs a declarativeNetRequest rule rewriting Sec-CH-UA and Sec-CH-UA-Full-Version-List to what real Chrome sends, applied once per lane browser (consumerBrands, default on). The CDP lane already patched brands over CDP; this is the lane's own way to do it.
adom-wiki pkg install adom/[email protected]pup_clear_cookies {domain, names?} is wired (2.0.538 shipped its transport half only: a heredoc failure slipped past the ship gate). Drops a site's cookies in the window's jar, HttpOnly included, on either lane. Built to test and fix the analog.com case: loads on a fresh jar, Access Denied on adom-you, which points at Akamai's verdict cookie carried over from the CDP-lane visits.
adom-wiki pkg install adom/[email protected]pup_clear_cookies {domain, names?}: drop a site's cookies in the window's jar, HttpOnly included, on either lane (chrome.cookies in the control extension; Network.getAllCookies + deleteCookies over CDP). Built to test and then fix the analog.com case John keeps asking about: it loads on a fresh jar and answers Access Denied on adom-you, which points at Akamai's verdict cookie (_abck at -1) carried over from the CDP-lane visits, not at the browser as it is now.
adom-wiki pkg install adom/[email protected]No duplicate tabs. A recovery relaunch that raced a caller's opens re-added the saved tab list on top of the caller's tabs (ti.com twice, 33 tabs for 20 sites, John 2026-09-13). Two fixes: pup_open_tab on the extension lane de-dups by URL the way the CDP lane has since 2.0.478 (a second open of a URL the window already holds activates that tab); and a relaunch reopens its saved tabs ONLY into the window it made itself, never onto a newer window for the same id.
adom-wiki pkg install adom/[email protected]An extension-lane window survives a pup restart intact. On the 2.0.535 restart, recovery declared the lane gone two seconds after boot, before the extension's first heartbeat, KILLED the live browser ('ended 5 stale browser process(es)'), rebuilt the 20-tab window from its file, and then did it all again 17 s later because the orphan pass (CDP-shaped) removed the rebuilt session and the file pass (pid 0 reads as gone) relaunched it. Three fixes: readopt_ext waits up to 8 s for the first heartbeat when the lane's pids were re-attached; ext session files never enter the CDP reconnect, at boot or on the health tick, and are relaunched only when the lane is really dead; the tabless/orphan pass skips ext sessions.
adom-wiki pkg install adom/[email protected]The default lane logs in and downloads; nothing on it is a silent no-op any more. ab-smoke on 2.0.534 failed login and download because both go through resolve_tab, the seam every CDP-only verb uses, which found no CDP handle on an ext session and did nothing. resolve_tab now refuses an ext session loudly (lane_needs_cdp, saying what works here and how to opt into CDP), so all 25 CDP-only call sites fail visibly instead of silently. pup_login has an ext arm: the same locate/fill/submit scripts and the same wall detector (hoisted to WALL_JS), evaluated through the transport; realKeystrokes stays CDP-only. pup_download has an ext arm through chrome.downloads in the control extension, returning savedTo/filename/bytes in the same envelope.
adom-wiki pkg install adom/[email protected]The identity button shows the user's avatar. Chrome lets an extension set its action icon at any time (chrome.action.setIcon with imageData), so the identity extension now has a service worker that fetches the adom-you avatar through a new pup endpoint, GET /identity/avatar (pup fetches it server-side with its own token, cached 10 min, so the extension needs no host permission for wherever the avatar lives), draws it circle-cropped onto the family's teal tile at 16/32/48/128, and sets it as the button; refreshed every 10 minutes and retried every 30 s until pup answers. John: 'you should be showing my avatar up in your button in the chrome toolbar ... or can you just do it dynamically whenever you want?' Yes, dynamically.
adom-wiki pkg install adom/[email protected]An extension-lane session is re-adopted across a pup restart, never relaunched, while its Chrome window is still in the lane browser. Recovery's liveness check is CDP-based, which an ext window never satisfies, so a restart declared both ext sessions' Chrome gone and relaunched them as new windows beside the originals (the 17-tab proof window orphaned, a duplicate opened next to it). The session file carries windowId; the live tabs listing says whether that window still exists and which tabs it holds, and the session is rebuilt from that, at boot and on the health tick.
adom-wiki pkg install adom/[email protected]Two gaps from the 20-site proof. (1) A command in flight counts as alive: the worker does not poll while it executes a command, so a slow site's tab open (nordicsemi, ~30 s) stopped the heartbeat, alive() read the lane as dead, and the next three tab opens were refused with 'browser not running' while the browser was fine. Heartbeat window is 20 s and an in-flight command holds it. (2) A tab open that outlives the CLI relay is no longer lost: the ext tab wait is 20 s so it returns before ab's ~60 s relay, and refresh_all adopts any tab Chrome has in the session's window that pup does not track, the way the CDP lane's adopt_window_tabs does. 17 of 20 tabs were in the window; pup recorded 16.
adom-wiki pkg install adom/[email protected]No lane verbs, gated on the edit and the build this time (2.0.529 and 2.0.530 shipped without it). pup_ext_* are gone from the verb surface and every hint: a lane window is a pup window, driven by pup_open_window / pup_navigate / pup_eval / pup_screenshot / pup_open_tab / pup_list_tabs / pup_switch_tab / pup_close_window. Lane health is the extensionLane field of pup_status.
adom-wiki pkg install adom/[email protected]No lane verbs (2.0.529 shipped without this by mistake: an assertion fired before the edit was written). pup_ext_* are gone from the verb surface: a lane window is a pup window, driven by pup_open_window, pup_navigate, pup_eval, pup_screenshot, pup_open_tab, pup_list_tabs, pup_switch_tab, pup_close_window. Lane health is the extensionLane field of pup_status. SKILL.md and every hint updated.
adom-wiki pkg install adom/[email protected]No lane verbs. pup_ext_open/navigate/eval/tabs/tab/activate/screenshot/close/status/diag are gone from the verb surface (John: 'why am i still seeing you talk about verbs that have ext in them'). A lane window is a pup window: pup_open_window, pup_navigate, pup_eval, pup_screenshot, pup_open_tab, pup_list_tabs, pup_switch_tab, pup_close_window. Lane health (connected, lastPollMsAgo, processes, windows) is a field of pup_status. SKILL.md examples updated; the profile_owned_by_ext_lane hint no longer names removed verbs.
adom-wiki pkg install adom/[email protected]A killed lane reads as dead at once. alive() is heartbeat-based and a browser killed 3 s after its last poll still counted as alive for 7 more seconds, so the next pup_open_window took the warm path and waited 60 s on a dead channel until ab timed out (the first cold open of the 20-site proof, 2026-09-13; the retry two minutes later came up in 7.3 s). kill_extdrive now zeroes the heartbeat, and a warm open whose channel does not answer within 20 s falls back to a cold launch instead of failing.
adom-wiki pkg install adom/[email protected]lane:cdp takes the adom-you profile back from the extension lane, symmetric with the ext birth taking it from CDP. The two lanes cannot share one --user-data-dir (Chrome is one process per profile), so an explicit lane:cdp open on adom-you now closes the ext windows and launches CDP instead of failing with a raw profile_owned_by_ext_lane error. Default stays ext; lane:cdp is the opt-in for CDP-only features (iframes, trusted input, annotate).
adom-wiki pkg install adom/[email protected]captureVisibleTab needs : added it to the pup control extension so pup_screenshot works on the extension lane (it hit 'the or activeTab permission is required'). session_row now reports transport/lane so pup_list_windows and pup_status show which lane a window is on. Follows 2.0.525 making the lane a first-class session.
adom-wiki pkg install adom/[email protected]The extension lane is a first-class pup session. Session gains transport (cdp|ext, round-tripped through the session file); verbs/src/transport.rs is the ONE seam a verb reaches the page through (navigate, evaluate, screenshot, open/activate/refresh/close tab, close window), with a CDP arm and an extension-channel arm. pup_open_window picks the lane before any browser launches: defaultLane is ext, so a plain open is an extension-driven window on adom-you with no debug port; lane:cdp opts into CDP-only features (iframes, trusted input, annotate, highFps, isolation). identity's tile and badge are composed through the transport, so an ext window wears the same thread tile and the same 75% badge; list_tabs, open_tab, switch_tab, close_tab and close_window branch on the transport; recovery relaunches a window on the lane it was born on. pup_ext_* remain as aliases of the session verbs. This is the structural answer to John's 'why is the non-cdp lane a whole new set of code'.
adom-wiki pkg install adom/[email protected]Share the progress-bar code instead of the lane keeping its own. Extracted activity::progress_on_hwnd as the single implementation (the filling, running-average-estimated bar capped at 92% until work finishes, then 100% and cleared); with_progress is now a thin session-keyed entry point and the extension lane calls the same function with its window's hwnd. The lane previously hand-rolled a flat 35% bar and discarded ab's reply. Part of ending the pattern John called out: the lane reinventing code the CDP lane already has. Overlay (badge_js) and identity (stamp_hwnd) are already shared; progress was the remaining duplicate primitive.
adom-wiki pkg install adom/[email protected]One overlay composer for both lanes. The extension lane's badge (2.0.520/521) was my own full-bleed 32px PNG composed in the worker, ignoring everything identity::overlay already does: overlaySize (default 75, because at 100 the badge covers the thread tile's bottom line of text, John's 2.0.262 request), the adaptive contrast card, the generic fallback. It stamped over the tile's name. John: 'go look at your overlay icon code ... you fucked up the sizing on your overlays.' The lane now runs identity's badge_js through its own eval channel (it has no CDP), with the same second-rail fetch_favicon_oob fallback, and paints with the same desktop_taskbar call. The worker's private composer is deleted.
adom-wiki pkg install adom/[email protected]Give the nbe-in-pup button a DISTINCT icon; prune retired staged extension folders. nbe's own icon is byte-identical to pup's identity icon (both the teal two-teardrop glyph), so on the shared adom-you toolbar the identity and nbe buttons were indistinguishable and read as a duplicated, broken button (John: 'what the fuck did you do with the adom-you browser extension button'). The pup-staged nbe copy now carries a distinct browser-window mark (same teal family, same filenames so the manifest and the key-derived extension ID are untouched; tools/sync-nbe.sh re-applies it so a re-sync from nb's repo never restores the colliding icon). Separately, stage_extensions_lane now prunes any pup-*-extension folder no longer in the build, so a retired placeholder like pup-lane-extension cannot linger and add a stray icon.
adom-wiki pkg install adom/[email protected]Overlay badge: compose the favicon to a 32px PNG in the extension before handing it to ab. Raw favicon bytes worked for PNG-serving sites (st.com, mouser) and failed the moment a site served an ICO/SVG: digikey's badge was refused by ab's LoadImageW, so the button kept showing Mouser's M after the navigate. The CDP lane never hits this because badge_js draws onto a canvas and ships a PNG; the worker now does the same with createImageBitmap + OffscreenCanvas. Progress bar: use exactly the shape activity.rs sends (state normal with a value, then none) and log a refusal instead of discarding ab's reply, which is why the first cut could not say whether the bar ever showed.
adom-wiki pkg install adom/[email protected]The extension lane keeps the taskbar contract the CDP lane keeps. John: 'why are you causing flashing of the windows taskbar icon when we've been through this 100 times ... you're supposed to default to showing progress bars in the icon. and why do i not see the overlay icon'. The lane made none of the three ab calls the CDP lane makes. Now: an indeterminate progress bar on the lane's button while open/navigate/tab run, cleared after (honouring taskbarActivity and minimalTouch exactly as activity.rs does); the active tab's favicon painted as the overlay badge, fetched by the extension itself since this lane has no CDP to fetch it with; and clear_attention after each of those, which removes the tint Windows paints when it denies Chrome the foreground. That tint was the flash: pup never called desktop_flash_window for this lane, the OS did it.
adom-wiki pkg install adom/[email protected]Re-assert the lane window's size and normal state on every open. fit ran only when dress_window first dressed a window, so a window that later ended up minimized was never corrected: pup reported the lane up and John had nothing on his screen, three times now. Chrome's own saved placement was already the full work area, so this is purely the window being minimized at the OS level afterwards. chrome.windows.update with state normal also restores a minimized window, and it does it without raising anything, which is why this goes through the extension rather than ab geometry.
adom-wiki pkg install adom/[email protected]Complete the adom-you handover, and stop the portless launch from dumping tabs into another thread's window. 2.0.517 closed the CDP browser only if it was in ctx.browsers, which is EMPTY right after a pup restart while a Chrome from before the restart is still holding the directory (pup reconnects to those lazily). So the handover no-opped, the portless launch forwarded to that browser, and Chrome opened the lane's URL as a tab inside the kicad-bridge thread's window: John saw a tab appear in someone else's pup window, which is the exact discourtesy this project has a rule about. The profile's own DevToolsActivePort is the source of truth, so the lane now closes whatever is on that port and waits for SingletonLock to clear before launching. Also fixed pup_ext_status still reporting the retired adom-you-ext profile name.
adom-wiki pkg install adom/[email protected]The extension lane runs on adom-you. One profile, the user's real jar, which is what John has said all along should never be anything else: the separate adom-you-ext jar carried none of his cookies, logins or history (measured, 0.2 MB of History against adom-you's 6.3 MB), which is both a pointless divergence and the empty-profile shape bot walls score against. It was only ever separate because Chrome allows ONE process per --user-data-dir and this lane must run with NO debug port, so it cannot coexist with a CDP browser on the same directory. The lane now TAKES the profile: any CDP browser holding adom-you is closed first (otherwise the portless launch forwards to it and exits, silently handing back a window that still carries a debug port), and a CDP launch on adom-you while the lane owns it is refused with a hint to drive pup_ext_* instead of failing 30 seconds later on a missing DevTools port. Nothing is refused once the lane is closed.
adom-wiki pkg install adom/[email protected]Stop labelling the extension lane anonymous. The identity extension was picked with profile == 'adom-you' exactly, and the lane runs on adom-you-ext, so every lane window wore the anonymous tile: 'not signed in as you, isolated throwaway jar, logins here do not enrich adom-you'. That is false, the lane profile is pup-owned and durable, and John flagged the second-order cost too: a window that advertises itself as an empty throwaway is the profile shape bot walls score against. Any adom-you* jar now wears the signed-in identity. This corrects the LABEL only; the lane still keeps its own cookie jar, which is the substantive issue.
adom-wiki pkg install adom/[email protected]nbe always rides the extension lane; remove the nbeInLane flag. 2.0.509 hid nbe behind that flag because the lane looked dead with it loaded, which was wrong: the lane was equally dead without it and the real cause was pup wiping its own lane token in launch_extdrive (fixed in 2.0.513). The flag was never registered as a settings key either, so pup_configure silently ignored it and reported nbeInLane=None. John needs nbe's toolbar icon as the at-a-glance signal for which lane a window is on: three teal buttons means the CDP lane, four means the extension lane.
adom-wiki pkg install adom/[email protected]Adopt a running extension browser pup has lost track of. When nothing has been served since this pup launched and a browser on pup's own profile says hello with a lane token, pup takes that token instead of fighting it. That case is unwinnable otherwise: the browser is unkillable because pup no longer knows its pids (a restart, or a close whose kill missed the main process and deleted lane.json on the way out), and each new launch simply forwards to it and exits, which is the '1 process(es)' line that has haunted this lane all day. Adoption cannot hijack a working lane, because a working lane has served at least one poll.
adom-wiki pkg install adom/[email protected]Publish the lane token AFTER the stale-browser kill, not before. 2.0.510 taught kill_extdrive to clear EXTDRIVE_LANE, which is correct on its own, but launch_extdrive set the token first and called the kill afterwards, so every launch wiped the token for the launch it was preparing: the extension polled with the correct lane and pup compared it against an empty string and refused, forever. That is why the lane looked dead since 2.0.510 and why I wrongly blamed nbe, then the port.json memo. The /exthello line added in 2.0.512 printed the mismatch in one line: 'carrying lane ext-... (pup wants "")'.
adom-wiki pkg install adom/[email protected]Make the extension lane observable. It deliberately runs with NO CDP debug port, which is the whole point of the lane and also means that when its extension goes quiet there is no way to look inside: today the window launched, loaded all three toolbar extensions, sized and stamped correctly, and the control channel stayed silent with nothing anywhere saying why, so I was reduced to guessing. The extension now POSTs /exthello on every poll attempt BEFORE the lane gate, carrying the lane token it actually holds plus whether its port.json read succeeded, and pup logs it throttled to one line per distinct lane per 30s, saying plainly whether that browser may take work. A token mismatch is now a log line instead of silence.
adom-wiki pkg install adom/[email protected]Fix the poisoned port.json memo that made the extension lane permanently silent. packagedPort() memoized on 'if (_pkgPort !== null)' while its catch set _pkgPort = 0, so ONE failed first read (it races service-worker startup, and sweepBadges can trigger it before the drive loop) locked the memo forever: 0 is !== null so it never retried, and _pkgLane stayed empty, which pupExtPoll treats as 'not the drive browser' and returns. Measured on AdomLapper: the lane window launched, loaded all three toolbar extensions, was stamped and sized correctly, and lastPollMsAgo was never set. Only a SUCCESSFUL read is memoized now; a failure leaves the memo unset so the next tick retries. Also correcting the record from 2.0.510's note: pup_ext_diag attaches over CDP to the adom-you browser by design and never talks to the lane, so the 2.0.506 worker it reported was not cross-talk.
adom-wiki pkg install adom/[email protected]Re-attach to an extension browser that outlived the pup process. EXTDRIVE_LANE and EXTDRIVE_PIDS were in-memory only, so every bridge_install (which restarts pup) orphaned a running ext browser permanently: take_command_for rejects every poll while the token is empty, so the live extension could never re-attach, alive() stayed false, the next pup_ext_open launched a SECOND Chrome that forwarded to the running instance and exited at once (the '1 process(es)' line in the log), and pup_ext_close killed nothing because it knew no pids. Measured on AdomLapper: pup reported browserRunning:false while two of its own Chrome for Testing windows were on John's screen. This also invalidated every nbe measurement taken today, including the one that made me blame nbe for the lane being down. The lane token and pids are now parked in extlane/lane.json, restored at boot against live pids only, and cleared when the lane is closed.
adom-wiki pkg install adom/[email protected]Put the nbe side-load behind pup_configure {nbeInLane}, default off, so the extension lane works again while the cause is found. Measured on AdomLapper: with nbe in the --load-extension list Chrome for Testing spawns and exits within 6 seconds, no load-error dialog, where 2.0.506 came up every time. nbe itself stages correctly now (src/sw.js and the untouched 0.2.13 manifest verified on disk, and the staging sanity gate raises no objection), so the failure is in launching Chrome with it, not in the copy. Default off is the honest state until that is understood.
adom-wiki pkg install adom/[email protected]Fix the staging bug that made Chrome refuse nbe, and never hand Chrome an unverified folder again. tools/gen-assets.py listed only TOP-LEVEL files, so nbe's src/ and icons/ folders were dropped and the staged copy was a manifest pointing at a src/sw.js that was never written: Chrome answered with a modal 'Error Loading Extension ... Could not load background script' in John's face and loaded nothing. The generator now walks recursively, and the Rust staging creates parent directories before writing (it had ignored the failed write). Added a sanity gate: before a folder is passed to --load-extension pup checks that every file the manifest references (service worker, popup, icons) is actually on disk, and drops the folder with a log line instead of letting Chrome throw a modal.
adom-wiki pkg install adom/[email protected]Load the REAL nbe into the extension lane instead of my placeholder. John, correctly: 'i thought that was the whole point of me saying to you, just use the nbe inside pup'. On 2026-08-22 I agreed to add nbe as the 4th --load-extension and then wrote a 259-line control channel of my own instead; measured against nbe it has no click, type, dialog, upload, console or full-page capture at all, so it was a weak duplicate of code we already own. pup now stages nb's extension folder verbatim (src/extension-nbe, synced by tools/sync-nbe.sh, nb's repo stays the source of truth) and adds exactly one file: toolbar.json {toolbarIcon:on}, the packaged default nb built for pup on 2026-09-12 so the icon shows in a pup window while the user's own Chrome keeps Chrome's unpinned default. pup pins it, since an extension cannot pin itself and pup owns the profile. nbe's manifest is deliberately NOT version-stamped the way pup's own extensions are: nb's readiness compares per-profile extension versions and a rewrite would report the user's browser stale. Open question this ships to answer: whether Chrome for Testing finds the inc.adom.native_browser native-messaging host at all.
adom-wiki pkg install adom/[email protected]A fourth teal toolbar button on the extension-driven lane (John: 'i want a 4th icon showing in this bar that's teal and looks similar to your 3 browser extensions you load already so that i can differentiate between CDP lane pup windows and nbe lane pup windows'). New src/extension-lane: an MV3 tile in the existing toolbar family (the same teal rounded square and ink glyph as the dots, pen and identity marks), drawn as a browser window, with a popup saying what the lane is. It stages ONLY when a lane token is set, so three buttons means the CDP lane and four means the extension lane. Note for the record: pup loads no nb extension, so nothing of nbe's was involved; the buttons on a pup window are pup's own four extensions.
adom-wiki pkg install adom/[email protected]One shared DISABLE_FEATURES list across both browser lanes. The ext lane carried a hand-trimmed copy that had lost the startup-promo feature ids, so John saw Chromium's 'now launches when Windows starts so you can begin browsing instantly' bar on an extension window; it also never passed --disable-field-trial-config, which is what gates promos like that one. Both lanes now build their --disable-features from the same constant, so the two cannot drift again.
adom-wiki pkg install adom/[email protected]extdrive window sizing + taskbar identity + the CfT infobar. Three flags/paths the Rust ext lane never inherited from the CDP lane: --start-maximized (window opened at the profile's remembered ~60% width), --disable-infobars (CfT's 'only for automated testing' bar, which docs/WHY-CFT.md has always said pup suppresses this way), and dress_window running on every verb path instead of only the cold-launch path that returns early (pup.log had zero stamp lines). Identity now goes through the shared identity::stamp_hwnd so an ext window wears the same thread tile a CDP window does. Geometry goes through the extension's new fit action (chrome.windows.update, plain bounds, logical px both sides) rather than ab's desktop_set_window_bounds or a maximize, per the geometry rule: both of those raise the window.
adom-wiki pkg install adom/[email protected]extension windows get pup taskbar identity and placement
adom-wiki pkg install adom/[email protected]ext control channel scoped to its own browser via a per-launch lane token
adom-wiki pkg install adom/[email protected]extension lane gains tabs, screenshots and activation
adom-wiki pkg install adom/[email protected]pup_ext_eval awaits promises
adom-wiki pkg install adom/[email protected]extension service worker re-registered every release via a versioned script URL
adom-wiki pkg install adom/[email protected]extension updates load on existing profiles (manifest version stamp); --disable-quic back (no firewall prompt)
adom-wiki pkg install adom/[email protected]pup_ext_diag: read the extension service worker over CDP
adom-wiki pkg install adom/[email protected]extension-driven launch clears a stale browser and the profile lock first
adom-wiki pkg install adom/[email protected]make the extension control channel observable
adom-wiki pkg install adom/[email protected]the toolbar extension finds pup on any port (port.json), not just two hardcoded ones
adom-wiki pkg install adom/[email protected]extension-driven: restore network-quieting flags, real kill, fast open
adom-wiki pkg install adom/[email protected]no third-party extension prompt in a fresh pup profile
adom-wiki pkg install adom/[email protected]restore the takeover audit log and make pup_close everyone a user-only action
adom-wiki pkg install adom/[email protected]teach extension-driven mode in the pup skill (#109)
adom-wiki pkg install adom/[email protected]extension-driven mode: correct tab targeting, liveness and close (#109)
adom-wiki pkg install adom/[email protected]extension-driven windows: pup drives a Chrome with no CDP debug port (#109)
adom-wiki pkg install adom/[email protected]stockFlags setting: near-stock Chrome launch flags (#109 experiment)
adom-wiki pkg install adom/[email protected]ECH off again: it broke st.com/mouser on AdomLapper's network
adom-wiki pkg install adom/[email protected]a browser pin survives relaunch (pup_use actually takes) (#109)
adom-wiki pkg install adom/[email protected]cdpQuiet setting: skip the Runtime.enable CDP leak (#109 experiment)
adom-wiki pkg install adom/[email protected]consumer-Chrome transport (ECH+QUIC), languages, no pre-granted permissions, native-code EME shim (#109)
adom-wiki pkg install adom/[email protected]pup mirrors the installed consumer Chrome version in UA + client hints (#109)
adom-wiki pkg install adom/[email protected]restore Chrome sign-in/sync prompt suppression flags dropped in the Rust port
adom-wiki pkg install adom/[email protected]pup presents as consumer Google Chrome (UA brand + EME shim), unblocking Akamai brand walls (#109)
adom-wiki pkg install adom/[email protected]renderCheck ok:false + nbrowser hint on chrome-error pages; hide navigator.webdriver; pup_download fails fast or polls (#109)
adom-wiki pkg install adom/[email protected]a window never gains a duplicate tab for a URL it already has (pump + relaunch dedup)
adom-wiki pkg install adom/[email protected]Chrome never restores its own session (wipe tab-restore files); pup owns every tab
adom-wiki pkg install adom/[email protected]a bulk close cancels an in-flight restore instead of blocking on it
adom-wiki pkg install adom/[email protected]the restore drain waits for the whole batch (reservation set), not a single relaunch
adom-wiki pkg install adom/[email protected]a bulk close waits for an in-flight restore so no window lingers behind it
adom-wiki pkg install adom/[email protected]a window mid-restore ignores Chrome's auto-restored phantom tab
adom-wiki pkg install adom/[email protected]restart waits for an in-flight restore to finish; toolbar pen resolves _tabUrl to the foreground window
adom-wiki pkg install adom/[email protected]relaunch counter resets on success (no window given up after two good relaunches); _tabUrl prefers a live, recently driven window
adom-wiki pkg install adom/[email protected]pup_close deletes the session file before closing tabs (no ghost windows after an update); crash recovery runs the instant the browser socket closes
adom-wiki pkg install adom/[email protected]crash recovery drops every session before relaunching any (no dead tabs listed mid-recovery)
adom-wiki pkg install adom/[email protected]restart never re-attaches a relaunching window to another window's tab; file re-attach skips live tabs
adom-wiki pkg install adom/[email protected]A tab pup opens is tracked the instant it is attached, so recovery no longer duplicates tabs; adoption margin 1.5 s
adom-wiki pkg install adom/[email protected]pup_restart_browser returns at once with a restoring list; the relaunch runs on a helper thread
adom-wiki pkg install adom/[email protected]pup_restart_browser relaunches every window from its file synchronously and reports restored tabs; found by the soak on arav-rog
adom-wiki pkg install adom/[email protected]pup_restart_browser waits for the profile lock to clear so the next open succeeds
adom-wiki pkg install adom/[email protected]Idle browsers are released after a grace period (idleBrowserQuitMin, default 10) instead of holding a gigabyte forever
adom-wiki pkg install adom/[email protected]pup reports box RAM, free percentage and the cost of a tab back to the calling AI on every open and every survey
adom-wiki pkg install adom/[email protected]Wedged-browser watchdog with an honest toast, pup_restart_browser, and session files that carry every tab so a restart is lossless
adom-wiki pkg install adom/[email protected]A click never leaves the mouse button down: press and release are one unit, retried, and an orphaned press is released by the next mouse verb
adom-wiki pkg install adom/[email protected]Focus-emulation policy reaches the file-based re-attach path, converges on the health tick, and moves into Ctx so a session clone cannot clobber it
adom-wiki pkg install adom/[email protected]Focus emulation follows the active tab instead of every attached tab, so Chrome throttles and can reclaim background tabs
adom-wiki pkg install adom/[email protected]Esc always closes the annotation overlay: listener kept after a quick capture, registered on window, document and canvas, canvas focused when armed
adom-wiki pkg install adom/[email protected]Recovery adopts a window's other tabs at boot and reconnect; boot Page.enable off the blocking path
adom-wiki pkg install adom/[email protected]Adopting a discarded tab no longer blocks 30 s (page setup on a helper thread); attach_tab idempotent
adom-wiki pkg install adom/[email protected]Boot recovery repaired after 2.0.453: discovery replay ignored, adoption only into window-owning sessions, named sessions recovered first, no double re-attach, failures logged
adom-wiki pkg install adom/[email protected]Window survives its tab being replaced (tabless grace + re-attach by CDP window id); user-opened tabs join their window; toolbar pen resolves by _tabUrl
adom-wiki pkg install adom/[email protected]Every bundled SKILL.md parses as strict YAML (#103: pup-adom-wiki description folded); ship.sh aborts on an invalid frontmatter
adom-wiki pkg install adom/[email protected]Desktop recording guidance: ab's native GPU-accelerated recorder first, pup's Meet-style screen share as the broadly compatible fallback; in hints and skills
adom-wiki pkg install adom/[email protected]winAttentionFlash setting (default off) in the Settings dialog: the Windows attention flash on new windows, off = focus:false births
adom-wiki pkg install adom/[email protected]New windows created with focus:false: Chrome never asks Windows for the foreground, so no denied activation and no orange attention state on the button
adom-wiki pkg install adom/[email protected]Thread tiles drawn at every size Windows shows them (t10): each ICO entry rendered by the canvas at its own size, no resampling
adom-wiki pkg install adom/[email protected]Born wearing the tile: newborn stamped natively before Chrome's first show (watcher thread + in-process property store); window icon posted after commit
adom-wiki pkg install adom/[email protected]Born wearing the tile: newborn stamped natively before Chrome's first show (watcher thread + in-process property store); frame_windows_all + stamp_identity
adom-wiki pkg install adom/[email protected]Tile token hashes tile content (Node v2.0.271 parity): regenerated tiles keep their AUMID, no button rebuild under an open jump list; rolling pup.log file
adom-wiki pkg install adom/[email protected]Annotate this page from the jump list raises the window again (Node v2.0.293 user-caller rule); ralph asserts the raise
adom-wiki pkg install adom/[email protected]Closes verified against the OS window (ab WM_CLOSE fallback), orphan windows swept on connect; tile text width on the rounded plate
adom-wiki pkg install adom/[email protected]- v2.0.441 candidate (rust): Thread tiles through the brand raster pipeline (Lanczos3, IM unsharp, alpha clamp) in Rust on the Adom rounded plate; two lines, no ellipsis; tile generation t9 (John Lauer)
- Publish 2.0.441 (John Lauer)
- v2.0.440 candidate (rust): Windows placed in CSS pixels measured from the page and placed again once settled (Node v1.8.66 and v1.9.342): no overhang on scaled displays, no cascade drift (John Lauer)
- Publish 2.0.440 (John Lauer)
- v2.0.439 candidate (rust): Windows placed in CSS pixels measured from the page (Node v1.8.66), no overhang on scaled displays (John Lauer)
- Publish 2.0.439 (John Lauer)
- Update 3 file(s) (John Lauer)
- v2.0.438 candidate (rust): pup_open_window honours the declared owner (Node ownerSource declared); tile cache generation bumped so every thread tile re-renders with the multi-size renderer (John Lauer)
- Publish 2.0.438 (John Lauer)
- Update 21 file(s) (John Lauer)
- v2.0.437 candidate (rust): CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (no button during the first paint, then stamp and AddTab), focus handed back when a birth takes it, identity audit is a detector only (John Lauer)
- Publish 2.0.437 (John Lauer)
- v2.0.436 candidate (rust): CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (no button during the first paint, then stamp and AddTab), identity audit is a detector only (John Lauer)
- Publish 2.0.436 (John Lauer)
- v2.0.435 candidate (rust): CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (park first, settle, DeleteTab, stamp, AddTab), identity audit is a detector only (John Lauer)
- Publish 2.0.435 (John Lauer)
- v2.0.434 candidate (rust): CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (on-screen within 50 ms, ITaskbarList DeleteTab, stamp, AddTab), identity audit is a detector only (John Lauer)
- Publish 2.0.434 (John Lauer)
- v2.0.433 candidate (rust): CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (ITaskbarList DeleteTab, stamp, AddTab; the window is never hidden), identity audit is a detector only (John Lauer)
- Publish 2.0.433 (John Lauer)
- v2.0.432 candidate (rust): CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (stamped hidden, re-shown off-screen, attention flag cleared, then moved on-screen), identity audit is a detector only (John Lauer)
- Publish 2.0.432 (John Lauer)
- Publish 2.0.431 (John Lauer)
- v2.0.430 candidate (rust): CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (stamped hidden, re-shown off-screen, then moved on-screen), identity audit is a detector only (John Lauer)
- Publish 2.0.430 (John Lauer)
- v2.0.429 candidate (rust): CSP-safe favicon badges (data: before blob:), thread tiles rendered natively at every ICO size as 32-bit DIBs, one taskbar button born with the thread tile (stamped while hidden, shown once), identity audit is a detector only (John Lauer)
- Publish 2.0.429 (John Lauer)
- v2.0.428 candidate (rust): Overlay badges as Node painted them: 48 px compositor with Node's card rules, globe/PDF fallback instead of the Adom mark, favicon rails and retries on open and navigate, tab-switch and settings repaint triggers, paint signature, dashboard provenance (John Lauer)
- Publish 2.0.428 (John Lauer)
- Fix wiki browser skill YAML so Codex can load its metadata (John Lauer)
- v2.0.427 candidate (rust): Overlay badges as Node painted them: 48 px compositor with Node's card rules, globe/PDF fallback instead of the Adom mark, favicon rails and retries, tab-switch and settings repaint triggers, paint signature, dashboard provenance (John Lauer)
- Publish 2.0.427 (John Lauer)
- Update 12 file(s) (John Lauer)
- v2.0.426 candidate (rust): Z-order doctrine restored from Node: no activation at birth (the 2.0.425 attention clear removed), bottom-unless-foreground at every re-park with birth grace and the user-in-use latch, foreground:true opens honoured (John Lauer)
- Publish 2.0.426 (John Lauer)
- Update 9 file(s) (John Lauer)
- v2.0.425 candidate (rust): Taskbar activity contract restored from Node: taskbarActivity progress|flash|off (dead keys openFlash/autoFlash/agentActivity/fgWatch refused), attention tint cleared after birth, icon-apply and screenshot progress bars, alert = progress pulse, four-count flash only in flash mode (John Lauer)
- Publish 2.0.425 (John Lauer)
- Update 10 file(s) (John Lauer)
- v2.0.424 candidate (rust): Jump-list tasks work again: human callers (jump list, toolbar, dashboard) bypass window ownership as in Node; tools/jumplist-ralph.py fires every task through the real shim path; release profile thin LTO (John Lauer)
- Publish 2.0.424 (John Lauer)
- v2.0.423 candidate (rust): Jump-list tasks and taskbar relaunch call pup's own exe (--jumplist mode) instead of powershell.exe + a .ps1; explicit pup icon on every task; the .ps1 is removed at boot (John Lauer)
- Publish 2.0.423 (John Lauer)
- v2.0.422 candidate (rust): Launch Chrome with --no-startup-window (Node v1.8.51 rule) and close orphan about:blank targets on connect: no more stock Chrome for Testing taskbar buttons beside the thread tile (John Lauer)
- Publish 2.0.422 (John Lauer)
- v2.0.421 candidate (rust): Start Menu anchor row (aumidShortcut) in the dashboard Settings dialog; jump-list row names the measured cause of the first-click flash (ab#155, pup-bridge#101) (John Lauer)
- Publish 2.0.421 (John Lauer)
- Update 2 file(s) (John Lauer)
- Update 11 file(s) (John Lauer)
- v2.0.420 candidate (rust): Runtime data under ADOM_BRIDGE_DATA_DIR (profiles/sessions/screenshots/recordings, legacy dirs moved once) with retention (screenshots 14d/1GB, recordings 30d/3GB); aumidShortcut maps to ab 2.1.49 anchor:true/anchorFolder 'Adom Pup'; demo driver take-2 fixes; pup-bridge#98 #99, ab#155 (John Lauer)
- Publish 2.0.420 (John Lauer)
- Update 5 file(s) (John Lauer)
- plan: vault sync, demo tour, ab#155/#157 state (John Lauer)
- v2.0.419 candidate (rust): The pup demo tour (tools/pup-demo.py + the 8-beat Play-the-demo prompt); consent toasts carry reason/aiThread/delegate for ab->ah forwarding (ab#157); misrouted desktop_record_* answers wrong_bridge (ab#150); pup_login reports credentialSource on the 2FA/captcha path; aumidShortcut setting (ab#155 anchor). (John Lauer)
- Publish 2.0.419 (John Lauer)
- pup demo tour driver (tools/pup-demo.py) + the 8-beat Play-the-demo prompt; consent toast reason/aiThread; aumidShortcut setting; recorder misroute wording (John Lauer)
- v2.0.418 candidate (rust): aumidShortcut setting: opt-in Start Menu shortcut anchor so jump lists stay on the first right-click (ab#155). (John Lauer)
- Publish 2.0.418 (John Lauer)
- v2.0.417 candidate (rust): Fix: pup_vault_sync peer accepts a same-account desktop egress (container-empty), still refuses cloud containers. (John Lauer)
- Publish 2.0.417 (John Lauer)
- v2.0.416 candidate (rust): Fix: pup_vault_sync cross-desktop egress no longer hardcodes the app name (peer ab infers it). (John Lauer)
- Publish 2.0.416 (John Lauer)
- v2.0.415 candidate (rust): Fix: pup_vault_sync consent toast now carries Allow/Deny buttons (2.0.414 rendered none). (John Lauer)
- Publish 2.0.415 (John Lauer)
- credentials skill: the serve-from-the-vault doctrine + pup_vault_sync (never ask the human for a password) (John Lauer)
- v2.0.414 candidate (rust): pup_vault_sync {peer,reason}: bidirectional adom-you credential union across the user's desktops (newest-wins, pup-to-pup, no AI sees a password), one consent toast; internal vault_export/import refused for relay. (John Lauer)
- Publish 2.0.414 (John Lauer)
- 2.0.413: missing verbs + behaviors (assisted_click, import, fg-watch, url lint, notices, chrome-stable, eval frame, move_to_workspace), issue #97 (disable on-device model, reap by age, CONSERVATIVE auto-janitor), goldens 37->56, macOS unsupported in the exe package (John Lauer)
- v2.0.413 candidate (rust): SAFETY: the auto profile-janitor now reaps only leaked iso-* jars + strips the on-device model dir; named durable profiles are deleted only by an explicit pup_reap_profiles call (the 2.0.409-2.0.412 janitor auto-deleted idle named profiles, which was wrong). (John Lauer)
- Publish 2.0.413 (John Lauer)
- v2.0.412 (insiders): Rust exe parity (missing verbs + behaviors, goldens 37->56 all matching) and issue #97 (disable the 4 GB on-device Chrome model download, reap stale profiles by age + strip the model dir, daily janitor). (John Lauer)
- v2.0.412 candidate (rust): Rust exe parity (missing verbs + behaviors, goldens 37->56 all matching) and issue #97 (disable the 4 GB on-device Chrome model download, reap stale profiles by age + strip the model dir, daily janitor). (John Lauer)
- Publish 2.0.412 (John Lauer)
- v2.0.411 candidate (rust): Rust exe parity (missing verbs + behaviors, goldens 37->57) and issue #97 (disable the 4 GB on-device Chrome model download, reap stale profiles by age + strip the model dir, daily janitor); aligned credential_delete/card_set/record_status/screenshot_element/full_res/progress/deps/install_toolbar/annotate output shapes to the Node build. (John Lauer)
- Publish 2.0.411 (John Lauer)
- v2.0.410 candidate (rust): Rust exe parity (pup_assisted_click, import verbs, fg-watch, URL lint, session notices, real-Chrome install, pup_eval frame, move_to_workspace; macOS unsupported; goldens 37->63) AND issue #97: disable the 4 GB on-device Chrome AI model download on every launch, pup_reap_profiles sweeps stale profiles by idle age and strips the model dir, daily profile-janitor. (John Lauer)
- Publish 2.0.410 (John Lauer)
- v2.0.409 candidate (rust): Rust exe parity: pup_assisted_click, pup_import_scan/browser_logins, the fg-watch, URL lint, session notices, real-Chrome install, pup_eval {frame}, move_to_workspace; macOS declared unsupported in the exe package; goldens 37->63. (John Lauer)
- Publish 2.0.409 (John Lauer)
- 2.0.408 on insiders: recovered tabs get their page scripts back; plan status (John Lauer)
- v2.0.408 candidate (rust): pup as one Rust exe (spawn.kind exe): the Node runtime leaves the package. Parity gate green on the loopback and through ab; recovery through the session file's cdpPort, relaunch when Chrome is gone (boot + health loop), recovered tabs get the owner chip, floaty and login capture back; panic log; port bind retry; pup_close everyone:true; render_html hint on origin CSP. (John Lauer)
- Publish 2.0.408 (John Lauer)
- 2.0.407: the Rust exe ships to insiders; rust-build/ship candidate flow, parity + ab-smoke gates, plan and docs updated (John Lauer)
- v2.0.407 candidate (rust): pup as one Rust exe (spawn.kind exe): the Node runtime leaves the package. Parity gate green on the loopback and through ab; recovery through the session file's cdpPort, relaunch when Chrome is gone (at boot and from the health loop); panic log; port bind retry; pup_close everyone:true; render_html hint on origin CSP. (John Lauer)
- Publish 2.0.407 (John Lauer)
- v2.0.406 candidate (rust): pup as one Rust exe (spawn.kind exe): the Node runtime leaves the package. Parity gate green on the loopback and through ab; recovery through the session file's cdpPort + relaunch when Chrome is gone; panic log; port bind retry; pup_close everyone:true; render_html hint on origin CSP. (John Lauer)
- Publish 2.0.406 (John Lauer)
- v2.0.405 candidate (rust): pup as one Rust exe (spawn.kind exe): parity gate green on the loopback and through ab; recovery through the session file's cdpPort + relaunch when Chrome is gone; panic log; bind retry; pup_close everyone:true; screencast diagnostics. (John Lauer)
- Publish 2.0.405 (John Lauer)
- v2.0.404 candidate (rust): pup as one Rust exe (spawn.kind exe): parity gate green on the loopback and through ab; recovery re-attaches through the session file's cdpPort and relaunches windows whose Chrome is gone; panics land in ~/.adom/bridge-logs/pup-rust-panic.log; the port bind retries for 10 s; pup_close honours everyone:true. (John Lauer)
- Publish 2.0.404 (John Lauer)
- v2.0.403 candidate (rust): pup as one Rust exe (spawn.kind exe); every success carries success:true + the full JSON output so ab's relay and CLI unwrap it (found by the via-ab parity run); recovery re-attaches through the session file's cdpPort and relaunches windows whose Chrome is gone. (John Lauer)
- Publish 2.0.403 (John Lauer)
- v2.0.402 candidate (rust): pup as one Rust exe (spawn.kind exe); recovery re-attaches through the session file's cdpPort and relaunches windows whose Chrome is gone (_cleanupReport). (John Lauer)
- Publish 2.0.402 (John Lauer)
- v2.0.401 candidate (rust): pup as one Rust exe (spawn.kind exe): the Node runtime leaves the package; parity gate green; ship.sh gains --shell and --candidate. (John Lauer)
- Publish 2.0.401 (John Lauer)
- rust: Phase 4 parity gate (tools/parity.py) green 37/37 on winvm; Node response envelope ported into dispatch (verb catalog, bug invite, output mirror, render probe), session rows carry lastAgentUpdate/ownerSource/overlay/flash, loop cadences in pup_status, default permissions granted at launch, Hydrogen proxy (John Lauer)
- rust: Phase 3 complete (vault, cards, wiki auto-sign + view flip, annotate, tab + screen recording, highFps lease, download, identity audit, Hydrogen proxy); placeholder crates removed; plan status updated (John Lauer)
- Delete rust/record/src/lib.rs (John Lauer)
adom-wiki pkg install adom/[email protected]Thread tiles through the brand raster pipeline (Lanczos3, IM unsharp, alpha clamp) in Rust on the Adom rounded plate; two lines, no ellipsis; tile generation t9
adom-wiki pkg install adom/[email protected]Windows placed in CSS pixels measured from the page and placed again once settled (Node v1.8.66 and v1.9.342): no overhang on scaled displays, no cascade drift
adom-wiki pkg install adom/[email protected]Windows placed in CSS pixels measured from the page (Node v1.8.66), no overhang on scaled displays
adom-wiki pkg install adom/[email protected]pup_open_window honours the declared owner (Node ownerSource declared); tile cache generation bumped so every thread tile re-renders with the multi-size renderer
adom-wiki pkg install adom/[email protected]CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (no button during the first paint, then stamp and AddTab), focus handed back when a birth takes it, identity audit is a detector only
adom-wiki pkg install adom/[email protected]CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (no button during the first paint, then stamp and AddTab), identity audit is a detector only
adom-wiki pkg install adom/[email protected]CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (park first, settle, DeleteTab, stamp, AddTab), identity audit is a detector only
adom-wiki pkg install adom/[email protected]CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (on-screen within 50 ms, ITaskbarList DeleteTab, stamp, AddTab), identity audit is a detector only
adom-wiki pkg install adom/[email protected]CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (ITaskbarList DeleteTab, stamp, AddTab; the window is never hidden), identity audit is a detector only
adom-wiki pkg install adom/[email protected]CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (stamped hidden, re-shown off-screen, attention flag cleared, then moved on-screen), identity audit is a detector only
adom-wiki pkg install adom/[email protected]Fix pup-adom-wiki YAML header so Codex loads the skill. Skill package update; runtime and bridge update manifest unchanged.
adom-wiki pkg install adom/[email protected]CSP-safe favicon badges, thread tiles rendered natively at every ICO size, one taskbar button born with the thread tile (stamped hidden, re-shown off-screen, then moved on-screen), identity audit is a detector only
adom-wiki pkg install adom/[email protected]CSP-safe favicon badges (data: before blob:), thread tiles rendered natively at every ICO size as 32-bit DIBs, one taskbar button born with the thread tile (stamped while hidden, shown once), identity audit is a detector only
adom-wiki pkg install adom/[email protected]Overlay badges as Node painted them: 48 px compositor with Node's card rules, globe/PDF fallback instead of the Adom mark, favicon rails and retries on open and navigate, tab-switch and settings repaint triggers, paint signature, dashboard provenance
adom-wiki pkg install adom/[email protected]Overlay badges as Node painted them: 48 px compositor with Node's card rules, globe/PDF fallback instead of the Adom mark, favicon rails and retries, tab-switch and settings repaint triggers, paint signature, dashboard provenance
adom-wiki pkg install adom/[email protected]Z-order doctrine restored from Node: no activation at birth (the 2.0.425 attention clear removed), bottom-unless-foreground at every re-park with birth grace and the user-in-use latch, foreground:true opens honoured
adom-wiki pkg install adom/[email protected]Taskbar activity contract restored from Node: taskbarActivity progress|flash|off (dead keys openFlash/autoFlash/agentActivity/fgWatch refused), attention tint cleared after birth, icon-apply and screenshot progress bars, alert = progress pulse, four-count flash only in flash mode
adom-wiki pkg install adom/[email protected]Jump-list tasks work again: human callers (jump list, toolbar, dashboard) bypass window ownership as in Node; tools/jumplist-ralph.py fires every task through the real shim path; release profile thin LTO
adom-wiki pkg install adom/[email protected]Jump-list tasks and taskbar relaunch call pup's own exe (--jumplist mode) instead of powershell.exe + a .ps1; explicit pup icon on every task; the .ps1 is removed at boot
adom-wiki pkg install adom/[email protected]Launch Chrome with --no-startup-window (Node v1.8.51 rule) and close orphan about:blank targets on connect: no more stock Chrome for Testing taskbar buttons beside the thread tile
adom-wiki pkg install adom/[email protected]Start Menu anchor row (aumidShortcut) in the dashboard Settings dialog; jump-list row names the measured cause of the first-click flash (ab#155, pup-bridge#101)
adom-wiki pkg install adom/[email protected]Runtime data under ADOM_BRIDGE_DATA_DIR (profiles/sessions/screenshots/recordings, legacy dirs moved once) with retention (screenshots 14d/1GB, recordings 30d/3GB); aumidShortcut maps to ab 2.1.49 anchor:true/anchorFolder 'Adom Pup'; demo driver take-2 fixes; pup-bridge#98 #99, ab#155
adom-wiki pkg install adom/[email protected]The pup demo tour (tools/pup-demo.py + the 8-beat Play-the-demo prompt); consent toasts carry reason/aiThread/delegate for ab->ah forwarding (ab#157); misrouted desktop_record_* answers wrong_bridge (ab#150); pup_login reports credentialSource on the 2FA/captcha path; aumidShortcut setting (ab#155 anchor).
adom-wiki pkg install adom/[email protected]aumidShortcut setting: opt-in Start Menu shortcut anchor so jump lists stay on the first right-click (ab#155).
adom-wiki pkg install adom/[email protected]Fix: pup_vault_sync peer accepts a same-account desktop egress (container-empty), still refuses cloud containers.
adom-wiki pkg install adom/[email protected]Fix: pup_vault_sync cross-desktop egress no longer hardcodes the app name (peer ab infers it).
adom-wiki pkg install adom/[email protected]Fix: pup_vault_sync consent toast now carries Allow/Deny buttons (2.0.414 rendered none).
adom-wiki pkg install adom/[email protected]pup_vault_sync {peer,reason}: bidirectional adom-you credential union across the user's desktops (newest-wins, pup-to-pup, no AI sees a password), one consent toast; internal vault_export/import refused for relay.
adom-wiki pkg install adom/[email protected]SAFETY: the auto profile-janitor now reaps only leaked iso-* jars + strips the on-device model dir; named durable profiles are deleted only by an explicit pup_reap_profiles call (the 2.0.409-2.0.412 janitor auto-deleted idle named profiles, which was wrong).
adom-wiki pkg install adom/[email protected]Rust exe parity (missing verbs + behaviors, goldens 37->56 all matching) and issue #97 (disable the 4 GB on-device Chrome model download, reap stale profiles by age + strip the model dir, daily janitor).
adom-wiki pkg install adom/[email protected]Rust exe parity (missing verbs + behaviors, goldens 37->57) and issue #97 (disable the 4 GB on-device Chrome model download, reap stale profiles by age + strip the model dir, daily janitor); aligned credential_delete/card_set/record_status/screenshot_element/full_res/progress/deps/install_toolbar/annotate output shapes to the Node build.
adom-wiki pkg install adom/[email protected]Rust exe parity (pup_assisted_click, import verbs, fg-watch, URL lint, session notices, real-Chrome install, pup_eval frame, move_to_workspace; macOS unsupported; goldens 37->63) AND issue #97: disable the 4 GB on-device Chrome AI model download on every launch, pup_reap_profiles sweeps stale profiles by idle age and strips the model dir, daily profile-janitor.
adom-wiki pkg install adom/[email protected]Rust exe parity: pup_assisted_click, pup_import_scan/browser_logins, the fg-watch, URL lint, session notices, real-Chrome install, pup_eval {frame}, move_to_workspace; macOS declared unsupported in the exe package; goldens 37->63.
adom-wiki pkg install adom/[email protected]pup as one Rust exe (spawn.kind exe): the Node runtime leaves the package. Parity gate green on the loopback and through ab; recovery through the session file's cdpPort, relaunch when Chrome is gone (boot + health loop), recovered tabs get the owner chip, floaty and login capture back; panic log; port bind retry; pup_close everyone:true; render_html hint on origin CSP.
adom-wiki pkg install adom/[email protected]pup as one Rust exe (spawn.kind exe): the Node runtime leaves the package. Parity gate green on the loopback and through ab; recovery through the session file's cdpPort, relaunch when Chrome is gone (at boot and from the health loop); panic log; port bind retry; pup_close everyone:true; render_html hint on origin CSP.
adom-wiki pkg install adom/[email protected]pup as one Rust exe (spawn.kind exe): the Node runtime leaves the package. Parity gate green on the loopback and through ab; recovery through the session file's cdpPort + relaunch when Chrome is gone; panic log; port bind retry; pup_close everyone:true; render_html hint on origin CSP.
adom-wiki pkg install adom/[email protected]pup as one Rust exe (spawn.kind exe): parity gate green on the loopback and through ab; recovery through the session file's cdpPort + relaunch when Chrome is gone; panic log; bind retry; pup_close everyone:true; screencast diagnostics.
adom-wiki pkg install adom/[email protected]pup as one Rust exe (spawn.kind exe): parity gate green on the loopback and through ab; recovery re-attaches through the session file's cdpPort and relaunches windows whose Chrome is gone; panics land in ~/.adom/bridge-logs/pup-rust-panic.log; the port bind retries for 10 s; pup_close honours everyone:true.
adom-wiki pkg install adom/[email protected]pup as one Rust exe (spawn.kind exe); every success carries success:true + the full JSON output so ab's relay and CLI unwrap it (found by the via-ab parity run); recovery re-attaches through the session file's cdpPort and relaunches windows whose Chrome is gone.
adom-wiki pkg install adom/[email protected]pup as one Rust exe (spawn.kind exe); recovery re-attaches through the session file's cdpPort and relaunches windows whose Chrome is gone (_cleanupReport).
adom-wiki pkg install adom/[email protected]pup as one Rust exe (spawn.kind exe): the Node runtime leaves the package; parity gate green; ship.sh gains --shell and --candidate.
adom-wiki pkg install adom/[email protected]- plan: Phase 2 status (48 verbs native, recovery, identity, dashboard measured on winvm); dashboard favicon fallback (John Lauer)
- rust: dashboard page + SSE snapshot + image/action routes, /api/status, /identity, embedded MV3 toolbar extensions with --load-extension and pinned prefs, pup_dashboard verb (John Lauer)
- rust: taskbar identity through ab (tiles rendered by the browser, AUMID register+stamp, jump list, favicon overlay), reconnect learns the browser pid, close waits for Chrome to exit (John Lauer)
- rust: Phase 2 part 1 (tabs, input, dialogs, viewport, history, fetch, render_html, maximize; event pump; recovery + health loop; raise/lower/alert/progress; configure/use/quit_idle/rescan); measured on winvm incl. kill+restart recovery (John Lauer)
- docs/contract: golden fixtures recorded from the Node build 2.0.399 for the Rust port (John Lauer)
- rust: Phase 0 (contract fixtures, ab asks, workspace) + Phase 1 skeleton (core, host, host-win, host-mac stubs, cdp, browser, session, verbs, dashboard, bridge); measured on winvm: CfT up in 769ms, background window in 1.75s, eval/navigate/screenshot/close in the Node shapes (John Lauer)
- docs: first-run contract in the Rust plan (arav-rog findings), changelog 2.0.397-2.0.399, ship.sh publishes pkg before release (John Lauer)
- v2.0.399 (insiders): pup-bridge#94: canonical pup_screen_record_*/pup_recorder_* names for the Chrome screen-share recorder (desktop_* names stay as aliases until ab-core serves them natively, adom-bridge#143), recorder responses carry the naming/ownership hint. ship.sh publishes the skills pkg before creating the release (a release-born version row never gets the tarball, adom/wiki#188). Archive size shown when the download is reused. (John Lauer)
- Publish 2.0.399 (John Lauer)
- v2.0.398 (insiders): Chrome for Testing unpack could hang forever in puppeteer's in-process extract-zip (arav-rog: 3 files then silence for 7 min, the origin of the half-populated folders). pup now downloads only and unpacks in a supervised child process (OS tar first, extract-zip worker fallback) with a stall watchdog, verifies the exe, renames the .partial folder into place atomically; readiness shows a real unpack phase. (John Lauer)
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]- Publish 2.0.397 (John Lauer)
- v2.0.397 (insiders): First-run fix (arav-rog): npm install can no longer fail on puppeteer's postinstall Chrome download (.puppeteerrc.cjs skipDownload; pup provisions CfT itself), and every cache folder without an executable is pruned at warmup. pup-bridge#92: waits on a human answer blocked_on_user (consent registry, 45s in-verb / 120s toast, re-attach on re-call; assisted click; login 2FA/captcha walls). pup-bridge#93: desktop_record_* labelled as ab-core's, served by pup until adom-bridge#143. (John Lauer)
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Promoted to public on 2026-09-04.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Promoted to public on 2026-09-04.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Insiders 2026-09-02: card vault + pup_fill_card with per-charge approval (#84), pup_credential_reveal gated on X-Adom-Verified-Origin (#82), consent toasts retracted on timeout, annotate Auto/Multi modes + Alt+Shift+M, temporary browser pins + _toolbarNotice (#81), identity audit log (#83), insiders tier (#86). Promoted to public on 2026-09-02.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]- Publish 2.0.353 (John Lauer)
- v2.0.353: Native dialog handling actually works now: detection scanned only the legacy sessionId so it never fired for the zero-id and window-label callers that everyone uses, and a modal blocks EVERY pup window rather than its own, so pup_dialog now finds and answers the dialog wherever it is and the skill warns about it up front. (John Lauer)
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]- v2.0.300: Settings: real captures for the rest (John: 'you need screenshots in here'). Overlay badges shows a real on/off pair; badge size is four choice cards, each the real tile at that size; the jump-list examples are re-captured from the CURRENT menu (Owned by, view switches, Annotate, Open dashboard, Close ALL, Move to my workspace) with a crop per task row; the activity set re-captured in one session so all three share the same layout, and the flash card shows the real steady attention highlight (the earlier dark capture caught the flash mid-cycle). (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.299: Settings: visual rows without a real capture yet say 'Screenshot pending' instead of leaving the user guessing (settings-layout: never fabricate). (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.298: Settings: dashboard saves are bounded at 5s (AbortController) per settings-layout; optimistic DOM already reflects the click. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.297: Settings modal polish after reading the pixels: choice cards never upscale their real crops (1:1, identical zoom across the set, max 270px cards), sidebar parents carry a caret, row prose no longer duplicates the card prose, caption-bar example cropped tight to the strip itself. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.296: Settings dialog rebuilt to the Adom settings-layout standard (adom-ui-design 1.7.1): dismissible modal from the header cog (Escape, X, click-outside), 25% dim never blur, radius element never scrolls, house scrollbar, category sidebar with jump-to + scroll-spy over ONE continuous pane, sections > cards (3px teal accent, live status, full-sentence mechanism prose) > rows (breadcrumb names with teal last part, full key in title, Default on every row), house toggles (role=switch), dependent settings indented under a spine and dimmed never hidden, choice cards with one REAL screenshot per option for taskbar activity / grouping / icon style, two-click auto-disarming Restore defaults (new dashboard action), local-first optimistic saves that keep scroll position. Zero em-dashes. (John Lauer)
adom-wiki pkg install adom/[email protected]- ship.sh publish guard actually works now: the old 'publish | tail || die' tested tail's exit code (always 0) so a failed publish still shipped silently (how 2.0.295's row went up empty). Now captures the real exit code AND verifies the registry top row carries a tarball before the ship passes. Local repo folder renamed to pup-bridge; path refs updated. (John Lauer)
- Publish 2.0.295 (John Lauer)
- v2.0.295: pup-bridge#66 follow-up: the pup-dashboard --print-url direct-127.0.0.1 fix was pushed to the repo AFTER the 2.0.294 tarball published, so installs still got the localhost:7380/proxy form (the exact artifact-predates-fix failure shape ship.sh was just hardened against). No bridge-runtime changes; this ship exists to republish the skillpack tarball in lockstep with the fixed tools/pup-dashboard. (John Lauer)
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]- settings consolidation (2.0.292): document taskbarActivity as the single taskbar-activity control; remove openFlash/autoFlash/agentActivity/fgWatch from pup-settings; note fgWatch folded into notMineCaption; off-screen-birth intro (John Lauer)
- v2.0.292: Settings audit/consolidation (John): collapse openFlash + autoFlash + agentActivity + fgWatch into the single taskbarActivity control (progress|flash|off) + notMineCaption. fgWatch's foreground-STEAL purpose died with off-screen birth; its 20s self-foreground caption now honors notMineCaption. Fixed stale titleTag description (resolution is the SetProp tag now, not the title). Removed the 4 rows + their whitelist/defaults. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.291: Settings dialog: visual examples for the non-obvious settings John flagged — Taskbar activity signal (progress/flash/off, image switches with the choice), Caption bar on captures, and Adom toolbar in Chrome. Illustrations shipped in src/icons/settings-ex. Also de-em-dashed the taskbarActivity description. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.290: Foreground caption now shows FIRST then raises (awaited, was fire-and-forget so it trailed the window ~5s), and names the initiating AI thread + reason (John). Applies to pup_raise_os_window and the osRaiseSessionWindow choke point. (John Lauer)
adom-wiki pkg install adom/[email protected]- NEW skill pup-taskbar-progress + install/package wiring for the taskbar progress-bar feature (v2.0.289) (John Lauer)
- v2.0.289: Taskbar PROGRESS BARS instead of the orange flash (John): determinate bar on a window's taskbar button sized to the running-average duration of the operation (persisted per-op timing). Built-in for icon-apply (open until the icon lands) and screenshots; withTaskbarProgress() wraps any op. New setting taskbarActivity=progress|flash|off (default progress) gates the auto-flash. New skill pup-taskbar-progress. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.288: Honest log fix: the birth-resolved line said 'locked set-diff' but the capture is the unique-title method now (v2.0.287); corrected to 'unique-title capture, concurrency-safe'. No behavior change. (John Lauer)
adom-wiki pkg install adom/[email protected]- CORRECT the birth sequence: unique off-screen COORDINATES do NOT work (Windows clamps off-screen coords on-screen) - the code births at fixed -32000 and identifies by a UNIQUE TRANSIENT TITLE (v2.0.287), not coordinate. Removes a false claim I'd made to John. (John Lauer)
- v2.0.287: Concurrency fix: birth-time hwnd capture uses a UNIQUE transient title per window (set on about:blank pre-navigation) instead of the set-diff that refused when >1 window materialized at once. Fixes random per-window failures on multi-open (no handle -> window foregrounds + gets wrong/no icon; which window lost was nondeterministic). (John Lauer)
adom-wiki pkg install adom/[email protected]- pup-render-test: record the blank-occluded-thumbnail CONCLUSION - focus-emulation foregrounds (reverted), launch flags can't be leased, so occluded hover-thumbnails are left blank on purpose; pup_screenshot (CDP off-screen buffer) works on bg windows without foregrounding and reveal renders natively, so impact is only the hover preview (John Lauer)
- v2.0.286: pup_screenshot: if a capture ever brings the window to the FOREGROUND (a window-level fallback when CDP can't serve it) with no recent user input, caption ' · screenshotting' so the user always knows what put a window on their screen. No-op on the common CDP path (measured 0/101 non-foregrounding). John: uncaptioned screenshot-foregrounds are why he kept catching me. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.285: REVERT the focus-emulation blank-window fix (v2.0.280-284): Emulation.setFocusEmulationEnabled activated the OS window and foregrounded a background pup window (the exact focus-steal off-screen birth prevents), and did not reliably fix the blank thumbnail. Removed the birth call, the render lease, and its watchdog. Blank-occluded-window remains an open problem to solve WITHOUT touching OS focus. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.284: Render lease production value (5 min). Also documents the DWM-cache finding: a window renders while loading (focus-emulation on), DWM caches that frame so the taskbar thumbnail shows content thereafter; the lease keeps it fresh for 5 min then throttles for battery. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.283: Render LEASE (John's pick): a window keeps its render surface (thumbnail/reveal show content) for a lease after each interaction, then throttles to blank to save battery - mirrors the highFps lease. Reconciled by a watchdog. [shipped with 90s TEST lease to prove the cycle; 5min to follow] (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.282: Blank-window fix v2: keep focus-emulation ON (retained), not a one-shot. Measured via DWM thumbnail that the one-shot failed (Chrome releases an occluded window's page surface, so the single frame is discarded). Retained focus-emulation keeps the composited surface alive so occluded thumbnails/reveals show content; static pages still idle (no continuous render). (John Lauer)
adom-wiki pkg install adom/[email protected]- NEW ralph render test (John's taskbar-hover method, automated): tools/ralph-render-test.ps1 captures the DWM thumbnail (ground truth for whether an occluded window PAINTED, without forcing a render like a screenshot does) + dev-skills/pup-render-test. Proven: DigiKey/TI render in background (distinct 13-14), a blank window ~9; pair with DOM bodyLen to tell a render bug from an empty bot-wall page. (John Lauer)
- v2.0.281: Blank-window fix is now a ONE-SHOT pulse, not continuous render (John: 'one rAF to get a rendering to occur'): pulse focus-emulation on for two animation frames then turn it OFF, so the window paints its content once (Chrome retains the last frame while occluded) then returns to throttled/idle. No ongoing CPU/battery cost. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.280: Blank-window fix (John's theory, measured): a window born off-screen then parked occluded had visibilityState:hidden with rAF not firing, so it never painted its first frame and looked blank. Enable Emulation.setFocusEmulationEnabled per-page at birth so the renderer composites content while occluded; static pages still idle (no issue-#14 battery drain, unlike highFps launch flags). (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.279: Deterministic identity: tag confirmed handles via _ensureWindowTagged at every resolution chokepoint (bestSessionHwnd short-circuit + resolver cached/birth/property branches), guarded to fire once per handle. Fixes tags never being written because bestSessionHwnd short-circuited before the resolver. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.278: Deterministic window identity, wiggle DELETED (dev-skills/pup-no-wiggle): every window is tagged with a Win32 SetProp('AdomPupSid=') property at first resolve; lost handles are re-found by GetProp property lookup (no geometry, no nudge). Geometry bounds-matching and the off-screen re-capture nudge are removed from resolveSessionHwndByBounds. (John Lauer)
adom-wiki pkg install adom/[email protected]- NEW dev-skill pup-no-wiggle: HARD BAN on geometry/wiggle window identification (banned 3x, kept getting reintroduced). Mandates deterministic identity: birth mutex + unique off-screen coord + set-diff hwnd capture + <50ms on-screen move + Win32 SetProp('AdomPupSid=') window-property tag (VERIFIED cross-process persistent 2026-08-22) recovered via EnumProps after restart. Title is NOT the tag (pages overwrite it). (John Lauer)
- pup-taskbar-states: record John's decision to LEAVE the crash-recovery bare-icon edge as-is (rare, self-limiting) (John Lauer)
- skills: pup-vendor-login gains the BACKGROUND Google-SSO click recipe (classic full-page accountchooser is fully background-drivable via elementFromPoint+full-event-sequence; only the FedCM One-Tap bubble needs a real cursor - proven signing John into Autodesk 2026-08-22); pup-taskbar-states records the owner-loss->category downgrade CLOSED (v2.0.277 tileOwnerName) and the remaining crash-on-shared-profile bare-icon root (John Lauer)
- v2.0.277: Tiles mode: every window wears a NAME TILE, never a category glyph - an owner-less/recovered window (issue #70) now derives a stable name tile via tileOwnerName() instead of downgrading to the pup category icon (fixes John's inconsistent taskbar icons). (John Lauer)
adom-wiki pkg install adom/[email protected]- doctrine: reconcile placement with v2.0.276 off-screen-birth + <50ms park (measured 27ms, 0/95 foreground steal); delete focus-handback; off-screen banned only as resting/staging/fallback, sanctioned as a guaranteed sub-50ms birth transient (John Lauer)
- v2.0.276: Off-screen birth restored, moved on-screen within 50ms, handback deleted (John). Root cause of tonight's regression: 2.0.259 moved birth on-screen, which lets Chrome activate the window and steal the foreground on every open; 2.0.260's handback then called desktop_bring_to_front(prevFg), and on a machine full of pup windows prevFg is usually ANOTHER pup window, so it foregrounded pup windows with no caption (the parade John saw). Chrome/CDP expose no no-activate create option and WS_EX_NOACTIVATE is a documented dead-end, so the only lever is WHERE the window is born: Chrome does not activate a window that is off-screen. So birth is off-screen again (zero focus steal), then a single local CDP getWindowForTarget+setWindowBounds repositions it on-screen WITHOUT changing z-order in ~20ms (budget 50ms), so it is clickable from one frame in and can never be stranded. The handback is gone; the remaining focus check is a diagnostic that fires only if off-screen birth ever fails to suppress the activation. (John Lauer)
- Publish 2.0.276 (John Lauer)
- NEW user skill pup-why-cft (John: 'we made a sub-readme so folks like adrian understand it, but now i realize we have to explain it to the ai as well'). docs/WHY-CFT.md was written for humans and no AI thread could ever discover it: it is not a skill, has no trigger words, and until this morning the pup skills contradicted it. This skill is the doc's AI-discoverable form: the five dated reasons (banner, --load-extension removal as the forcing one, determinism, no consumer chrome, binary isolation), the honest trade-offs incl. no Widevine and the CfT window title, what did NOT change, and the note that stops anyone fixing launchCandidates() backwards. Wired into install.sh, files[], and the /pup skill map in the same pass, because tonight proved a capability that ships without its references rots. (John Lauer)
- Skill sweep, browser-policy pass: the /pup mental model and the entire /pup-browsers-and-chrome sub-skill still taught the mid-2026 native-first policy (drives the browser already on the machine, CfT is the last resort), which docs/WHY-CFT.md reversed for good on 2026-08-10 (automation banner; branded Chrome 137+ removed --load-extension, which the toolbar needs). Both now teach CfT-first with installed Chrome/Edge as the spawn-verified fallback ladder, which is also what pup_readiness reports on a live box (browserKind: chrome-for-testing). The stale native-first editorial in chrome.js is flagged in place with a warning note, with the base order deliberately unchanged because it IS the fallback ladder. Also: the no-semicolons pup_eval reminder in the screenshots skill updated for the 2.0.274 statement support. (John Lauer)
- install.sh: purge the pup-bridge mis-slug alongside the old adom-desktop-puppeteer-bridge one. A pkg-layer install had deposited the start-here skill under the PAGE slug as a second user-invocable copy, so the slash menu showed /pup AND /pup-bridge, and the duplicate served week-old text because this installer never refreshed it. John caught it from the slash list itself. (John Lauer)
- pup-adom-wiki: the Historical note was written in present tense (do not claim you can see logged-in features, you cannot) directly under the section saying logged-in is the DEFAULT since 1.9.162 - rewritten as actual history, keeping the one surviving rule (never drive the SSO form with the user's password). Quick-start examples gained --ai-thread, without which ab refuses the calls outright. pup start-here: the No-semicolons-in-pup_eval rule is obsolete since 2.0.274 (statement lists run via Runtime.evaluate; bad code now fails honestly). (John Lauer)
- pup start-here skill: truth pass against the shipped code. Fixed four stale claims: windows described as opening MAXIMIZED (they are born at the 10px-inset work area in normal state since the 2026-08-20 placement rules; OS-maximize raises and is never used), split described as the taskbar default (tiles has been the default since 2.0.152), the audit section expecting exactly 1 AUMID key (tiles registers one content-token key per live thread since 2.0.271, so the old expectation reads every healthy machine as broken), and the badge described as favicon plus Adom mark (mark removed 2.0.192). Also replaced the audit's title-based window ground-truth step with hwnd resolution, since titleTag is off by default and the titleContains probe matches nothing. (John Lauer)
- install.sh: ACTUALLY deploy pup-taskbar-states and pup-progress (both shipped in files[] but were never installed by this script, so installed copies drifted stale between pkg publishes). NOTE: the two previous commits' messages claimed fixes that had NOT landed — my edit scripts asserted on stale text and aborted BEFORE writing, but the push in the same shell block ran anyway, shipping unchanged files under fix-claiming messages. The skill fixes landed in the commit before this one; this commit is the installer. Lesson recorded: never chain edit-and-push in one step. (John Lauer)
- pup-taskbar-states, for real this time (the previous commit message claimed these fixes but the script aborted before writing): cite #53/#54 as CLOSED with #70 as the open gap, fix the internal wipe-vs-converge contradiction (line 51 still said wiped while line 38 said converges), add overlaySize (John Lauer)
- Skill truth pass, triggered by John running the slash commands himself: pup-taskbar-states cited two CLOSED issues (#53, #54) as open gaps, described plain mode as a wipe when it has been native-AUMID convergence since the two-CfT-buttons fix, omitted overlaySize, and predated the bounded nudge retry + minimize preservation. pup-settings still claimed an Adom mark on the badge (removed 2.0.192; only the generic fallback glyph keeps it). Both now match the shipped code, and #70 is named as the one genuinely open gap. (John Lauer)
- pup-settings: document overlaySize (the badge-size percent added in 2.0.262, default 75) and the two lower-level keys pup_status surfaces (aumidIcons, threadTiles). The user-facing settings reference was missing a setting that had already shipped, which is how a skill quietly stops being the source of truth. (John Lauer)
- dockbar.json: add launch.console=show for parity with the two verified reference bridges, so the install/serve step output is visible while the card starts instead of looking hung (John Lauer)
- v2.0.275: Close the AUMID registration race introduced with 2.0.271. Making the thread AUMID content-derived was right, but it created a new failure: if the shell builds a button for a brand-new AUMID BEFORE the IconResource write is visible, Windows caches 'no icon' against that AUMID and it stays blank forever, because the AUMID never changes again on its own. Measured on John's 'oven' button, which showed as a bare overlay badge on empty space while its .ico, its registry entry and its AUMID were all provably correct; only deleting the tile to force a fresh token brought the art back. The button rebuild now waits (up to 2.5s, then proceeds) until the AUMID's IconResource is present AND points at a real file, so the shell always has art to read at first paint. (John Lauer)
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]- v2.0.274: Fix the second half of adom/pup-bridge#69: pup_evaluate ran nothing and reported ok. The eval is new Function('return (' + expr + ')'), which is EXPRESSION-only, so the reporter's location.assign('...'); 'navigating' was a SyntaxError: nothing ran, the page never navigated, and the handler still answered ok:true with the failure buried in result.__error. Reproduced verbatim. Two fixes. On a syntax error the source is retried through CDP Runtime.evaluate, which has devtools-console semantics (accepts a statement list, returns the completion value), so the same code now works; a context destroyed mid-eval is treated as SUCCESS because it means the page navigated. And a failed eval is now a FAILED verb with errorCode eval_failed instead of ok:true wrapping __error, which was the exact lie this issue is about. Also confirms the switch_tab half: after 2.0.272 all four switches including repeats land on the requested tab with activated:true; the earlier partial result was measured against a session that had been reaped, not a real failure. (John Lauer)
adom-wiki pkg install adom/[email protected]- Publish 2.0.273 (John Lauer)
- adom/pup-bridge#66: ship the Dock Bar card. dockbar.json (manifest 1.2.0) at the repo root, a real favicon at the declared path, and pup-dashboard — the container-side status page serving /api/status in the SDK payload shape (per-LED label/state/detail/_hint plus our own top-level rollup, cached with an internal budget under the declared 2000ms). Honors the three SDK rules that broke both other bridges: serve self-backgrounds by spawning a detached child and waiting for the port the CHILD actually bound before printing it, every child process gets ~/.local/bin prepended, and a second serve detects the live instance and prints ITS url. (John Lauer)
- v2.0.272: Fix adom/pup-bridge#69: pup_switch_tab reported ok while never switching the tab on any background window. page.bringToFront() is the only thing that actually changes Chrome's visible tab and it was gated on session._foreground; pup windows are background by default, so the normal case updated pup's own activeTabId bookkeeping, never told Chrome, and still returned success:true, while pup_list_tabs (which reads Chrome's real state) kept reporting the old tab. Reproduced on AdomLapper against a 3-tab window: asking for tab-1, tab-2 or tab-3 all left Chrome on tab-2. The v1.8.26 rationale was 'only raise the OS window for a session the user is watching', which conflated activating a TAB inside a window with raising that window. The activation now always runs, and because Target.activate can pull a window forward, the user's focus is handed straight back with the same one-shot handback used at window birth in 2.0.259 (never a timer, never a loop, the window itself is never moved). The verb also VERIFIES the switch by reading visibilityState back from Chrome and returns activated plus an honest hint when it did not take, because a verb that says ok while nothing happened is the exact class this issue is about. (John Lauer)
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]- tools: wiki-issue-monitor.sh — the wiki-issue-loop live Monitor (John: 'do a monitor every 5 mins today'). Seeds on the current unread set so it cannot fire a 387-notification firehose, treats a failed poll as neither an event nor fatal, and marks items on repos this thread maintains. (John Lauer)
- v2.0.271: THE AUMID IS THE ICON CACHE KEY. John's Bills window showed category art while every link in pup's chain was provably correct. Measured in order on that one window: AUMID registered with IconResource pointing at the right .ico; the .ico itself rendering the Bills name tile at 16/32/48/256; threadTiles off/on full re-register -> unchanged; registration-epoch bump for a fresh ab cacheKey -> unchanged; WM_SETICON with the tile on the window itself -> unchanged; stamping a NOVEL AUMID string -> correct instantly. Windows caches a taskbar button's icon per AppUserModelID, so repointing a seen AUMID at new art is ignored and only a virgin AUMID can move it. THREAD_TILE_GEN already encoded that but is hand-edited, so it cannot react when a tile is re-rendered, which is exactly when the art changes. The thread AUMID now folds in a hash of the tile's CONTENT: identical bytes give an identical AUMID (stable across restarts, no button churn), a re-rendered tile gives a virgin AUMID and the shell is structurally forced to re-read the art. Wrong art becomes unreachable rather than something the audit has to catch after the fact. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.270: Wrong taskbar ART that pup swore was correct (John's Bills window). Established by measurement: the AUMID was registered, its IconResource pointed at the right .ico, the .ico itself rendered the Bills name tile correctly at all four sizes, the button was correctly NAMED Bills, and a full threadTiles off/on re-register did not shift it — yet the shell drew the category tile. Cause: ab caches icon HANDLES by cacheKey for its process lifetime, and the thread-tile cacheKey versioned only on tile GENERATION, which changes only when we bump it. A handle cached from an earlier stamp (category art, before the tile finished rendering) therefore served forever. The cacheKey now keys on tile CONTENT (mtime+size), so any re-render is automatically a new handle and a stale one is structurally impossible. Also closes the audit's blind spot honestly: it infers art from _buttonBuiltAt vs tile mtime and cannot read the glass, so it reported CLEAN while John looked at a wrong icon. pup_audit_icons gains {force:true} to re-assert every icon with a fresh epoch regardless of findings, and the clean-verdict hint now says outright that a clean model is not proof of correct pixels. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.269: Move Favicon overlay badges and Badge size directly under Taskbar identity (John: 'this should be near the Taskbar Identity section since its highly related'). They are part of the same decision — the identity picker's own six examples are literally 'tiles + overlay' vs 'tiles' — so having the overlay toggle sit fifteen rows below the picker that illustrates it was a discoverability bug, not just an ordering preference. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.268: Settings dialog: the sticky header was being painted over by the scrolling content. position:sticky with z-index:auto creates no stacking context, so later siblings that make their own (every .mic is position:relative) drew straight over the title and the close button. One line: z-index on .dlghead. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.267: Finish the settings overflow: the plain-mode preview strip is six 44px flex:none cards in a non-wrapping row, a hard ~298px floor that no shrinking elsewhere could beat. It was the last 49px of horizontal overflow and the remaining seam past texstrip's background. Now wraps and centers. (John Lauer)
- v2.0.266: Settings dialog layout pass (John: 'why does your settings panel look so awful?'). Three real defects, all measured live rather than guessed. (1) The 'default' pill floating over the dialog's X: .mdef was position:absolute inside .stlbl, which is not positioned, so it escaped to #dlg and parked in the corner; it is now a plain inline chip in the label with no positioning to get wrong. (2) The hard vertical seam behind the taskbar-identity choices: those rows wanted 516px inside a 439px strip, so the sample icons spilled past .texstrip's dark background; the row now wraps, the label shrinks from a rigid 175px to 150px, .sticons is shrinkable with min-width 0, and the plain-mode explainer's hard max-width:330px (the single biggest contributor to the 516) becomes a flexible basis. (3) The -7px badge overhang could clip against the strip edge, so .sticons carries matching padding. Audited every other absolutely-positioned class for the same escaped-ancestor trap; .mbcard is the only other one and its .mic parent is correctly relative. (John Lauer)
- v2.0.265: Tighten the Badge size row copy. Seen in the live pixels: the long description wrapped into a narrow six-line column beside the dropdown, which read as cramped next to every other sub-row. The setting is unchanged; only the label text is shorter. (John Lauer)
- v2.0.264: Add 75% as an overlay badge size and make it the default (John, after comparing 100/66/50 on real tiles). Because 2.0.263 turned the setting into a straight percent with a clamped parser, this is one value per surface rather than a new branch: default, dashboard dropdown, set-setting whitelist, pup_configure validation and the fallback in overlayScalePct. (John Lauer)
- v2.0.263: Overlay badge size becomes a real PERCENT and gains 66, now the default (John tried 50 and asked to try 66). overlayScalePct() parses and clamps the stored value to 25-100 so a bad value can never composite a zero-size, invisible badge, and adding another stop is now a one-word change rather than a new branch. Options 50 | 66 | 100 across the dashboard dropdown, the set-setting whitelist and pup_configure. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.266: Settings dialog layout pass (John: 'why does your settings panel look so awful?'). Three real defects, all measured live rather than guessed. (1) The 'default' pill floating over the dialog's X: .mdef was position:absolute inside .stlbl, which is not positioned, so it escaped to #dlg and parked in the corner; it is now a plain inline chip in the label with no positioning to get wrong. (2) The hard vertical seam behind the taskbar-identity choices: those rows wanted 516px inside a 439px strip, so the sample icons spilled past .texstrip's dark background; the row now wraps, the label shrinks from a rigid 175px to 150px, .sticons is shrinkable with min-width 0, and the plain-mode explainer's hard max-width:330px (the single biggest contributor to the 516) becomes a flexible basis. (3) The -7px badge overhang could clip against the strip edge, so .sticons carries matching padding. Audited every other absolutely-positioned class for the same escaped-ancestor trap; .mbcard is the only other one and its .mic parent is correctly relative. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.265: Tighten the Badge size row copy. Seen in the live pixels: the long description wrapped into a narrow six-line column beside the dropdown, which read as cramped next to every other sub-row. The setting is unchanged; only the label text is shorter. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.264: Add 75% as an overlay badge size and make it the default (John, after comparing 100/66/50 on real tiles). Because 2.0.263 turned the setting into a straight percent with a clamped parser, this is one value per surface rather than a new branch: default, dashboard dropdown, set-setting whitelist, pup_configure validation and the fallback in overlayScalePct. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.263: Overlay badge size becomes a real PERCENT and gains 66, now the default (John tried 50 and asked to try 66). overlayScalePct() parses and clamps the stored value to 25-100 so a bad value can never composite a zero-size, invisible badge, and adding another stop is now a one-word change rather than a new branch. Options 50 | 66 | 100 across the dashboard dropdown, the set-setting whitelist and pup_configure. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.262: New setting: overlay badge size, defaulting to HALF (John). At full size the favicon badge covers the thread tile's BOTTOM LINE of text, which is the whole point of thread tiles since that text is how you tell one thread's windows from another's. Windows offers no way to ask the shell for a smaller overlay slot, so the badge CONTENT is composited at half scale inside the same 48x48 canvas, anchored northeast (the tile draws its name from the bottom-left, so the far corner does the least damage) and the shell scales it as before. Wired end to end: default '50', dashboard Settings row (a labelled dropdown, the sel row type gained selLabels so a raw value like '50' reads as 'Half size' instead of a bare number), set-setting whitelist, live repaint on change so flipping it moves the taskbar immediately, pup_configure {overlaySize}, pup_describe, and pup_status.settings. The overlay cache key includes the size, without which a flip would serve the previously-composited badge and nothing would change on glass. (John Lauer)
adom-wiki pkg install adom/[email protected]- pup-bridge-dev: close the open gap on the focus handback. Measured: 0/82 foreground samples moved on AdomLapper (no steal to hand back), the handback verifiably fires and restores on ConfRoomROG in both process cases, and the difference is user-input recency (15ms vs 440s) i.e. Windows foreground lock protecting an active user. Records the disproven same-process theory too. (John Lauer)
- NEW dev sub-skill pup-bot-walls: identify the wall (DataDome vs Cloudflare vs Akamai vs Imperva), what the consumer-UA override already covers, the API-first sourcing ladder, the human handoff, and the TODO roadmap for looking like the human-directed session we actually are (John Lauer)
- pup-bridge-dev: document R6 (a newborn window's self-activation is Chrome, never the user), the implementation map for R1-R6, and the VERIFIED evidence table from the 2.0.259-261 run including John's three-vendor separate-tile test (John Lauer)
- v2.0.261: A newborn window's self-activation is Chrome, never the user. John opened ti.com, it landed on top of his work, and pup then REFUSED to move it: the log read [park] ti-proof (post-nav re-assert): user-foreground - hands off, on a window he had never touched. Cause: every user-intent check attributes an OS-foreground pup window to the user via _userActiveAt or simply 'there was input in the last 5 seconds', and he was typing while the window opened. Both are wrong for a window that did not exist a second ago, because there was no taskbar button to click; the old off-screen birth hid this entirely, since Chrome does not activate a window that is nowhere. Adds session._bornAt plus an 8s BIRTH_GRACE_MS honored by osBottomUnlessForeground, userIsUsingWindow and the foreground observer, so a newborn is bottomed rather than credited to the user. An explicitly granted foreground open or raise sets _raiseGranted and is exempt, because that window is supposed to be in front. (John Lauer)
adom-wiki pkg install adom/[email protected]- pup-bridge-dev: --no-startup-window was never the whole focus fix; the off-screen birth was doing half the work. Measured, and the v1.9.253 handback restored. (John Lauer)
- v2.0.260: Hand the keyboard focus back when an on-screen birth takes the foreground. Measured live the moment R1 landed: --no-startup-window was not the only thing suppressing Chrome's foreground grab, the off-screen birth was doing half the work, because Chrome does not bother activating a window that is nowhere. Born at a real rect it activates, and every open logged a steal. Per R2 the WINDOW is left exactly where it is and nothing re-parks it, but the user's keyboard focus is not the window's z-order: letting their typing land in a browser that just appeared is not a flaw worth accepting when handing focus back costs one call. This is the v1.9.253 handback restored (it was deleted only because the off-screen birth made it unreachable), one shot at birth, never on a timer, and it reports honestly when it does not take. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.259: Implement John's new placement rules (2026-08-20). R1: a window is BORN at its final on-screen rect via Target.createTarget left/top/width/height, the primary monitor work area inset 10px on all four sides, so it is clickable from its first millisecond. No staging position, no migration. R2: background is a preference, not a precondition; if the window comes up foreground anyway, accept it and stop, because fighting it is what produced every re-park loop. R3: a taskbar click always works, with no help from pup. R4: the hwnd is captured in the same locked moment the window is created, by set-diff over this profile's Chrome PIDs, which needs no unique birth coordinate; when two windows appear under the lock it now REFUSES to guess rather than risk a wrong handle. R5: AUMID and tile work stays async and after. Park is no longer a placement gate: bottoming is 3 bounded attempts instead of 8 slow ones and can never move, hide or off-screen the window when it fails. zConfirmedBelow is deleted; it gated placement on a proof that returned false whenever our hwnd was absent from ab's enumeration, which an off-screen window often is, making the failure self-sustaining. (John Lauer)
adom-wiki pkg install adom/[email protected]- NEW PLACEMENT RULES (John, 2026-08-20): windows are born on-screen at their final rect, background is a preference not a precondition, a taskbar click always works, identity is captured at birth, taskbar branding is async and after. Single source of truth in pup-bridge-dev R1-R5; the other skills now defer to it instead of contradicting it. (John Lauer)
- pup-user-foreground: OFF-SCREEN is the third way to break a taskbar click. When 'prove it is safe' fails, the fallback must still be a state the user can reach. (John Lauer)
- v2.0.258: Never rest a pup window off-screen. John could not open a freshly opened 'ab ralph' window: it sat at -21845,-21845 with a live taskbar button. Four separate paths in the launch park treated OFF-SCREEN as the safe fallback whenever z-bottom could not be PROVEN, logging 'self-heal will retry'. That trades a possible transient harm (a window briefly above the user's work) for a certain permanent one (the user can never open their own window), and the confirmation it waits for feeds the failure: zConfirmedBelow looks the hwnd up in ab's window enumeration and returns false when absent, and an off-screen window may not be enumerated at all, so once there it can never confirm its way out. All four paths now place the window ON-SCREEN at best-effort bottom, the moveOffScreen helper is deleted so it cannot be reintroduced, and the population sweep now repairs OFF-SCREEN windows as well as hidden ones (judging position from the restore rect so a minimized window is never disturbed) and runs every 30s instead of 120s. (John Lauer)
adom-wiki pkg install adom/[email protected]- selftest T10: name the window that took foreground. Running on John's own laptop while he worked, every click on his Edge window reported '#56 REGRESSED' — a false alarm against a shipped fix. Only a pup window taking focus can support that accusation. (John Lauer)
- pup-user-foreground: record the 2026-08-20 window-destruction incident (lock-file orphan kill + refCount kills) and the target_not_found diagnosis trap (John Lauer)
- v2.0.257: Never kill a profile's Chrome to free its lock while pup has live sessions on that profile. This is what actually destroyed three of John's windows today. The pre-launch cleanup kills whatever holds the profile lock, authorized by an INFERENCE: a lock exists and I could not reconnect just now, therefore the holder is a dead orphan from an unclean shutdown. The reconnect gives up after a 3s probe plus a 5s puppeteer.connect, and on a loaded machine a healthy Chrome misses those deadlines, so pup declared the LIVE shared adom-you Chrome an orphan and killed it, taking two other threads' dashboards and the ab web-demo window John was actively using; pup then relaunched them and reconciled them away as closed, so from his side they vanished. Ground truth beats inference: if any live session is bound to the profile, that process is serving the user's windows, so pup now retries the reconnect patiently (20s) and adopts it, and if that fails it fails THIS launch honestly instead of destroying work that is not ours to destroy. A failed launch costs a retry; a wrong kill costs windows the user cannot get back. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.256: Never let a refcount authorize killing a shared Chrome. #434 established the rule (decide from ground truth, not the cached refCount) but converted only ONE of four call sites; the other three still ran 'if (--refCount <= 0) kill'. That counter is provably wrong right after a restart: recovery re-creates the browser entry with refCount 0 and does not count the sessions it just restored. Measured on AdomLapper today: three recovered windows (fusion-dashboard, kicad-maint, and the ab web-demo window John was actively using) sat on the shared adom-you Chrome at refCount 0, the next path decremented 0 to 0 and force-killed the process hosting all three, and pup then relaunched and reconciled them away as closed. All four sites now go through one primitive, killProfileBrowserIfUnused, which refuses while ANY other session is bound to that profile or any verb is in flight; the refcount is telemetry only. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.255: Fix adom/pup-bridge#65: pup_evaluate ran the HOVER handler. Its alias label was written as a switch fallthrough above case 'pup_hover' instead of above case 'pup_eval', so every pup_evaluate call returned 'pup_hover needs selector, or x + y' / hover_target_missing while the _hint stayed pup_evaluate's own — right docs plus wrong error, the tell for a misdispatch. That made the only verb that can READ the DOM unusable, so a page could be driven but never asserted on. Also accepts expr/expression/script/js/code (John probed all four, none of which ever reached the handler) and documents them in the catalog. Second bug from the same report: PUP_ISSUES_REF, pasted into every response's _reportIssues hint, still named the pre-rename slug adom/adom-desktop-puppeteer-bridge, which 404s — so the one string whose job is routing bug reports sent them nowhere. Now adom/pup-bridge, in the hint and in the dashboard link. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.254: Stop re-fetching a favicon that does not exist. 2.0.229 bounded the SUMMARY log line but not the work or the two rail-failure lines beneath it, so every overlay re-assert on a faviconless page re-ran BOTH network rails (a 5s-timeout node fetch plus a CDP fetch) and logged two more lines, forever. Measured live on ConfRoomROG: those three lines filled the entire log tail and degraded a real investigation, the exact trap the icon-audit skill warns about. Adds a per-origin negative cache (30 min, capped at 500 origins), cleared the moment an origin serves a real icon. (John Lauer)
adom-wiki pkg install adom/[email protected]- pup-user-foreground: add the VISIBILITY INVARIANT (rule 7) after John's 'why can't i open this pup window' - the doctrine only covered demotions, so a nudge that HID the window slipped past every guard (John Lauer)
- v2.0.253: Visibility invariant, third cut: assert it over the POPULATION by owning process instead of per session. Verified live that the per-session versions repaired nothing, because they had to find a session's handle first and a window in trouble is exactly the window that lacks one: the enumerating resolver only sees VISIBLE windows (circular), a park-failed window never persisted a handle, and a pup restart clears the birth capture. The property that matters needs no session mapping: no titled top-level window of a pup-owned Chrome process may be hidden. One enumeration now repairs every stranded window including ones pup has lost track of, for one PowerShell per sweep instead of one per session. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.252: Make the 2.0.251 visibility invariant actually fire. Verified live that it repaired nothing: the sweep resolved handles via windowHwnd, whose fallback enumerates and wiggle-matches VISIBLE windows, so asking it to find a HIDDEN window is circular (28 straight NOT-resolved misses on a window sitting right there, hidden). The sweep now uses the cached or birth-captured handle, which needs no enumeration, and proves ownership by PID (GetWindowThreadProcessId answers for hidden windows too). (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.251: Fix a pup window that a human click could not open (John's report). The taskbar button nudge HIDES the window for 80ms to force the shell to rebuild its button; the re-show was a separate statement in a PowerShell process node kills at 20s, so any interruption in that gap left the window IsWindowVisible=false with a live taskbar button that revealed nothing, until some later audit happened to nudge again. Reproduced live on AdomLapper. The re-show is now in a finally, the caller verifies it landed (a killed process runs no finally), and a new 120s VISIBILITY SWEEP asserts the invariant for every standing window: a human can minimize a window but never hide one, so a hidden pup window is always pup's to repair. Second bug in the same line: the re-show was always SW_SHOWNOACTIVATE, which RESTORES a minimized window, so pup silently un-minimized windows the user had put away; it now re-shows in the state it found (SW_SHOWMINNOACTIVE when minimized). (John Lauer)
adom-wiki pkg install adom/[email protected]- selftest T10: a foreground of 0 (nothing focused) is INCONCLUSIVE, not a pass — the guard must not bank a vacuous result (John Lauer)
- v2.0.250: Taskbar identity survives a bridge restart intact: the registry prune now seeds its live set from the sessions persisted on disk, by the identity each window was wearing and by the thread name it belongs to, so reloaded windows are no longer treated as orphans and stripped before their first stamp lands, and a thread whose tile art was not ready when it was registered retries on a bounded backoff instead of waiting for unrelated churn to brand it. (John Lauer)
adom-wiki pkg install adom/[email protected]- selftest T10: foreground-steal guard for #56 (focus a window we own, cold the dashboard profile, assert a cold pup_dashboard never changes the foreground) (John Lauer)
- v2.0.249: Three of the four flagged dependency advisories are closed: sharp moves to the patched line directly since it is our own optional dependency, while js-yaml and ip-address are pinned through overrides because they arrive transitively under puppeteer, and the remaining extract-zip advisory is documented in the manifest as unreachable here since it only unpacks the Chrome archive pup itself downloads from Google over HTTPS. (John Lauer)
adom-wiki pkg install adom/[email protected]- tools/not_intercepted.py: the SDK NOT-INTERCEPTED audit for pup (direct-to-port vs routed key-set diff, envelope-aware, refuses to call a failed probe a pass) (John Lauer)
- v2.0.248: The page-health probe waits briefly for the document to finish loading before judging images, so the check both fires on real failures and stays quiet about placeholder slots, rather than declining to judge on nearly every page because it sampled while the document was still interactive. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.247: The page-health check judges images only once the document has finished loading, so it stops calling placeholder slots broken and stops missing real failures it sampled too early, and it declines to judge rather than guessing while a page is still loading. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.246: The page-health probe waits a bounded moment for in-flight images before judging them, so a genuine broken image is actually caught instead of being sampled while it was still loading, which was the mirror of the placeholder false alarm the same check just stopped producing. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.245: The page-health check counts an image as broken only when it has a real non-empty source that failed to load, because placeholder slots with no source report zero natural width in Chrome and were making the verb announce that a perfectly healthy page was broken. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.244: The progress-bar verb paints even in minimal-touch mode, because a caller asking for a progress bar is an explicit request rather than pup's automatic machinery, and its response now reports whether anything was actually drawn instead of answering ok while having made no shell call at all. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.243: An explicitly requested taskbar alert is no longer swallowed by minimal-touch mode, which is meant to suppress pup's automatic machinery rather than a caller asking for a nudge, and a flash that does get skipped or fail now names the actual reason instead of blaming a window title that pup no longer resolves by. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.242: Window flashing resolves by the handle pup captured when it created the window instead of falling through to a title lookup that cannot match, fixing the reported failure where a taskbar alert stopped working after a tab switch rewrote the window title even though flashing that same window directly by handle worked. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.241: An unrecognised wiki view value is rejected with the accepted list instead of being silently treated as the public view, which had let a caller asking for a signed-in view receive the public one alongside a response that technically said so and completely misled. (John Lauer)
adom-wiki pkg install adom/[email protected]- selftest T4: longer settle on a heavy page, one retry, and it prints what it saw on failure (an empty screenshot result used to report 'could not capture the scroll pair' with no evidence) (John Lauer)
- v2.0.240: More duplication retired: the Chrome-style generic globe and PDF glyphs are built by one function instead of being written out as SVG literals in two different no-favicon paths, the PowerShell regex escape used by the process scans lives in one helper, and four more copies of the session-resolution guard now call the shared one. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.239: The three status surfaces now share one core payload builder instead of each pasting the same version, enum accounting and identity settings, which is why the icon-audit field had landed on only one of them, and the raise verb builds its PowerShell from a single shared typedef rather than two copies of the same ten-line C-sharp helper. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.238: Parking a window no longer fails when its shell handle is unknown: the CDP placement that already positioned it stands as the park and the shell re-bottom is skipped with one explanatory log line, instead of sending a title query that cannot match while title tagging is off and surfacing that as a failed lower. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.237: Window targeting gets a real second chance before its last-ditch title guess: when the cached handle is missing and bounds resolution comes up empty, pup asks the OS for the largest visible window of that session's browser process tree, which fixes the long-standing failure where a healthy window reported that no window carried a session title tag that is switched off by default. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.236: A second cleanup pass removes about three hundred and sixty more lines of duplication: the eight legacy curl endpoints that shadowed pup verbs without ownership checks or recovery now answer with a gone status naming the verb to use, the two superseded send-to-back implementations give way to the park every internal caller already shared, the crash race is event-driven instead of polling four times a second for the lifetime of every operation, the twin recording listers and six copies of the session-resolution preamble collapse into one each, and per-session maps are finally reaped on teardown. (John Lauer)
adom-wiki pkg install adom/[email protected]- harness: T5 derives the expected thread slug from ADOM_AI_THREAD (a hardcoded name produced a false 'stamp path broken'), failing checks print their evidence, and mode-ralph derives aumid/tiles expectations from live sessions and retries the whole verdict (names AND pixels) so a switch still landing is not read as a failure (John Lauer)
- v2.0.235: The overlay-badge apply loop lived in two copies and a progress-tracker edit only declared its variable in one of them, so every pup_configure toggle threw an unhandled ReferenceError; both call sites now share a single implementation that takes the progress entry as a parameter. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.234: A port blocked by a Windows reservation no longer kills the bridge: instead of exiting into a respawn loop that ends in backoff, pup stays alive, explains which reserved range swallowed its assigned port and how to release it, and retries that same port every fifteen seconds so it comes back by itself the moment the range frees, with no respawn and no human in the loop. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.232: The bridge pins its port to 8851 instead of letting ab choose from the ephemeral band, because ab picked 64230 and Windows had reserved that whole block for Hyper-V, which left every spawn failing on EACCES and the bridge permanently down with no non-elevated recovery. (John Lauer)
adom-wiki pkg install adom/[email protected]- pin the bridge port to 8851: ab was assigning 64230, which Windows reserved (Hyper-V exclusion 64160-64259), leaving the bridge in a permanent EACCES crash-loop (ab#83) (John Lauer)
- v2.0.231: A bind failure on the assigned port now explains itself instead of crash-looping invisibly: pup reads the Windows excluded port ranges, names the range that swallowed its port, prints the elevated WinNAT restart that releases it, and binds a fallback port so its dashboard and health surface stay reachable while recording the real port in its discovery file. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.230: A first cleanup pass on the bridge: the four-second sweep now makes one CDP round-trip per tab instead of three and no longer runs a title blob that was a measured no-op, the sixty-second forced badge repaint stretches to five minutes since real clears already trigger a repaint by event, window-alive verdicts are cached so a single stuck session can no longer pin a PowerShell C-sharp recompile every eight seconds, the idle process sweeps skip PowerShell entirely when nothing could have leaked, dashboard icon endpoints serve from an mtime-keyed cache instead of decoding an ICO per window per two seconds, screencast frames write asynchronously instead of blocking the event loop sixty times a second, and about two hundred and forty lines of dead and unreachable code are gone. (John Lauer)
adom-wiki pkg install adom/[email protected]- mode-ralph: expectations derive from LIVE session owners, not a hardcoded thread list (a stale list failed every tiles round while the bar was perfect) (John Lauer)
- pup-icon-audit dev skill: an audit request means detect, fix the code, reapply every AUMID, and prove it with red-boxed pixels (John Lauer)
- v2.0.229: A page with no favicon stops retrying forever: the generic-glyph fallback now backs off over three attempts and goes quiet until the page navigates, and the repeating no-favicon and both-rails-failed lines collapse to one per URL, because a single example.com window was flooding the log ring hard enough to erase the icon-audit trail it was meant to leave behind. (John Lauer)
adom-wiki pkg install adom/[email protected]- v2.0.228: Taskbar icon drift now heals itself: a new audit compares pup's model against the shell's own button names, classifies every drift we have shipped (no button, pending rebuild, and art the shell baked before the thread tile existed), repairs each by re-registering and re-stamping and rebuilding the button, then repaints the badges; it runs after every mode switch and brand sweep, twelve seconds after a thread tile first renders, and every four minutes in steady state, and pup_audit_icons exposes it on demand. (John Lauer)
adom-wiki pkg install adom/[email protected]- ship.sh moves into the repo (it kept evaporating from /tmp); taskbar-states: the foreground skip is now a bounded retry, not a permanent leak; selftest: the icon-audit procedure (John Lauer)
- v2.0.227: A taskbar button nudge skipped because its window happened to be focused is no longer a dead end: the skip becomes a pending state with bounded backoff retries, so a window stamped while the user was looking at it stops keeping its previous button name and art indefinitely, and the dashboard now turns that button red with an explanation instead of reporting a green match while the taskbar visibly disagrees. (John Lauer)
adom-wiki pkg install adom/[email protected]- freshness check: ISO timestamps for -newermt (the box's find is now bfs, which rejects relative forms) (John Lauer)
- mode-ralph: coordMap-true mapping, capture freshness gate, tight #00b8b1 classifier, multi-target sampling, overlay-off plain measurement; skills: the two-CfT-buttons saga lessons (plain = converge to Chrome's native AUMID) (John Lauer)
- The plain-mode batch rebuild now includes the foreground window with immediate focus restore: exempting it left its taskbar button alive through the batch hide, Explorer re-associated that surviving button with its old art baked in to the native group, and every other window joined it, so the whole grouped Chrome button wore stale pup art; a sub-second blink of the active window during an explicit user-initiated mode switch is the right trade. (John Lauer)
adom-wiki pkg install adom/[email protected]The plain-mode batch rebuild now includes the foreground window with immediate focus restore: exempting it left its taskbar button alive through the batch hide, Explorer re-associated that surviving button with its old art baked in to the native group, and every other window joined it, so the whole grouped Chrome button wore stale pup art; a sub-second blink of the active window during an explicit user-initiated mode switch is the right trade.
adom-wiki pkg install adom/[email protected]The plain-mode convergence now batch-nudges: hiding all non-foreground windows together destroys the grouped taskbar button so it rebuilds with clean art, because Windows bakes a group button's icon at creation and per-window nudges never destroy a group that other members keep alive, which let a rapid tiles-to-plain race leave the thread-tile art baked onto the Chrome for Testing group button indefinitely.
adom-wiki pkg install adom/[email protected]Icon and thread-tile generations bump to i8 and t7 so every identity re-registers under virgin app ids: the registry-sweep era deleted the on-disk AUMID keys while ab's registration cache still marked them done by app id, so stamps skipped the registry re-write and tiles and aumid buttons came back with correct names and missing art.
adom-wiki pkg install adom/[email protected]The plain-mode registry sweep is removed: registry keys with no window property pointing at them are inert and were never what split the taskbar groups, while deleting them broke re-entry into tiles and aumid modes because ab caches icon registration by app id and skipped the registry re-write, leaving buttons with names but no art; the native-AUMID convergence from 2.0.221 remains the whole plain-mode story.
adom-wiki pkg install adom/[email protected]Identity stamps carry a strip-epoch suffix in their icon cache keys so ab re-writes the AUMID registry icon entries after a plain-mode registry sweep instead of trusting its handle cache, which had been leaving re-entered tiles and aumid buttons with the right name but no art.
adom-wiki pkg install adom/[email protected]Plain mode now converges every Chrome for Testing window onto Chrome's own native per-profile AUMID instead of wiping identities to empty: Chrome lazily re-asserts its native id on windows, so wiped windows and re-tagged windows drifted into two separate taskbar groups both labeled Google Chrome for Testing, and the convergence approach is idempotent against Chrome's re-assertions so the group can never split again; the fix also covers orphan windows pup no longer manages, corrects a 16-byte PROPVARIANT marshaling bug that made property reads silently return zeros, and remembers the learned native id across restarts.
adom-wiki pkg install adom/[email protected]Jump-list attachment is now gated on AUMID icons being on: in plain mode no window wears a pup identity, yet every window birth was silently registering a bare per-session AUMID registry key purely to have something to commit a jump list to, which the mode-aware selftest caught as a strip hole.
adom-wiki pkg install adom/[email protected]The live settings snapshot actually rides the pup_status verb this time; the 2.0.218 insert had landed in the health endpoint payload instead of the verb, so harness mode reads came back empty.
adom-wiki pkg install adom/[email protected]pup_status now reports the live taskbar identity mode and related settings so test harnesses assert against what pup is actually in at check time rather than assuming a mode, which matters on a live machine where the user legitimately clicks the Settings matrix while tests run.
adom-wiki pkg install adom/[email protected]Plain mode now strips everything that was actually branding the grouped button: the property wipe also nulls both WM_SETICON slots so the window falls back to Chrome's own class icon (the leftover pup HICON was what the shell painted on the Chrome for Testing group button), and the registry sweep deletes every Adom.Pup AUMID key instead of only the ones bookkeeping still remembered, which was zero after a prior mode switch had nulled them.
adom-wiki pkg install adom/[email protected]Taskbar mode switches are now race-proof: an identity generation token makes every mode change or new sweep supersede all in-flight stamp work, so rapid state clicking can no longer land stale AUMID stamps on top of a plain-mode strip, and the plain apply runs a verify re-strip after the settle so the glass converges even when a stamp had already passed its abort check when the click arrived.
adom-wiki pkg install adom/[email protected]The apply-progress panel in Settings survives the dialog re-render a state click triggers by re-finding or re-creating itself on every poll tick, so the step list and green check actually stay on screen instead of being wiped milliseconds after insertion.
adom-wiki pkg install adom/[email protected]Switching taskbar identity states in Settings now shows a live step list driven by the real apply promises, stamping or stripping identities then rebuilding buttons then painting overlay badges, ending in a green check when the taskbar actually matches, and the plain rows finally tell the truth visually: one stock Chrome button with a drawn hover-preview fan showing that the windows stay separate windows even though they can no longer have separate buttons.
adom-wiki pkg install adom/[email protected]The pup_configure verb now actually honors the jumpLists master toggle and its four task sub-toggles, wiring them to the live jump-list refresh; previously the verb silently ignored those arguments and only the dashboard dialog path applied them, which the T6 selftest exposed after a respawn left every recovered window without a re-commit trigger.
adom-wiki pkg install adom/[email protected]Classic BMP-in-ICO favicons finally decode: a new DIB-to-RGBA decoder handles the 32bpp uncompressed entries that ti.com and mouser.com ship, which analyzeIconBytes had been discarding as unreadable even though both fetch rails were delivering the correct bytes all along, so those taskbar badges now show the real red Texas Instruments logo and blue Mouser M instead of the generic globe.
adom-wiki pkg install adom/[email protected]The out-of-band favicon recovery now logs every outcome per rail and always falls through to Chrome's CDP network stack when the bridge-side bytes are not a readable icon, closing the silent path where a bot wall's 200-status HTML challenge page masqueraded as a fetched favicon and the badge went generic without a trace.
adom-wiki pkg install adom/[email protected]Favicons that hostile CDNs blocked now fetch through Chrome's own network stack via CDP as the final fallback with failures logged honestly, the dashboard taskbar strip serves the thread tile a button actually wears in tiles mode instead of always showing category art, and the reclaim sweep throttles to thirty seconds so busy multi-thread machines stop paying an enum call every few seconds.
adom-wiki pkg install adom/[email protected]Close issue 55 and its intermittent twin: when the in-page favicon path yields nothing - hostile CDNs blocking the fetch, or sites declaring no icon links - pup now fetches origin favicon.ico bridge-side with a real browser user agent, runs it through the same analysis pipeline, records it as last-good, and never again mislabels an empty fetch as a successful favicon.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Real-time badge paint after identity changes: the post-nudge path now repaints the overlay directly once the shell settles instead of waiting for unrelated churn to kick the enforcer, which had left freshly opened or re-tiled windows badge-less for tens of seconds.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]The plain rows in the Settings examples show all five canonical samples like every other row - each as the stock Chrome icon with its own site badge in the overlay state - with the stacking behavior explained in a caption instead of collapsing the samples away.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Overlay badges never settle on the generic globe when a real favicon is known: the last-real-favicon reuse keys on the site origin instead of the exact URL, and a painted generic schedules one thirty-second re-resolve so post-churn windows recover their real badge on their own.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]pup_progress sends the progress state and the stage tooltip in a single desktop_taskbar call: the follow-up tooltip call was clearing the bar the first call had just painted.
adom-wiki pkg install adom/[email protected]New pup_progress verb plus the pup-progress sub-skill: calling AI threads can now paint the Windows taskbar progress bar during long multi-stage work like site crawls and library harvesting, with indeterminate and percentage modes and a stage note on the hover tooltip; the open-window response and the verb catalog teach when it is warranted and when a quick page open should skip it, and the automatic activity strip yields while explicit progress is held.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Smart overlay contrast: a dark-dominant favicon on transparency (the GitHub class) now gets a light card behind it instead of vanishing on the dark one; every other favicon keeps the dark card it was designed against.
adom-wiki pkg install adom/[email protected]Put the bridge version and the enum_windows counter on the pup_status verb payload itself, where remote machines without shell access can actually read them; 2.0.188 had put them on the local health endpoint only.
adom-wiki pkg install adom/[email protected]Repair the six-state taskbar matrix in Settings: the tiles name-strip append was recreating the DOM after paint, leaving every cell blank and unclickable - now the HTML is built once, canvases paint after, and clicks bind after; the suggested default combination (tiles plus overlay) wears a small default chip.
adom-wiki pkg install adom/[email protected]Expose the enum_windows call counter on pup_status as well as the health endpoint, so the is-pup-spamming question is answerable through a pup verb on any machine without shell access.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]The Settings preview is now the full six-state matrix: taskbar mode (tiles, aumid, plain) crossed with overlay badges on and off, every cell live-drawn with the current combination highlighted and clickable to switch straight to it, plus the live thread-name strip kept under tiles mode.
adom-wiki pkg install adom/[email protected]Make the taskbar identity ladder provable live: the button nudge fires on every landed identity change so tiles-to-aumid switches repaint, switching to plain strips all pup identity from existing windows immediately so they fall back to the stock Chrome button, and the Settings preview now shows what the SELECTED mode looks like instead of always showing Thread Tiles.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Cut the Thread Tiles button-nudge hide window from 600ms to 80ms: the longer hide made a freshly opened window genuinely invisible for over half a second, which tripped the live-window safety invariant and was a visible flicker, while 80ms still forces the taskbar button rebuild.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Thread Tiles legibility and Settings: enforce a font-size floor so long thread names are truncated rather than shrunk to unreadable, add the missing Thread Tiles toggle to the Settings dialog with live-rendered example taskbar icons, retitle the dialog to Settings, and cut enum_windows traffic by coalescing fresh callers, slowing the birth poll, and ignoring the button nudge's own window events.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Thread Tiles: anchor the name text bottom-left in the tile so the overlay badge in the top-right corner covers as little of the name as possible; tile generation bumped to t5 for fresh art everywhere.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Thread Tiles direct transition: a thread window's button goes straight from the default Chrome identity to the thread name tile with no intermediate AUMID and no category wait, and the favicon overlay paints only after the thread stamp settles so it cannot latch the pre-thread button.
adom-wiki pkg install adom/[email protected]Thread Tiles: restore the favicon overlay badge on thread tile buttons; the earlier suppression was a misdiagnosis of the stale icon-handle bug fixed in 2.0.166, and the corner badge leaves the name readable.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Thread Tiles: set the owning ai-thread at window create so the taskbar button is BORN under the thread AUMID with the name tile, instead of relying on a fragile post-open re-stamp; bump tile generation to t4 for virgin button art.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Add a temporary stamp-decision diagnostic log to trace why the thread AUMID tile is not appearing on the taskbar button, recording the computed appId and AD reply per stamp.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Thread Tiles fix: write the per-thread AUMID registry IconResource even under minimal-touch, so the thread-name tile actually brands the taskbar button instead of losing the button-art race to the default pup icon.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Thread Tiles render diagnostics: step-by-step logging in renderThreadTileIco (page created / html loaded / screenshot / ico) and the threadTiles toggle now clears _registeredPupAumids so every window re-runs registerPupAumid (where the tile renders) instead of short-circuiting on an already-registered appId.
adom-wiki pkg install adom/[email protected]Thread Tiles diagnostics + resilience: log the register path (threadName, browser presence, profile) and fall back to any live browser to render the offscreen name tile if the session's own profile browser is not in the map yet.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Consumer bug-report fixes: pup_type now verifies the value landed and flags the foreground-required silent no-op (was reporting ok:true on an empty field); new pup_fill verb sets values in the background (native setter + input/change) for React-controlled inputs; pup_click locates the element then clicks by coordinates to beat the 15s selector-timeout on huge DOMs, plus a domClick option for React toggles that ignore trusted clicks; credential auto-capture now hooks programmatic form.submit(), matches masked type=text password fields on click, and adds keydown-Enter + pagehide safety nets; session_not_found is now bridge-restart-aware and states plainly when a window did not survive a restart.
adom-wiki pkg install adom/[email protected]pup_uninstall added to the pup_describe catalog so AIs discover it (dryRun-first, confirm-gated, keep-flags documented)
adom-wiki pkg install adom/[email protected]Adds pup_uninstall: cleanly removes pups whole machine footprint. Destructive and reason-gated behind confirm uninstall; dryRun true previews the plan without removing. Wipes the HKCU AppUserModelId Adom.Pup registry keys, all staged extensions, all pup profiles and sessions, the OS-keychain credential vault, pup-settings.json, the badge-debug temp dir, and the jump-list launcher; keep-flags keepCredentials and keepProfiles preserve user data, and Chrome-for-Testing plus firewall rules are left alone unless removeChrome or removeFirewallRules. Closes every window and quits every browser first to release profile locks. New credential_vault wipeAll helper
adom-wiki pkg install adom/[email protected]Dual-mode login fill, fixing the 2.0.124 regression. Real keystrokes only register when the window is foregrounded (a browser constraint on synthetic key input to a headful window), while a background .value-set works but React-controlled masked fields ignore it. So pup_login now defaults to the background .value-set (works on the vast majority of sites, no foreground) and adds realKeystrokes:true which briefly foregrounds the window and types with genuine key events for React-masked fields like Gustos. When a background fill does not land the password, the response flags reactMaskedFieldSuspected and hints the caller to retry with realKeystrokes. Field detection still matches type=password OR autocomplete=current-password OR name/id password
adom-wiki pkg install adom/[email protected]pup_login and autofill now drive login forms with REAL keystrokes (page.keyboard) instead of a programmatic .value set. React-controlled masked password fields (Gusto and many SSO/Keycloak themes) silently ignore a .value set, the value shows in the DOM but the form submits empty because the framework state never updated, which is why pup could find and fill Gustos field yet never authenticate. fillLoginForm now tags the located username and password fields, focuses each, clears with a real select-all plus backspace, types with genuine key events, VERIFIES the value actually landed and retries once if a React re-render ate the first attempt, then submits. This makes pup drive real-world masked logins natively
adom-wiki pkg install adom/[email protected]pup now recognizes password fields that are not type=password. Gusto and many SSO/Keycloak login themes render the password as type=text with autocomplete=current-password (masking it themselves), which pups capture rail and fillLoginForm both missed because they keyed only on input[type=password] - so pup could neither capture nor fill those logins. Both now match a field that is type=password OR autocomplete current-password/new-password OR whose name/id is password, and the username heuristic explicitly excludes the password field so it never mistakes a type=text password box for the username. This makes pup drive real-world SSO logins like Gusto
adom-wiki pkg install adom/[email protected]Turns OFF Chromes native Save password bubble (John: the save dialog is still showing, just always automatically handle this). pup now owns credential capture end to end: the login-capture rail (hardened in 2.0.121 to grab on password blur/change so it beats cross-origin SSO redirects like Gusto) records into the OS keychain vault, and autofill sets values directly over CDP with no dropdown and no foreground. Chromes bubble was redundant since pup grew its own vault and was the exact dialog the user did not want. Applies on the next window launch since the pref is read at Chrome startup
adom-wiki pkg install adom/[email protected]Hardens pups own login capture to catch cross-origin SSO logins like Gusto that submit-only capture was missing. The capture rail now also grabs the credentials the moment the password field loses focus or changes, which fires before the form submits and before a cross-origin redirect (login.gusto.com to app.gusto.com) tears the page down; the synchronous binding delivers the creds first, beating the race that lost them. Chromes native manager stays on as the backup, so this is belt-and-suspenders with no risk of losing a credential. The dialog-free auto-accept of Chromes own save is a separate larger piece still to build
adom-wiki pkg install adom/[email protected]Stops pup from triggering a Windows Firewall/UAC prompt (John hit it when his payroll thread opened a Gusto window). Root cause: Chromes Cast/MediaRouter feature binds an mDNS listener on 0.0.0.0:5353, a network-exposed socket that makes Windows Firewall prompt, and it re-prompts on every new Chrome for Testing exe path (a version bump). pup is an automation browser that never casts, so it now disables MediaRouter, the DIAL and Cast route providers, and passes media-router=0; Chrome then binds only loopback and no firewall prompt is shown. disable-background-networking did not cover this because MediaRouters mDNS is a separate binding
adom-wiki pkg install adom/[email protected]Log and comment accuracy only: the anchor AUMID registration message no longer claims it makes a Start Menu pin (it is registry-only as of 2.0.118). No behavior change
adom-wiki pkg install adom/[email protected]Stops pup from creating an Adom Pup entry in the users Start Menu, which Adom users dislike. The main app-identity registration ran on every bridge start and registered the anchor AUMID WITH a Start Menu shortcut (the pinnable launcher). It now registers registry-only with shortcut false and brands the AUMID by writing IconResource straight into HKCU, the same shortcut-free technique the per-window AUMIDs already used, so grouped taskbar mode keeps its grouping anchor but no Start Menu shortcut is ever created. Existing machines self-heal: the stale Adom Pup.lnk is deleted on the next bridge start. The pinnable launcher is dropped deliberately since users did not want it
adom-wiki pkg install adom/[email protected]Fixes a data-loss race in pup_quit_idle_browsers that could close a browser holding live windows. It judged idle purely by adopted in-memory sessions, so right after a bridge restart, before re-adoption runs, a warm browser still holding real windows looked session-less and got closed, taking every window with it. It now inspects the browsers ACTUAL open pages before closing and skips any browser that still holds a non-blank page, or that cannot be inspected, so a browser mid-re-adoption or user-held is never reaped
adom-wiki pkg install adom/[email protected]Pup now closes Chrome gracefully instead of force-killing it, so the profiles prefs actually flush to disk on close (John). The teardown did call browser.close but then unconditionally force-killed the PID, which could truncate the pref write mid-flush; that is why the toolbar pins were lost every relaunch, and it also caused Chromes unclean-exit Restore tabs bubble. Now pup waits for the process to exit on its own after the graceful close and only force-kills a genuinely wedged process; the profile-scoped reap still guarantees no reparented renderer lingers. This lets the once-per-launch pin state persist
adom-wiki pkg install adom/[email protected]Fixes the owner parameter being ignored on pup_open_window. An explicit owner arg now wins over the callers ai-thread (it is the documented your thread/task label), and it stamps both the owner label and the _ownerThread gate/resolution identity, so one thread can faithfully reopen a window ON BEHALF of another thread, e.g. a reload cycle, and that thread still finds and owns it with zero ids. With no owner arg the callers ai-thread remains the owner, unchanged. Found when a reload stamped six other threads windows as mine
adom-wiki pkg install adom/[email protected]Fixes the pup toolbar logo for real, and roots out why it was missing. Chrome for Testing now DISABLES unpacked (load-extension) extensions until the profiles Developer mode is on, so the Adom action icons had no action, could not be pinned, and hid in the puzzle-piece overflow. Developer mode lives in HMAC-signed Secure Preferences that pup cannot seed by writing files, so pup now calls the developerPrivate API on a short-lived background chrome://extensions page at each launch to turn Developer mode on and pin every Adom action icon. This is also the only path that fixes a fresh profile, where dev mode starts off. The four-dot pup mark, the identity avatar, and the annotate pen now sit pinned in the toolbar
adom-wiki pkg install adom/[email protected]Fresh-user defaults now match Johns working config, since the AUMID crash concern that kept them off is resolved and John confirmed they work great. A new user now gets per-window taskbar identity (aumidIcons on), jump lists (jumpLists on), the category icon style, and split taskbar grouping by default, instead of the old all-windows-stacked-under-one-Chrome-button mode. Existing users explicit choices are untouched via the _chosen tracking, so this only moves users who never set these keys
adom-wiki pkg install adom/[email protected]Credential hints surface on any verb, not just render verbs: the anti-phishing auto-fill note (which regurgitates the live domain) and the login-capture note now drain unconditionally so the caller sees them on its very next call whatever it is
adom-wiki pkg install adom/[email protected]Fixes login capture missing form submits that navigate: capture now fires through a synchronous Puppeteer binding at submit time, reaching the keychain vault BEFORE the navigation wipes the page, with the sweep-harvested global kept only as the fallback for SPA logins that never navigate. Same keychain-only, never-logged storage
adom-wiki pkg install adom/[email protected]pup-native credential manager (John authorized), so the AI manages logins without Chromes foreground picker. Auto-capture: as any login is submitted in a pup window, the username and password are recorded into the OS keychain vault (encrypted at rest, never in the index, never logged, never echoed) and the owning thread is hinted that its adom-you identity just grew. Auto-fill on return: matching pages fill in the background over CDP, no Chrome dropdown, no foregrounding. Submit is REASON-GATED and domain-confirmed per John: pup never auto-submits; the AI must call pup_login submit true with a submitReason, and the refusal regurgitates the exact live host so a lookalike or phishing domain is caught before the secret is sent. New pup_credentials verb lists saved logins host and username only; captureLogins and the richer autoLogin modes are dashboard settings and pup_configure keys
adom-wiki pkg install adom/[email protected]The anonymous identity tile is recut per John: it no longer wears the pup four-dot mark, which read as pup-again rather than nobody. It is now the universal empty-avatar signal, a muted blank head-and-shoulders silhouette inside the same dark avatar disc on the family tile, so the identity slot reads avatar equals you, blank head equals no identity. Popup card mark updated to match, anon extension 0.1.1
adom-wiki pkg install adom/[email protected]One pup logo, finally. John picked the four-dot mark; until now pup wore three unrelated identities that accreted feature by feature: the borrowed two-lobe adom mark on the extension tile and legacy icos, a one-off two-windows-and-pulse dashboard favicon, and the four-dot mark only in the popup header and the anonymous tile. The canonical mark is now the teal rounded tile with the adom four offset dots in dark logo teal, worn by the pup toolbar extension icon set at 0.2.5 and the dashboard favicon; the purpose-variants stay because they carry meaning: pen for annotate, avatar for signed-in-as-you, dots-on-dark-disc for anonymous, category glyphs on taskbar tiles
adom-wiki pkg install adom/[email protected]pup_my_windows stops lying by omission during recovery: for about 90 seconds after a bridge restart an empty listing now says the bridge is still re-adopting surviving windows and to retry, instead of letting a thread conclude its window is gone. Found by hitting exactly that window myself while verifying the ai-thread rename
adom-wiki pkg install adom/[email protected]The thread-addressing parameter is spelled ai-thread, exactly like the CLI flag, per John; the camelCase forms from earlier today remain silent aliases. Docs and describe updated
adom-wiki pkg install adom/[email protected]Teaching refinement to the next-steps block after Johns question about screenshots: pup_screenshot is the loudly-stated default, page-perfect over CDP with zero ids, and the one legitimate reason to touch a desktop verb, needing the browser chrome itself in frame, now comes with its rail: pup_window_info hands the caller its own windows hwnd so nothing is ever searched for
adom-wiki pkg install adom/[email protected]The thread-name addressing parameter is aiThread, matching abs own --ai-thread vocabulary exactly per John; aiThreadName from an hour ago stays as a silent alias. Docs, describe, and the my-windows payload all speak aiThread
adom-wiki pkg install adom/[email protected]AI-thread ergonomics overhaul after John watched the ah-build thread hwnd-hunt its own window. New pup_my_windows verb: zero args, everything the calling thread owns with ready-to-run next steps. Thread-name addressing: any targeting verb accepts aiThreadName in place of sessionId, resolving to that threads window, first step of retiring sessionId from the public surface. And every open and navigate response now carries a _next block teaching the caller to keep driving its window with zero ids, screenshot via pup_screenshot, reload via pup_reload, and never to hunt hwnds with desktop verbs for a pup window. SKILL.md gains the addressing section as the second thing a reader sees
adom-wiki pkg install adom/[email protected]The owner-in-tab-title experiment is removed outright. John: stop mangling the title of the page. The page title belongs to the page; attach and the 10s sweep now inject only the cleanup build that strips any prefix an elder keeper still applies and kills its interval, the settings row is retired, and the doctrine is written down in the new dev-skills pup-page-integrity skill so it never comes back. Ownership signals stay on pup-owned surfaces only: taskbar tooltip, dashboard, extension hover, identity tile. Also replaces the dashboard header close-all icon, a bare X that read as close-this-dashboard, with a stacked-windows-with-x glyph and a tooltip spelling out that it closes every pup window, not the dashboard
adom-wiki pkg install adom/[email protected]Profile-consistency doctrine from John: every pup window ALWAYS opens on the shared adom-you profile, and isolation becomes reason-gated exactly like foregrounding — an explicit isolated:true without an isolationReason is refused with a teaching hint, while the two definitional cases, webSecurity false and the wiki public view, carry their own built-in reason. And a window that does run on an alternate profile now still shows an identity tile: a new anonymous variant with the pup four-dot mark set in the circular avatar inset, whose popup card explains the window is not signed in as you, so a not-you window is visible at a glance instead of just missing an avatar
adom-wiki pkg install adom/[email protected]Immediate relief for the initials badge John kept seeing over the pup toolbar icon. Investigation found the adom-you Chrome stays warm across bridge restarts, never reloads staged extensions, and currently hosts other AI threads windows, so it must not be relaunched; the new pup_quit_idle_browsers verb correctly refused. Instead the health endpoint renames the session owner field to ownerThread: the stale worker paints its badge from that field every 30 seconds, so the rename starves the retired badge within one sweep with zero disruption to running windows. Extension 0.2.4 readers use the new field; ownership itself now lives directly visible in the tab title prefix
adom-wiki pkg install adom/[email protected]Adds the pup_quit_idle_browsers maintenance verb: gracefully Browser.close every profile browser carrying zero live sessions, pup-native and never an OS process kill. Needed because pup keeps Chrome warm across window closes and bridge restarts, and a warm browser never reloads its staged extensions, so extension updates could not actually land without it. Rides with the 2.0.98 sweep title re-assert
adom-wiki pkg install adom/[email protected]The owner-in-tab-title keeper now re-asserts from the periodic sweep. Root cause found while chasing why the thread name did not appear after the last bridge restart: pup deliberately keeps Chrome alive across bridge restarts and re-adopts it, and adoption attaches tabs BEFORE the session files restore ownership, so the attach-time injection saw no owner and skipped. The sweep now stamps every owned window; the versioned owner-keyed guard makes repeat passes no-ops. Same investigation also explains why the retired badge kept appearing: a surviving Chrome never reloads its extensions, so the badge-free worker only arrives with a true relaunch
adom-wiki pkg install adom/[email protected]Two dashboard polish items from John. The stock browser scrollbar in the settings dialog is replaced by the brand one everywhere on the dashboard: thin, rounded, invisible track, thumb on the border token. And the double-tooltip bug is gone: several controls carried a raw title attribute alongside the designed tooltip, so both rendered; any title attribute is now absorbed into the tooltip system on first hover before the native delay can fire, so every hint renders through the one clamped 600ms tooltip
adom-wiki pkg install adom/[email protected]Follow-through on the owner-in-tab-title change. The thread name now rides as a PREFIX because Chrome ellipsizes tabs at a fixed width and the suffix form truncated out of sight, defeating the directly-visible goal. Also fixes extension staging: the stager compared file size only, so a same-length edit like the manifest version bump 0.2.2 to 0.2.3 was silently never copied to the desktop; it now also compares mtime, which is why the retired owner badge could still appear after the last cycle
adom-wiki pkg install adom/[email protected]Two John asks from live use. One: the corner floaty pencil is now OFF by default and its hover zone no longer exists unless enabled in Settings, because the invisible corner target was fighting real buttons in app headers; the toolbar pen button now carries discovery, the Alt Shift A hotkey survives independently of the pencil via its own setting, and flipping the setting live now genuinely tears the pencil out of every open page instead of only affecting future loads. Two: the owner-initials badge overlay on the toolbar icon is retired as too disruptive; Chrome allows an extension one icon plus a four-character overlay and no toolbar text, so the owning AI thread now rides the tab title as a plain visible suffix, kept idempotently as pages rewrite their titles, live-applied both ways from Settings. Extension worker 0.2.3 clears old badges and keeps the hover title. The floaty ralph harness enables the pencil for its run and restores the prior setting after
adom-wiki pkg install adom/[email protected]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
adom-wiki pkg install adom/[email protected]The corner pencil no longer appears stuck-visible in a freshly opened window (John hit this on the three-tile demo window). Chromium fires one synthetic hover event at page load under a parked cursor; when that landed in the corner reveal zone the pencil revealed and nothing ever tucked it because tuck only runs on real mouse movement. A reveal that sees almost no movement within 3.5 seconds is now recognized as that synthetic case and auto-tucks; genuine hovers produce a stream of moves and keep it up
adom-wiki pkg install adom/[email protected]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
adom-wiki pkg install adom/[email protected]The dashboard has been silently broken since 2.0.50 and this is the one-character reason: the tbFloatyPencil settings row description contained an escaped apostrophe that serializes into the dashboard page as a raw quote, killing the entire inline script at parse, which is why the page froze at connecting with zero counts while the SSE stream itself was healthy (traced tonight: curl streamed fine, a fresh EventSource from the page worked, the page console showed Unexpected identifier s, and node --check on the served inline script pointed at the exact row). Description rewritten apostrophe-free
adom-wiki pkg install adom/[email protected]The pencil hit area becomes a user-tunable slider (John: 8px too small, 160 too big, let me pick): new floatyHitPx setting, 6 to 120 px slider under the toolbar family in the pup dashboard Settings, default 24. It live-applies: the versioned injection guard now includes the px value, so moving the slider re-injects the floaty on every open page instantly, tear-down and rebuild, no reloads. Built so John can feel each size and report the best default
adom-wiki pkg install adom/[email protected]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
adom-wiki pkg install adom/[email protected]The pencil reveal target shrinks to a tiny 8 pixel literal corner (John: dashboards have buttons in the upper right and a 160 pixel zone summons the pencil over them; he wants roughly 6 pixels, truly out of the way). Jamming the cursor into the exact corner reveals the pencil; the generous proximity zone still keeps it open once revealed
adom-wiki pkg install adom/[email protected]The pup toolbar icon's mark renders in the Adom logo's own dark teal 003d40 on the corrected 00b8b1 tile (John's call): the white glyph elements of the favicon render are flipped to the dark accent the brand mark already uses, so the icon family reads as tile plus dark mark for pup and tile plus avatar for identity
adom-wiki pkg install adom/[email protected]The real teal, everywhere in the icon family (John: is that our real brand color?): the pup toolbar icon was rendered from adom.inc favicon.svg which still carries #00b8b0, the documented wrong-digit teal the design system warns about, while the identity tile used the true #00b8b1, so the matching pair differed by one invisible digit. Both extension icon sets are regenerated from the favicon with the teal corrected to #00b8b1, matching the identity tile recipe exactly
adom-wiki pkg install adom/[email protected]One icon family across every pup surface (John: the two toolbar extension icons felt like brothers from another mother): the Adom Identity icon becomes the same teal rounded tile as the pup toolbar icon and the Windows taskbar tiles, with the user's avatar circle-cropped and inset inside the tile frame, same silhouette, same corner radius, same brand teal, composed with sharp at stage time from the profile avatar with the favicon tile as fallback
adom-wiki pkg install adom/[email protected]The floaty pencil tucks away (John: it will interfere with page UI): hidden by default, revealed by a corner hover zone tracked via passive mousemove so nothing ever intercepts a page click, the taskbar-tuck pattern, auto-hiding 1.2s after the mouse leaves. When revealed it carries the floating-windows-skill drag grip (six-dot glyph); dragging pins it visible wherever the user places it, viewport-clamped. Also the floaty ralph harness is fixed: pup_eval wraps expressions as return(expr), so the harness's statement-chain emits were silent syntax errors that never set the result, which was the entire phantom failure while the real path worked
adom-wiki pkg install adom/[email protected]Annotate captures go flicker-free: CDP captureScreenshot compositor-swaps the surface and visibly blips on a foreground hardware-accelerated window, which pup never noticed because its usual screenshots target background windows; annotate is the first feature shooting the window the user is watching. Captures now grab a single screencast frame on the recorder's rail, which has no visual artifact, DPR-scale-cropped server-side with sharp, with captureScreenshot as the logged fallback
adom-wiki pkg install adom/[email protected]The last blip: Chrome's native screenshot flicker, a viewport re-layout that fires when captureBeyondViewport is left on (the default) for clipped captures. John's blip-then-outline sequence proved captures process on the real path and located the flicker exactly; captureBeyondViewport false removes the re-layout so the capture is visually silent until the dashed teal outline confirms it
adom-wiki pkg install adom/[email protected]The capture indicator becomes a dashed teal outline of exactly the copied region (John: cooler than the white wash), holding half a second then fading. And the post-draw blip: the ten-second sweep re-arm called show on an overlay the user's mouse-up had just hidden, flashing the dismissed toolbar back across the screen; re-arms after an emit-hide are now invisible
adom-wiki pkg install adom/[email protected]Correct the region-only flash guard: the early return in 2.0.79 sat inside the capture-done function and would have suppressed the toast and fade for regionless captures too; the guard now skips only the flash block while the toast and drawing fade always run
adom-wiki pkg install adom/[email protected]The capture camera-flash covers only the shot region, never the whole window (John's rule): the full-viewport fallback for regionless captures is removed, so a full-view capture gets the toast alone and only cropped captures flash their exact rectangle
adom-wiki pkg install adom/[email protected]The capture watcher survives navigations: the wiki auto-login navigation destroys the execution context moments after a window opens, the waitForFunction rejects, and the watcher silently died, which was the final layer of the no-toast bug. Context-destroyed and detached rejections now re-arm the wait instead of abandoning it; only a genuinely closed page ends the watch
adom-wiki pkg install adom/[email protected]The final capture bug: arming the watcher cleared __pupAnnotateResult, destroying any capture the user emitted moments earlier, which is why the toast never came. Arming no longer clears, and pup_floaty_click arms the watcher immediately on the verb path so popup, ralph, and hotkey-via-worker captures have zero arm latency; the in-page pencil path arms via the 10-second sweep with the overlay already visible instantly
adom-wiki pkg install adom/[email protected]Quick capture works again: the 2.0.72 fast-harvest loop never dispatched in production (instrumented and proven silent), so the capture pickup returns to the 2.0.49-proven per-annotation watcher, now feeding the new fast pipeline: screenshot, immediate camera flash and preview toast, then caption bar, iTXt, clipboard and disk in the background, with quick mode re-arming per stroke. The pencil and hotkey keep their instant client-side open and additionally set the click flag so the 10-second sweep arms the watcher (restored, proven), with an arming guard against double-starts. The dead fast loop is deleted
adom-wiki pkg install adom/[email protected]Instrument the silent capture pipeline: log the harvested result, the screenshot entry and completion, and bound the screenshot with a 10 second timeout so a hang becomes a logged error instead of a silently eaten capture
adom-wiki pkg install adom/[email protected]The no-toast bug in the fast capture loop: the harvest evaluated a destructive read-and-clear under a 600ms race, so whenever the CDP round-trip lost the race the capture was consumed in the page and dropped server-side with no trace. The loop now peeks read-only under the race (a lost peek loses nothing) and only performs the destructive read after a confirmed hit, with no racing timeout
adom-wiki pkg install adom/[email protected]The annotate lag John felt is gone by architecture: the whole overlay module is PRECACHED into every page at load, so the pencil click and Alt+Shift+A open the toolbar instantly client-side with zero bridge round-trip, and a new 700ms fast-harvest loop replaces the 10-second identity sweep for capture pickup. The capture pipeline is reordered for perceived speed: screenshot, then immediately the client-side camera flash (a deliberate white 20 percent pulse over exactly the captured region plus margin, replacing the unexplained blip) and the toast with the preview, while the caption bar, iTXt, clipboard, and disk writes run in the background. After the shot the drawings fade out so the user is back to normal surfing. And the pencil tooltip is restyled to the canonical tooltips-skill surface: teal-tinted border, blur, structured title, body, and a monospace shortcut chip
adom-wiki pkg install adom/[email protected]The annotate hotkey moves onto pup's injection rail: chrome.commands never fires under this load-extension combo (verified with real focused keystrokes after the Alt rebind), completing the pattern where only the extension's action surface works while content scripts, chrome.scripting, and commands are all dead. The floaty injection now carries a page-level Alt+Shift+A listener that sets the same click flag the pencil sets, so the hotkey works whenever a pup page is focused, which is exactly when a user would press it, and it is ralphable with real OS keystrokes
adom-wiki pkg install adom/[email protected]The annotate hotkey moves to Alt+Shift+A: John caught Ctrl+Shift+A colliding with Chrome's built-in Search Tabs, a conflict that ships silently because Chrome just declines the extension binding. Every mention updates (manifest suggested key, floaty tooltip, popup chip, settings row, skill), and the floaty ralph gains a registration assertion reading chrome://extensions/shortcuts so an unassigned or conflicted chord fails the weekly ralph instead of reaching a user
adom-wiki pkg install adom/[email protected]pup_floaty_click, the test seam John asked for: a first-class verb that simulates a user click on the floaty pencil by firing the same host click handler a real mouse does, so the flag, sweep harvest, and annotate start are all exercised as the production chain. Built specifically so the floaty can be ralph-tested weekly forever without CDP input-simulation flakiness, with honest errors when the floaty is absent
adom-wiki pkg install adom/[email protected]Floaty pencil click handlers move from the button inside the closed shadow root to the host element in the light DOM: trusted CDP clicks at the host's coordinates were not reaching the shadow button's handler (verified by the sweep heartbeat harvesting a null flag after a real click), and host-level handlers work regardless of shadow hit-testing while remaining synthetically testable
adom-wiki pkg install adom/[email protected]Floaty-click harvest hoisted above the identity-support gate with a sweep heartbeat: the pencil must work even when identity stamping is unsupported, and a silent sweep is now visible in the log. Diagnosing the click flag being consumed with no action
adom-wiki pkg install adom/[email protected]The floaty pencil for real this time: 2.0.65 shipped no code because the edit script hit an anchor mismatch and the ship ran anyway. pup now injects the pencil per page on the owner-chip rail (shadow root, brand tokens, the tooltip teaching the feature and shortcut), the click sets an in-page flag, and the 4-second enforcer sweep harvests it and starts red-pen annotate on that exact tab, no extension dependency. Gated by tbFloatyPencil
adom-wiki pkg install adom/[email protected]The floaty pencil moves to pup's own injection rail: both extension content-script paths (declarative and chrome.scripting) are verifiably dead under the load-extension flag on this CfT build even though the popup works, so discoverability must not depend on the extension. pup now injects the pencil per page exactly like the owner chip (shadow root, brand tokens, the great tooltip teaching the feature and the Ctrl+Shift+A shortcut), the click sets an in-page flag, and the 4-second enforcer sweep harvests it and starts red-pen annotate on that exact tab. Gated by the same tbFloatyPencil setting
adom-wiki pkg install adom/[email protected]The floaty pencil injects programmatically: declarative content_scripts never fire under the load-extension path on this CfT build (verified live, zero injection anywhere while the worker and popup run fine), so the worker now injects content.js via chrome.scripting on every completed http tab, idempotent per page. Manifest gains the scripting permission and broad host permissions and drops the dead declarative block
adom-wiki pkg install adom/[email protected]Annotate becomes discoverable (John: people won't find it). The extension now renders a tiny monochrome pencil floaty in each page's upper-right corner; one click starts annotate in red-pen mode, with a great tooltip (600ms, clamped) teaching the feature, the Ctrl+Shift+A shortcut, and the lift-the-mouse-and-it-is-on-your-clipboard flow. The hotkey itself is re-aimed from snip to the red pen since a circle tells the AI what the user means better than a bare crop. The floaty is a content script routing through the worker to pup's loopback (pages cannot reach it themselves), and a new tbFloatyPencil sub-setting (default on) under the toolbar family lets users who find it annoying turn it off
adom-wiki pkg install adom/[email protected]pup_annotate joins SESSION_TARGETING_VERBS, the one-word fix the menu ralph was holding the line for: the 2.0.58 tab-URL resolution only runs for verbs in that set, and pup_annotate had been inserted into PASSIVE_VERBS instead by a sloppy heuristic edit, so every toolbar-popup and hotkey annotate resolved no session and failed with Session undefined not found. The PASSIVE_VERBS membership stays deliberately since human annotation should not light the agent-driving progress bar. Found by probing the verbatim response after the menu ralph refused to go green
adom-wiki pkg install adom/[email protected]Two fixes from the full-menu ralph and John's approval. One: annotate and snip injected their overlay into pup's bookkeeping of the active tab while the user was looking at a different tab, an invisible overlay and the true reason the snippet menu never worked for John; the resolved clicking tab now wins, then Chrome's actually-visible tab, then the old chain. Two: URL-based category prediction at open, wiki being John's 60 percent case: while pages still load, the intended URL classifies the window and an unchecked wiki page predicts signed-in, so the very first AUMID stamp is already the categorized id and the visible double-stamp collapses to one for the common case, with the rare wrong guess re-stamping once
adom-wiki pkg install adom/[email protected]The snip hotkey resolves its window the fixed way: Ctrl+Shift+A passed the tab URL through to the server-side any-tab resolution instead of the old main-page-only match that silently failed from most tabs, the same 2.0.58 bug class the popup had. Part of the full-menu ralph pass John requested
adom-wiki pkg install adom/[email protected]Annotate mode exits the way John expects: Esc closes the toolbar and removes the drawings from anywhere in the flow, and Auto mode is one-shot, circle the area, lift the mouse, it is captured and copied, and the toolbar closes immediately so the page is usable again (the drawing stays visible for the owning thread's next screenshot). Turning Auto off keeps the compose-then-Done flow for multi-step annotations, and the Auto tooltip teaches all of it
adom-wiki pkg install adom/[email protected]Toolbar popup actions actually fire from any tab (John clicked Annotate and nothing happened): the popup could only match a window by its main-page URL, so clicks from any other tab resolved no session and the error was swallowed. User-caller commands now resolve the window server-side by matching ANY tab of any session against the clicking tab's URL, the popup passes its tab URL through, and failures render in the popup instead of vanishing (every action answers back). Also the Adom Identity card becomes the real medium identity card per the identity-card skill: new pup /identity endpoint reads ab's Carbon session on the desktop and serves display name, handle, email, avatar and orgs, and the card renders name bold, handle-dot-email muted, and org pills with org avatars, showing only fields the identity API returns
adom-wiki pkg install adom/[email protected]Round-trip symmetry for the wiki view toggle plus the identity extension. John round-tripped the toggle and caught the asymmetry: the public direction relaunched into a throwaway jar but the logged-in direction signed in the throwaway itself instead of coming home, so authed from any toggle-created iso jar now takes the tab-preserving relaunch back to shared adom-you where logins enrich the shared store. The Chrome profile chip stops leaking internal names: anonymous jars read Adom anonymous. A second delayed raise fixes the toggle window returning in the background after a user click. The Chromium launches-when-Windows-starts promo infobar is suppressed in layers (candidate feature disables plus disable-field-trial-config, which is also the determinism WHY-CFT promises, plus promotional-tabs pref). And the new Adom Identity extension rides every adom-you launch: the toolbar icon is the user's avatar (staged from settings at launch, favicon fallback), click for the identity card explaining the shared adom-you profile; pinned via the computed unpacked id, algorithm validated against a live id
adom-wiki pkg install adom/[email protected]Annotate toolbar polish from John's live test, per the Adom UI design skills. The toolbar is draggable by a visible six-dot grip and clamps inside the viewport (floating-windows rules). Every control now has a real tooltip through a proper tooltip system: body-level fixed element, 600ms reveal, 0.18s fade and translate, measured after content is set, clamped to the viewport on both axes and flipping above rather than clipping (the tooltips skill contract), with carefully written copy per tool. Auto capture is on by default so the common single-circle flow needs zero extra clicks. And the view toggle is no longer out of sync: /health now carries the CHECKED wiki auth state per session, the extension popup labels the toggle from that ground truth instead of a cached belief, and hides the toggle entirely on non-wiki pages
adom-wiki pkg install adom/[email protected]The toolbar extension wears the real Adom favicon (John: your icon should be the adom favicon, not the hand-drawn dots), rendered from adom.inc favicon.svg at 16, 48, and 128. Also documents the CfT decision permanently: new sub-readme docs/WHY-CFT.md records the full technical case (the unsuppressable automation banner on branded Chrome that blipped over windows during cursor moves, logins and captcha assists; the Chrome 137 extension lockdown verified live including the session-scoped CDP install; version determinism with no auto-updater; no field trials or consumer nags; binary isolation from the user's own browser; and the honest trade-offs including the CfT download, the window title, and no Widevine). README and skill text updated off the stale system-browser-first policy
adom-wiki pkg install adom/[email protected]Pin the Adom Pup toolbar icon by default: MV3 action icons hide behind the puzzle menu unless pinned, so prepareCleanProfile now seeds extensions.pinned_extensions with the toolbar's id (stable because an unpacked extension id hashes from its staging path, which is fixed at .adom/pup-extension on every machine). Gated on the toolbarExtension setting
adom-wiki pkg install adom/[email protected]The toolbar extension becomes a launch arg (John repinned pup to Chrome for Testing after the branded-Chrome extension lockdown made every install path ugly). CfT still honors load-extension, so when the driving browser is CfT and the toolbarExtension setting is on, every profile launch simply carries the flag and every window is born with the toolbar: there is no install step at all. The transient pipe-install experiment is deleted (verified session-scoped, useless with detached launches), staging is a plain file copy, the flag rides only chrome-for-testing candidates since branded Chrome removed it, and pup_install_toolbar is now informational
adom-wiki pkg install adom/[email protected]The toolbar extension now simply auto-exists in pup (John: this is pup, you control the browser, there has to be a better way than a file dialog). The UIA dialog-driving experiment is deleted. Before a profile's Chrome ever launches, pup does an invisible two-second pipe-launch of the same profile and installs the extension via CDP Extensions.loadUnpacked (puppeteer enableExtensions plus installExtension, the sanctioned replacement for the load-extension flag branded Chrome removed in 137), so the extension persists in the profile and every window is born with the toolbar: no dialogs, no chrome-extensions driving, no user action, ever. Marker-gated per extension version so upgrades re-install once. pup_install_toolbar is now a thin status/trigger verb
adom-wiki pkg install adom/[email protected]Brand compliance plus the zero-click toolbar install. The annotate overlay, capture toast, popup, and caption bar now follow the Adom UI design system exactly: token colors (the real 00b8b1 accent family, 161b22 surfaces, 30363d borders, c9d1d9 body text), monochrome SVG line icons replacing every glyph character per the icon law, brand fonts bundled in the extension popup (Familjen Grotesk headers, Satoshi body, JetBrains Mono data), toast moved to bottom-center per the toast standard, drawing palette mapped to brand status colors. New pup_install_toolbar verb answers John's can-not-you-just-do-that-automatically: pup stages the extension, drives chrome://extensions itself through the shadow DOM (dev mode toggle, Load unpacked), and ab drives the one native folder dialog, so the one-time install is fully automated. /health now carries owner and view per session plus the toolbar prefs for the extension's badge feed, and annotation start clears any stale result flag
adom-wiki pkg install adom/[email protected]Interactive-surface phase 1+2 core (plan: docs/PLAN-interactive-surface.md). Annotation captures are now TIGHT-CROPPED to the drawn strokes plus a 48px margin instead of the whole browser view (John: if the user wants the whole view they'll draw a circle around it), Photoshop-style tool cursors with the pen carrying a live swatch of the selected color, a quick-capture Auto mode that fires the moment the mouse lifts, and the clipboard-first return path: every capture lands in the Windows clipboard as image plus text JSON sidecar together via a .NET DataObject helper so one paste into any AI chat carries both, with a caption bar baked under the crop and an iTXt metadata chunk inside the PNG so an image-only paste still carries context. An in-page toast shows a thumbnail of the exact crop grabbed. Also: USER_CALLERS set replaces the four exact-string user-taskbar-menu compares (the toolbar extension's user-toolbar caller joins it), and the toolbarExtension settings family lands ahead of the extension
adom-wiki pkg install adom/[email protected]Annotation and snipping land in pup (John: claude desktop can annotate in its browser, add it to pup, and build in a screenshot snippet like shift+win+s). New pup_annotate verb plus an Annotate this page task on every window's jump list: an in-page overlay with pen, arrow, box, text, color cycling, undo, and a Snip tool whose marquee captures just that region immediately, exactly the win+shift+s flow. Done captures a PNG and deliberately leaves the drawing in the DOM, because pup windows are thread-owned: the annotation is a message, and the owning AI thread's next screenshot shows exactly what the human circled. Captures store under screenshots/ and surface as session lastAnnotation; a caption confirms the handoff. jlAnnotate sub-setting, default on
adom-wiki pkg install adom/[email protected]Switch to public view on a shared-profile window no longer logs every thread out. John asked what should happen clicking the jump-list view toggle on a multi-tab window; the code answer was a browser-wide cookie wipe (CDP clearBrowserCookies) that silently signed out every window of every thread, then reloaded only the active tab, because the shared-profile guard tested the legacy adom-wiki-authed profile name and never matched today's shared adom-you. The guard now uses ground truth (any other live session on the same profile, plus the known shared names), so a shared-profile public switch takes the tab-preserving relaunch path: the whole window with all its tabs moves to a logged-out profile and no other window is touched. Also ships the quieted 60s overlay re-assert logging staged earlier
adom-wiki pkg install adom/[email protected]Overlay badges can no longer silently vanish, the bare taskbar tile John caught that my log-trusting audit missed: the taskbar progress cycle (and other shell-side events) can clear a button's overlay, but pup's paint memory survived it, so the enforcer saw a painted window and never repainted, bare on screen while green in the logs. Windows offers no way to query overlay state, so the fix treats it as write-only: every progress change voids the paint memory (the 4s enforcer sweep repaints), and a 60s per-window ground-truth re-assert repaints unconditionally so memory can never drift from the screen for more than a minute. Also dedupes the sibling-favicon log line that spammed on every re-resolve
adom-wiki pkg install adom/[email protected]Close the whole window, not just the bound tabs, the last ghost-window wonk the mimic ralph surfaced: recovery binds one tab per session and the sibling-tab rescan runs later, so a pup_close_window issued soon after a bridge respawn closed 1 of N tabs, declared the session closed, and left the OS window alive as an orphan that pup later adopted as a strange auto-named adom-you session. pup_close_window now collects the CDP windowId of every bound tab and closes every page living in those windows, bound or not, with a shared-profile guard so a page tracked by any other session is never touched
adom-wiki pkg install adom/[email protected]Stop handle theft between same-page windows, the wonk the hardened mimic ralph caught red-handed: mimic windows and a second hd-publish window stole real windows' taskbar handles after a respawn. Three causes fixed. The natural-title resolver asked for the WRONG title (pup's activeTabId bookkeeping says first tab while Chrome's window title mirrors the last-opened visible tab), making a session uniquely match someone else's window; it now asks Chrome which tab is actually visible. A title shared by two pup windows is now refused outright, counted over all pup rows BEFORE ownership exclusions, because excluding the true owner's row is exactly how a theft looked unique. And a persisted-claims map now loads every session file's handle at recovery start, so a handle is protected before its owner's session even finishes recovering, closing the recovery-storm race. The mimic harness now also asserts the real windows and never resets its collision map so cross-session theft can never self-grade OK again
adom-wiki pkg install adom/[email protected]Recovered windows finally re-resolve their taskbar identity, read-only. The mimic ralph proved every window went bare after a respawn: the persisted-handle continuity check was silent, geometry cannot tell identical parked windows apart, and the off-screen re-capture failed silently on this box because Chrome clamps off-screen coordinates so the absolute-position match never hit (and its restore dumped windows at 0,0, itself visible wonk). Four changes: enum rows now carry the native window title; a new natural-title resolver matches each session's active-tab title against pup-owned windows only (pid-fenced so the user's own Chrome can never match, exactly-one or refuse, nothing written anywhere); the re-capture identifies the moved window by bounds change instead of absolute position (clamp-proof) and restores the exact original rect; and the continuity/recovery paths now log their outcomes so silent success or failure is visible
adom-wiki pkg install adom/[email protected]Fix the two wonks the mimic ralph reproduced from John's real 3-thread workload. One: after any bridge respawn every recovered window lost its taskbar identity (no handle, no overlay, unbrandable) because all four ownership proofs are dead for a recovered window, so the perfectly good persisted hwnd was discarded and the wiggle fallback could not disambiguate the shared profile. Recovery now records Chrome's persisted pid next to the restored hwnd, and hwndBelongsToPup accepts the pair (handle still owned by the exact process it was recorded under, and Chrome outlives pup respawns) as proof by continuity. Two: windows randomly ended up frozen with a 3-task jump list missing both view toggles, because a wiki window's categorized appId can commit before its login view resolves and the freeze locked that incomplete menu forever; wiki-category windows now freeze only once the view tasks are actually in the menu. Found by dev-skills/pup-taskbar-identity/ralph_mimic.sh, the new harness that replays John's observed workload including the respawn-recovery leg
adom-wiki pkg install adom/[email protected]Add an Open pup dashboard task to every pup taskbar jump list (John's ask): one right-click opens the live dashboard mapping every pup window and tab to its owning AI thread, reusing the one dashboard window on repeat clicks. Routed through the v2.0.41 direct-callback launcher like every other task. New jlDashboard sub-setting (default on) under Jump lists in the settings dialog, wired into the dedupe key and the settings refresh path so toggling it updates existing windows immediately
adom-wiki pkg install adom/[email protected]Jump-list tasks now call pup directly (John: be way smarter about how to call back into ab for the jump lists; should pup talk to itself when it is its own bridge). Answer: yes for pup verbs. Old tasks set no target so ab supplied the program (its bundled CLI), an exe path pup neither controls nor verifies and exactly what the CLI rename broke. Each task now carries target=powershell.exe plus a pup-owned launcher script that reads pup's own loopback port from a discovery file pup rewrites on every bind, POSTs the verb straight to pup (pup to pup, no ab hop, no CLI, no stale path), and only falls back to the resolved adom-bridge-cli.exe (which wakes pup via ab) if the direct hit fails because pup idled. JSON args ride as base64 so nothing mangles through the shell-link to powershell argv reparse. No ab change needed: the per-task target field already existed
adom-wiki pkg install adom/[email protected]Fix jump-list items doing nothing (John: Close ALL and other menu items don't work): the bundled CLI renamed from adom-desktop-cli.exe in the Adom Desktop folder to adom-bridge-cli.exe in the Adom Bridge folder, but pupRelaunchCommand hardcoded the OLD path, so every jump-list task, taskbar header click, and pinned launch invoked a missing exe and silently no-opped (verified live: old path gone, new path exists). The bridge runs on the desktop so it now resolves the real exe from disk, Bridge name first with a legacy fallback, cached
adom-wiki pkg install adom/[email protected]Remove the temporary birth-capture diagnostics now that the raw-Chrome-icon regression is root-caused and fixed (2.0.37 routes every window through the birth path, 2.0.38 makes capture position-independent and serialized). Verified live: four windows including three opened in parallel each got a distinct OS handle, a correct AUMID teal tile, and an overlay badge, with zero collisions and zero stamp failures
adom-wiki pkg install adom/[email protected]Position-independent, serialized birth-hwnd capture, the real fix: Chrome clamps our -32000 off-screen birth coordinate on-screen on some boxes, so identifying the new window by position fails (newOff was always 0). Now a global birth lock serializes window creation so the set-diff sees EXACTLY ONE new OS handle regardless of where Chrome placed it - that handle is the window, unambiguously, with no position or pid dependency. Combined with 2.0.37 routing the first window per profile through this same path, every pup window on Windows now gets a reliable unique handle, so AUMID and overlay paint and no window shows a raw Chrome button
adom-wiki pkg install adom/[email protected]THE root cause of the raw-Chrome taskbar icons: only the 2nd-plus window on a profile went through the birth-capture path that assigns an OS hwnd; the FIRST window on a profile used browser.newPage() which captures no handle, so after 2.0.24 removed the title-tag fallback that first window was permanently unresolvable and showed a raw Chrome button with no AUMID and no overlay. Now every pup window on Windows is created through createPageInNewWindow (off-screen birth + set-diff capture), so all of them get a reliable, unique handle. Keeps the 2.0.36 diagnostics one more build to confirm
adom-wiki pkg install adom/[email protected]Temporary diagnostic instrumentation on the birth-capture block to find why hwnd resolution stopped producing results (logs fresh/profile/beforeHwnds, per-iter rows/offscreen/newOff counts, and any thrown exception) - to be removed once the root cause is found
adom-wiki pkg install adom/[email protected]Make the 2.0.34 set-diff birth capture actually resolve under concurrency: widen the off-screen birth spacing from 40px to 220px so disambiguating concurrent births by nearest-birthLeft is unambiguous against Chrome placement jitter (the 18px tolerance was too tight and left every concurrent birth AMBIGUOUS with nothing stamped; 60px had been too loose and cross-wired). New windows are identified by set-diff, then the one nearest my unique birthLeft is mine
adom-wiki pkg install adom/[email protected]Fix cross-wired taskbar identity John caught (fusion and nb resolved to the SAME hwnd, so one thread stamped its AUMID onto the other's window and the loser stayed a grouped raw-Chrome button while a pup tile showed no overlay): the birth-time hwnd capture is now a SET-DIFF (snapshot window handles before createTarget, the NEW off-screen handle not present before and not already owned by any session is ours by construction) instead of a coordinate match whose 60px tolerance overlapped the 40px birth spacing; concurrent births disambiguate by the unique birthLeft with an 18px tolerance; and a hard guard rejects any handle already owned by another live session at every resolution path (birth, geometry, off-screen re-capture) so two windows can never share one handle
adom-wiki pkg install adom/[email protected]Let the off-screen re-capture run even while a window is in the geometry-resolution backoff (the backoff only suppresses the geometry hammering, not the definitive re-capture that actually fixes the bare window), with a 30s per-window cooldown so it moves the window at most once per half-minute
adom-wiki pkg install adom/[email protected]Self-heal bare BACKGROUND pup windows that have no birth handle (opened before the 2.0.31 fix, or re-attached by recovery/drag-out) on a crowded shared profile where geometry cannot disambiguate: as a last resort the resolver briefly moves the window's own CDP target to a unique far-off-screen slot, enumerates to grab the window now at that exact coordinate (unambiguous identity by construction), then restores it on-screen at z-bottom and re-parks. Invisible because the window is already background z-bottom, and never done to a window the user is using. Gives an on-screen window the same reliable handle a birth-time window gets, so its AUMID and overlay finally paint
adom-wiki pkg install adom/[email protected]Fix raw-Chrome taskbar icons on pup windows, the regression from removing the title tag: killing the title tag in 2.0.24 silently removed the shared-profile fallback that BOTH the identity stamp (titleContains) and hwndBelongsToPup (v1.9.350 title-ownership proof) relied on, so any window whose hwnd did not resolve got no AUMID and no overlay and showed a raw flashing Chrome button. Fixes: (1) birth-time hwnd capture now matches the window by its UNIQUE off-screen birth position instead of by pid membership, which was empty for the shared adom-you Chrome process whose real pid is untracked; (2) hwndBelongsToPup now trusts a birth-captured handle as proof of ownership by construction, no title and no pid tracking needed, and learns the pid so sibling windows on the shared process pass instantly. Identity and overlay no longer depend on the title tag at all
adom-wiki pkg install adom/[email protected]Fix the jump-list tasks broken by the 2.0.28 ownership gate: a click on a pup window's own taskbar jump-list is the USER operating their own window (caller aiThread user-taskbar-menu) and is always sanctioned, so it bypasses the ownership gate, the omitted-sessionId active-window resolution, and the dead-session hard error; and pup_close with no sessionId is the global close-all by design and is never gated or resolved to the active window. The Close ALL task, the Owned-by info card, and both wiki view-switch tasks all work again
adom-wiki pkg install adom/[email protected]Close issue 42, the wiki sign-in race across shared-profile pup windows: auto-sign from the desktop wiki token now runs for the shared adom-you profile on ANY adom URL that is not the deliberately-anonymous public or isolated view, not only when wikiView:authed is explicitly requested, so a fresh window whose shared cookie has not landed yet no longer paints signed-out while its siblings show signed-in; it fires only on a definite 401 (never a probe timeout) so an already-signed-in window is never re-navigated, and it schedules an overlay repaint so the taskbar hover thumbnail drops any cached signed-out frame
adom-wiki pkg install adom/[email protected]Close issue 41, the isolation hole the nb thread caught that masqueraded as a cross-thread takeover: a verb naming a DEAD sessionId now hard-errors with session_not_found and the live-session list instead of silently falling back to another thread's active window, and per John's ai-thread model the activeSessionId implication is deleted from every session-targeting verb: omitted sessionId resolves to the CALLER THREAD's own window (the shared ai-thread-slug keying pup_open_window uses, or the single window the thread owns by explicit name), with a teaching error when the thread has none or several; the ownership gate also now covers resolved targets, not just explicitly named ones
adom-wiki pkg install adom/[email protected]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
adom-wiki pkg install adom/[email protected]Stop fighting the user for the window: the post-open re-assert timers called the z-bottom primitive with force (needed for Chrome PDF self-activation pops) which also demoted a window the USER had just raised from the taskbar, because the session-flag guards lag the click by seconds. The primitive now checks GetLastInputInfo in the same PowerShell pass: OS-foreground plus user input within 5s means a human raised it, so it returns user-foreground instead of bottoming even under force; a PDF self-pop with idle hands still gets demoted. All re-assert and park callers stop retrying on that signal and mark the session userActive so every later demotion timer skips it for 10 minutes
adom-wiki pkg install adom/[email protected]One visible taskbar mutation per window open instead of three, from John watching the button live: the create-time identity stamp fired before session registration so its result was never recorded and the post-park re-brand recreated the button again with the identical appId (pre-registration stamps are now remembered and adopted at registration so the second stamp truly no-ops), and the favicon overlay no longer races onto the still-Chrome button just to be wiped by the stamp (young windows defer overlay until identity lands, stamp-once then overlay-once, with a 30s grace so an unstampable window is never left bare)
adom-wiki pkg install adom/[email protected]Title mangling fully dead, completing what John asked when the jump-list owner task shipped: the three legacy always-on title-suffix injectors (launch path, adopted-tab retag, post-navigate) predated the titleTag setting and kept appending the ai-thread/profile suffix with their own observers; they now stamp only the invisible window.name carrier and strip legacy tags, installing nothing and observing nothing. Ownership is conveyed solely by the jump-list Owned-by task and the pup_window_info native card
adom-wiki pkg install adom/[email protected]Zero synchronous PowerShell: all 7 remaining execFileSync window-management helpers (idle probe, foreground reads, force-activate, the three backgrounding paths, z-bottom, flash-clear) are now async with every call site awaited, so pup's event loop can never again stall on a powershell spawn and starve ab's health probe (the ab61 reap trigger); the sync runner carries a do-not-add-callers tombstone until ab ships native window verbs and PowerShell is deleted outright
adom-wiki pkg install adom/[email protected]Caption card copy polish: replace em-dashes with middots in the pup_window_info native card per the house style for user-facing copy
adom-wiki pkg install adom/[email protected]Ownership conveyed the way John designed it instead of title mangling: every pup window's jump-list now leads with an 'Owned by: ' task, and clicking it runs the new pup_window_info verb, which paints a native always-on-top click-through caption card just above the taskbar (ab desktop_caption, 12s auto-dismiss) showing the owning thread, container, profile, tabs, window age, last agent action, and any takeover history; the verb also returns the same info as JSON for AI callers and is read-only and never owner-gated
adom-wiki pkg install adom/[email protected]Hotfix for the frozen-window regression John hit within the hour: revert the titleTag default to off (the v2.0.19 flip re-armed the documented title-observer ping-pong that pegs renderers and froze hd-publish-1.0.0), harden the opt-in observer to only ever watch a real title node instead of the whole document subtree on titleless pages, and make takeover:true on one-shot verbs act without stealing ownership so a sanctioned repair reload does not lock the original thread out of its own window
adom-wiki pkg install adom/[email protected]Hard window ownership keyed on caller identity: every window-mutating verb naming an explicit sessionId is refused with session_owned_by_another_thread when that session belongs to a different AI thread (the old gate compared only the optional args.owner field and covered just navigate and close, so undeclared callers could take over other threads' windows, the kicad-vs-nb incident John caught); takeover:true is logged with both thread names and reassigns ownership. Ownership is now user-visible too: the ai-thread title tag defaults on so taskbar hover and Alt-Tab name the owner, and the jump-list header carries the owning thread
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Negative-result backoff on window-handle resolution: a shared-profile window that cannot be disambiguated was re-probed with PowerShell EnumWindows passes on every overlay, park, and flash touch, forever; three straight misses now put that session on a 5-minute resolution cooldown (any real handle landing clears it). Ends the hot loop that burned laptop CPU and blocked the event loop so often that ab's 1500ms health marker probe timed out against a live bridge, judged it unhealthy, and reap-looped it, the other half of the 557 flap
adom-wiki pkg install adom/[email protected]EADDRINUSE self-heal for the 557 permanent-outage loop: when a replacement pup spawn finds its port held, it probes the holder's /health and, only if the holder identifies as a sibling pup bridge (by definition an orphan ab lost track of), kills that one pid and retries the bind with a 3-attempt cap; a non-pup holder is never touched and the process exits with a clear log. Turns the reaper-lost-my-pid outage from a manual taskkill into automatic recovery on the next verb
adom-wiki pkg install adom/[email protected]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
adom-wiki pkg install adom/[email protected]Guidance shim for the browser_* to pup_* clean break: pup re-claims the browser_ prefix and answers every old-verb call with a verb_renamed error naming the exact pup_* replacement (nothing executes, no aliasing), so broken callers self-migrate instead of following the misleading not-installed hint into a reinstall; nbrowser_* unaffected
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Overlay/HWND fix: resolve a window's OS handle by its unique (ai-thread: sid) title tag whenever it returns exactly one match, regardless of the titleTag setting. Fixes shared-profile windows (e.g. a 13-tab bridge-pages) that the geometry wiggle left ambiguous, so their taskbar overlay finally paints.
adom-wiki pkg install adom/[email protected]Freeze the jump-list on the first commit to the real category appId (not a beat later), collapsing the settle rebuilds too. Completes option B: one taskbar commit per window, then frozen.
adom-wiki pkg install adom/[email protected]Freeze the jump-list too (option B): once a window's menu is committed to its frozen identity, never rebuild it on later view/active-tab changes. Completes the stamp-once-then-freeze so multi-tab windows produce ZERO taskbar rebuilds after settle.
adom-wiki pkg install adom/[email protected]Stamp-once-then-freeze taskbar identity (option B): after a per-session window is branded with its first real category, freeze the appId so later category changes (e.g. adding a web tab -> mixed) never recreate the taskbar button, jump-list, or overlay again. Zero multi-tab churn; tile may be slightly stale by design.
adom-wiki pkg install adom/[email protected]Jump-list multi-tab churn: reset the debounce timer on every request so a multi-tab open (auth flip + tab-add) commits the menu ONCE after it settles, instead of rebuilding 2-3x.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]v1.9.350: fix missing taskbar favicon overlay on the shared adom-you profile. The ownership guard (hwndBelongsToPup) refused every badge because the shared Chrome process pid was absent from the tracked pid set; now a pup window's unique ai-thread title tag confirms ownership and learns the owner pid onto the browser entry so sibling windows self-heal, while Edge and non-pup buttons stay protected.
adom-wiki pkg install adom/[email protected]Overlay badge refinement (John): drop the teal border (it wasted space and shrank the favicon). The favicon now sits on a full-bleed dark card the tone of the Windows taskbar (#202124), inset only 2px so it stays as large as possible (44/48) with a thin visible dark margin. Transparent favicons still get a clean backdrop; no border eating pixels.
adom-wiki pkg install adom/[email protected]Taskbar icons (John): remove the notch from the base tile — it is a FULL solid icon again — and move the 'background' onto the OVERLAY badge where it belongs. The overlay favicon now sits on a solid dark, teal-edged rounded card (composited behind it at 48px), so transparent site favicons no longer look bad painted onto the tile; every badge reads as one clean unit. PUP_ICON_GEN i6->i7 so Windows recreates the buttons with the un-notched tile.
adom-wiki pkg install adom/[email protected]Fix bridge instability on heavy pages (John: a heavy page should never crash the bridge; CDP mishandling). neutralizeDebugger kept Debugger.enable on for every tab's whole life, which streams a Debugger.scriptParsed event for every script the page parses — thousands on a heavy Babylon.js bundle — flooding the bridge's single event loop and de-opting V8; under concurrent heavy-page opens the loop starved and AD couldn't reach the bridge (error sending request). Now it disables Debugger right after clearing any inherited pause and detaches the session: freeze immunity kept (a page debugger; is a no-op with no client holding the domain), flood + de-opt + per-tab session leak gone.
adom-wiki pkg install adom/[email protected]Steer all pup windows to the shared adom-you profile (John): a thread passing its own named profile (nameplates, np-verify, nsf-draft) fragmented the doppelganger identity — separate login jar, no shared adom-you logins, no adom-you frame color. Now, outside genuine throwaway isolation (isolated:true / webSecurity:false / wikiView:public), any custom profile name is overridden to adom-you and the override is surfaced as _profileSteered in the response. A named {profile} no longer creates a separate durable jar; use isolated:true for a private throwaway.
adom-wiki pkg install adom/[email protected]Pup window frame color changed from bright teal (20,184,184) to the Adom near-black ground #0d1117 (13,17,23) per John: the teal was 'a bit ugly', wanted something closer to black but on-brand that still color-codes pup/adom-you windows as distinct from the user's real Chrome profiles. Applied via --install-autogenerated-theme on the adom-you (DEFAULT_PROFILE) launch.
adom-wiki pkg install adom/[email protected]Fix owner-chip toggle timeout: applyOwnerChipSetting awaited page.evaluate on every tab with no bound, so one slow/wedged page (a heavy 3D-viewer tab) hung the whole sweep and browser_set_identity/ownerChip toggles timed out. Each per-page evaluate is now raced against a 1.5s timeout, and browser_set_identity fires the repaint non-blocking, so toggling the chip on/off never hangs on a busy window.
adom-wiki pkg install adom/[email protected]Show the user's Adom identity in the floating owner chip: since Chrome's own profile chip cannot take a custom local image (Google sign-in only), the owner chip now leads with the user's Adom avatar + name. New verb browser_set_identity {avatarB64,name,enabled,clear} stores the identity in pup-settings and repaints live windows. Owner-chip injection (attachTab) and the live-apply path both render the round avatar; falls back to the hexagon glyph when no identity is set.
adom-wiki pkg install adom/[email protected]Fix multi-monitor park overflow: a freshly opened pup window is launched off-screen then parked by reading screen.availWidth/Height, which reflects whichever monitor the window momentarily sits on. On a multi-monitor setup that could size the window for a LARGER monitor while it lands on the smaller primary, overflowing off the bottom-right so page content past the fold was unreachable until the slow 120s placement sweep re-parked it. placeOnScreen now settles then re-reads the destination monitor's work area and re-clamps immediately if it differs, so a window is never left bigger than the screen it is actually on.
adom-wiki pkg install adom/[email protected]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.
adom-wiki pkg install adom/[email protected]adom-you visual identity: name the shared profile 'Adom' and tint every adom-you window frame+toolbar Adom-teal via --install-autogenerated-theme (always-visible, no sign-in, no nag). Removed the gaia-picture avatar spoof, which rendered a generic gray chip AND a permanent 'Action required' nag on local profiles.
adom-wiki pkg install adom/[email protected]No more generic-globe flash: applyAppOverlay caches the last REAL favicon per session (keyed by URL) and reuses it instead of downgrading to the generic globe when a same-page repaint can't re-fetch the favicon (the post-re-stamp case). Gated on unchanged URL so a real navigation to a truly faviconless page still falls through to the generic glyph. Runtime-only, no icon-gen bump / no re-stamp.
adom-wiki pkg install adom/[email protected]Generic-overlay recovery cooldown 90s->10s: after an icon-gen re-stamp recreates buttons, overlays fall to the generic globe momentarily; the enforcer now re-fetches the real favicon within ~10s instead of leaving every window on the ugly generic globe for 90s+. No icon-gen bump (no re-stamp).
adom-wiki pkg install adom/[email protected]Remove the baked Adom-mark from the notch (John: it sabotages the clean-background purpose and bleeds through the transparent overlay favicon). The notch is now a clean EMPTY transparent cutout so the taskbar shows through behind the overlay; overlay presence is guaranteed by the 4s enforcer + event triggers, so no fallback mark is needed. Bumped icon gen i5->i6 to regenerate mark-free tiles + re-stamp.
adom-wiki pkg install adom/[email protected]Force ai-thread name as the session owner (John: 'sick of seeing sessionid, force ai-thread now'). browser_open_window now resolves the owner from the calling ai-thread (X-Adom-Caller-Thread header / args.caller.aiThread / args.aiThread); the sessionId is NEVER an identity fallback anymore (removed the auto- stopgap). An open with neither an ai-thread nor an explicit owner is REFUSED with caller_identity_required + the --ai-thread remedy. owner=ai-thread, and ownerSource now correctly reports caller-identity. SKILL.md updated: ai-thread is the owner, owner: arg is a legacy alias, sessionId is just the window key.
adom-wiki pkg install adom/[email protected]Batch-fix 8 open wiki issues. #434: shared-Chrome kill now checks live sessions+in-flight verbs on the profile (not the drift-prone refCount) so it can't kill Chrome out from under a live session. #437: wait-for-focus caption backs off (max 3 shows then silent), gated on fgCaption + honors fgCaptionMs (no more permanent nag). #435: add --disable-session-crashed-bubble/--hide-crash-restore-bubble so a crashed shared Chrome never restores dead-session tabs into the wrong window. #425: findTabForTarget resolves iframe/OOPIF-originated target=_blank popups by opener-frame URL (unique match) so they adopt as tabs. #338: sessions are never unowned (synthesize a stable auto- owner) closing the no-caller-identity ownership hole. #293: raceCrash trims the last 20s hang when an in-flight screenshot/eval races a renderer crash (detection+fast-fail already existed). #350: adCommand caller shorthand + sessionCaller forwards reason (chokepoint already forwards X-Adom-Caller-* + Delegate:pup). #280: self-install now sets PUPPETEER_SKIP_DOWNLOAD so it never hangs on the failing CfT fetch (self-heal already existed).
adom-wiki pkg install adom/[email protected]Fix wiki #468 (Drew: pup 100% unusable, 'never bound its port'). ROOT CAUSE: the heavy native requires (puppeteer, keytar via credential_vault, sharp, and chrome.js which itself requires puppeteer) ran synchronously at module load, blocking the event loop ~8s before the HTTP port could bind — long after AD's recover_not_listening reaps a not-yet-bound bridge (~2-3.6s). FIX: defer all four out of the sync module-load path into ensureHeavyInit(), which runs in the listen callback AFTER the port binds (recover_not_listening is a TCP listen check, so the post-bind load is safe) plus lazily on the first non-/health request. /health needs no heavy module (chrome.readiness guarded). Port now binds in <1s.
adom-wiki pkg install adom/[email protected]Notch margin symmetry (John: 2px cutout on the left of the overlay but only 1px below - unprofessional). The inner (bottom-left) corner radius curved the notch inward where the favicon's bottom-left sits, eating the bottom margin while the straight left edge kept its full margin. Dropped the inner-corner radius to near-sharp (rx 11% -> 2%) so both the left and bottom cutouts are uniform straight edges = even margin around the overlay. Bumped PUP_ICON_GEN i4->i5 so live buttons re-stamp with the new geometry.
adom-wiki pkg install adom/[email protected]Fix: the 'Switch to logged-in view' jump-list task did nothing. browser_wiki_set_view short-circuited with unchanged:true (only bringToFront) whenever pup BELIEVED the window was already in the requested view — but the task promises a harmless reload and pup's view belief is unreliable (default-authed may not have actually signed in; cookies expire). Now a real USER click (caller aiThread user-taskbar-menu) ALWAYS re-asserts the view via the mint/navigate path (a genuine reload that guarantees signed-in), instead of skipping. Programmatic same-view calls still short-circuit.
adom-wiki pkg install adom/[email protected]No redundant Adom mark on the overlay when AUMID is ON (John: the teal category tile is already the 'Adom controlled' indicator). The favicon overlay now carries the Adom mark ONLY when aumidIcons is off (plain Chrome base needs the branding); when AUMID is on the overlay is the clean site favicon alone. Cache key now includes AUMID state so the badge recomposes on toggle.
adom-wiki pkg install adom/[email protected]Fix: notch never appeared on the LIVE taskbar button. The icon FILES changed (added the notch) but PUP_ICON_GEN was not bumped, so the AUMID appId stayed the same and Windows kept the un-notched button it baked at creation (it never re-reads an icon for an unchanged appId; only a new appId forces a fresh button). Bumped i3->i4 so every window re-stamps with the notched tile. Also: notchedIconPath now serves the cached notched icon as soon as it exists on disk (not only after this run's build), so a respawn re-stamps notched immediately instead of flashing the un-notched tile.
adom-wiki pkg install adom/[email protected]Overlay GUARANTEE hardening + graceful notch (John: bare window = broken-looking empty notch; overlays must always be present). ROOT CAUSE of missing overlays: applyAppOverlay REFUSES to paint when it can't confirm the window's hwnd (the Edge-protection guard), and your AD rebuilds constantly respawn+re-adopt windows, forcing hwnd re-resolution and transient bareness. Fixes: (1) baked a small Adom-mark fallback into the notch so a bare window shows a tidy branded corner, not a hole; (2) enforcer sweeps every 4s (was 10s) with a 4s bare cooldown (was 20s) so a bare window heals in seconds; (3) enforcer no longer SKIPS the overlay paint when a base-tile re-stamp is pending (they're independent now).
adom-wiki pkg install adom/[email protected]Notch shape fix (John: overlay favicons are SQUARE, not circles). The notch was a rounded-rect with a 30%-of-side radius, which rounds all four corners into a circular blob. Overlays are square (favicon fills 48x48 + Adom mark corner), so the notch is now a SQUARE: the mask rect extends past the top and right edges so those corners fall off-canvas and only the inner corner is rounded, giving a clean square opening flush to the tile edges. Cache path bumped (-sq) to regenerate.
adom-wiki pkg install adom/[email protected]Notched category tiles (John's idea): punch a transparent rounded notch into the UPPER-RIGHT of each pup category .ico so the favicon overlay AD paints there sits on the clean taskbar background instead of the busy teal art. Generated at bridge runtime (sharp, desktop-only) into a cache dir via a minimal PNG-frame ICO encoder (format validated); baked into the static tile so there's NO per-window/per-favicon churn, only a one-time re-stamp. pupIconPath serves the notched copy once built. Notch geometry (50% upper-right) tuned live.
adom-wiki pkg install adom/[email protected]Taskbar favicon overlay fix (John: icons still wrong). ROOT CAUSE: the badge compositor decided ICO-vs-image by the favicon URL ending in .ico, but analyzeIconBytes had already re-encoded it to PNG, so icoLargestPng ran on PNG bytes, returned null, and dropped the favicon -> bare Adom mark (hit Google Docs and any .ico-suffixed favicon). Now sniffs the real magic bytes. SECOND bug: the generic-glyph fallback set src but never populated iconPng (which is the only thing the composite draws), so undecodable favicons also went mark-only; now it renders the glyph into iconPng and marks src.href generic so the LED shows amber, not a lying green.
adom-wiki pkg install adom/[email protected]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.
adom-wiki pkg install adom/[email protected]Overlay drift fix: the favicon taskbar badge now recomputes on the NAVIGATION EVENT (framenavigated), not just on explicit mutating verbs. Any nav pup didn't initiate — JS redirect, meta refresh, form submit, SPA route change, OAuth bounce, in-tab link click, browser_login submit — previously left a STALE badge; now every navigation from any source re-triggers the recalc (debounced, honors overlayBadges pref, active/visible tab).
adom-wiki pkg install adom/[email protected]Dashboard Settings: 'Import logins from Chrome/Edge' picker (adom-you seed). Reads browser_import_scan, lists every discovered profile with source-account identity tags + saved-login count + ABE lock, checkbox each (default all). Import button reports honest-pending until the AD-core elevated decrypt helper (adom/adom-desktop #51) lands.
adom-wiki pkg install adom/[email protected]browser_import_scan: read-only discovery verb for the comprehensive credential import — enumerates every Chromium profile (Chrome/Edge/Brave) with source-account identity tag, saved-password count, and ABE status; foundation for the Settings import picker. Actual decryption is AD-core (adom/adom-desktop #51).
adom-wiki pkg install adom/[email protected]Make GROUPED mode actually group by category (John: 'i like that you just group to each category icon'): with icon-style category, windows of the same category share one AUMID (Adom.Pup.) so you get up to 5 category buttons each wearing its category icon; standard style still collapses to one Adom Pup button. Previously grouped lumped every window under one button regardless. Updated the setting copy
adom-wiki pkg install adom/[email protected]Fix jump lists not clearing when toggled OFF (John: 'i turned off jump lists but still see them'): turning jumpLists off now commits an EMPTY task list to every window (removing the menu tasks); toggling jumpLists on or the sub-prefs forces a re-commit so changes show live. Wired jumpLists/jlViewTasks/jlCloseAll to refreshAllJumplists()
adom-wiki pkg install adom/[email protected]Correct the jump-list setting copy: remove the stale 'Windows 11 bug keeps tasks off the menu' claim (tasks appear now); note it requires AUMID on and the honest first-click-blip / right-click-again quirk
adom-wiki pkg install adom/[email protected]Replace the fake jump-list settings screenshots with REAL ones: captured the actual Windows jump-list flyout (double right-click for the blip) showing the live tasks, and cropped it into jumplist.png (full menu), jlviewtasks.png (the two Switch-to-view rows), jlcloseall.png (the Close ALL task). The AUMID/grouping/icon-style screenshots are untouched
adom-wiki pkg install adom/[email protected]Reduce the jump-list first-right-click blip: stop forcing a redundant CommitList ~1.6s after every stamp (jump lists live on the AUMID and were already committed at stamp time; the re-commit only gave the shell another chance to dismiss a just-opened flyout). Dedup-respecting now. Residual ~200-300ms blip is a shell/AD race (documented in dev-skills/pup-jumplist)
adom-wiki pkg install adom/[email protected]Dashboard shows wiki login state per wiki window (John: 'why doesn't the dashboard say if i'm logged in to the wiki'): each pup window on an Adom wiki URL now gets a 'wiki: signed in' (green) or 'wiki: public' (warn) badge, from the _wikiAuthed state pup already tracks
adom-wiki pkg install adom/[email protected]Wiki pages open LOGGED IN by default (John's request): for an Adom wiki URL with no wikiView, default to authed (auto-signs from the desktop token, no prompt); pass noAutoLogin:true (or wikiView:public) for the anonymous/public view. Hint tells the AI it was logged in by default and how to opt out
adom-wiki pkg install adom/[email protected]Fix jump lists never committing: the registration guard required the appId in _registeredPupAumids, which is only filled by desktop_register_app_identity (a silent no-op on this AD build), so updateWikiJumplist returned before every commit and then dedup-skipped forever. Register best-effort, never block the commit; the window stamp already binds the AUMID and the commit works with hwnd
adom-wiki pkg install adom/[email protected]diag: log jump-list gate conditions to find why updateWikiJumplist returns before committing
adom-wiki pkg install adom/[email protected]Fix jump lists not working: updateWikiJumplist resolved its hwnd by title (desktop_find_window titleContains) which is null when the title tag is off, so payload.hwnd was never set and the jump list never committed to the window. Use the reliable birth-time/persisted handle instead. The 'known Windows 11 bug' was this title lookup
adom-wiki pkg install adom/[email protected]Stop the dashboard refresh blip: badge image URL was cache-busted with SNAP.ts (new every SSE tick) and served no-store, so every icon refetched a couple times a second. Version the badge URL by its actual paint time and make badge + tab-favicon endpoints cacheable, so icons only reload when they truly change
adom-wiki pkg install adom/[email protected]Recovered windows restore their persisted OS handle on the rescan adoption path too (not just recoverSessions), so a multi-window-profile window that lost its handle to a respawn goes green from the saved handle instead of red now that the wiggle is gone
adom-wiki pkg install adom/[email protected]PERMANENT fix for title-based window lookup (John: stop duct-taping it): add windowTarget() helper that returns the validated HWND, and route every AD window OPERATION (park z-bottom, taskbar overlay/progress/badge, thumbnail, screenshot, focus) through it so hwnd is primary everywhere; titleContains survives only as a cold fallback. Also delete the destructive width-wiggle
adom-wiki pkg install adom/[email protected]Delete the destructive width-wiggle: it shrank windows to a marker width to identify them and left one stuck narrow when the restore failed (deformed John's window). Handle resolution now uses only read-only signals (birth-time capture, persisted handle, sole-window-of-profile); a window none resolve is left bare rather than resized
adom-wiki pkg install adom/[email protected]Fix AUMID stamp failing on windows without a title tag: stamp by resolved HWND (same handle the overlay paint + flash use) instead of only titleContains, which could not find the dashboard window (no ai-thread tag) so it never stamped when AUMID was turned on
adom-wiki pkg install adom/[email protected]Fix dashboard-vs-taskbar mismatch (revert the wrong 1.9.298 assumption): with aumidIcons off, live pup windows wear the Chrome-for-Testing exe icon + pup overlay, NOT a teal tile (proven by flashing the live windows). The teal tiles on the taskbar are GHOST buttons from dead AUMID-stamped windows. Dashboard now draws the real Chrome-for-Testing base icon for un-stamped windows, teal only when actually stamped, so it matches the glass
adom-wiki pkg install adom/[email protected]Fix sleep/wake window loss: the 8s reaper was racing sleep-recovery and killing recovered windows. On wake, rescan reattaches a page then prunes it as the dead pre-sleep tab, leaving the session at 0 tabs with _lostBrowser already cleared, so the reaper deleted it before the healer relaunched. Now: re-mark any post-prune empty session as lost + refresh its heal window; the reaper never reaps a session the healer is still trying to recover (until it explicitly gives up)
adom-wiki pkg install adom/[email protected]Birth-time handle resolution: each new window is born at a unique off-screen position and its OS handle captured while off-screen and small (before park maximizes it), the only unambiguous moment for a same-profile window; the resolver trusts this birth handle ahead of all geometry heuristics. Finally resolves multi-window profiles the width-wiggle never could
adom-wiki pkg install adom/[email protected]Reliable wiggle-free handle resolution: a profile process with exactly one window resolves to that window directly (works on maximized windows, which the width-wiggle never could); multi-window profiles still leave bare rather than guess until birth-time resolution lands
adom-wiki pkg install adom/[email protected]Make window-handle resolution conservative (correct-or-bare, never wrong): raise the wiggle serialization timeout above the enumeration time so concurrent wiggles cannot collapse multiple windows onto one handle; use a distinctive narrow marker width real windows never sit at; verify the width actually applied; require EXACTLY ONE match or leave the window bare rather than paint a guessed/shared handle
adom-wiki pkg install adom/[email protected]Kill overlay drift at the source: one centralized debounced overlay re-sync now fires for every mutating verb (navigate/reload/back/forward/switch_tab/click/type/eval) plus close_tab/close_window, clearing the favicon cache and repainting via the ungated applyAppOverlay (refreshWindowChrome was a no-op under minimalTouch), without touching the cached handle so no routine verb triggers the wiggle
adom-wiki pkg install adom/[email protected]Fix window-handle desync + stuck regenerate: time-box the width-wiggle lock so a hung holder cannot deadlock the whole chain (was leaving every window hwnd=None); persist the resolved OS handle to the session file and restore+validate it on respawn so windows stop re-wiggling after every ship; regenerate button preempts a wedged busy flag, per-window timeouts, and always clears the flag
adom-wiki pkg install adom/[email protected]Regenerate-overlays button now runs the sweep in the background and answers instantly (dashboard icons update live via SSE); header shows regenerating/last-sweep status; per-window drift report logged
adom-wiki pkg install adom/[email protected]Dashboard taskbar strip now shows the teal pup tile for every pup window (matching the real taskbar) instead of Chrome's exe logo for un-stamped windows; add a Regenerate All Overlay Icons header button that re-runs the from-scratch overlay algorithm on every window and reports which windows drifted
adom-wiki pkg install adom/[email protected]Fix missing taskbar overlay: hwndBelongsToPup now requires a real top-level visible Chrome_WidgetWin_1 frame, not just any window owned by the profile process. A stale same-process utility handle (18) was passing the pid-only check forever, so overlays painted onto a non-taskbar window and never appeared
adom-wiki pkg install adom/[email protected]Fix duplicate tab on burst opens: the popup-tracker was double-attaching pup's own in-window window.open blanks (which addTabToSession already adopts); it now skips any tab tagged with the pupclaim_ window.name marker
adom-wiki pkg install adom/[email protected]Fix in-window tab adoption: identify the window.open tab by a unique per-call window.name marker instead of set-difference, which under a burst of adds could adopt the wrong new target and duplicate tabs
adom-wiki pkg install adom/[email protected]Fix orphaned about:blank tabs: adopt the window.open tab by target set-difference instead of a racy opener match, which used to leave a stray blank tab beside the real one whenever the anchor page was mid-navigation
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Serialize the width-wiggle resolution so it is actually unique (1.9.290 collapsed everything onto one hwnd because the enforcer fires resolves CONCURRENTLY - their width changes and window enumerations overlapped, so every session matched whichever window was momentarily at a marker width). A global lock now guarantees exactly one wiggle (set unique width -> enumerate -> restore) runs at a time, with the lock released on every path including the error path (hoisted release handle so the outer catch frees it - no deadlock).
adom-wiki pkg install adom/[email protected]Robust observer-proof window resolution via UNIQUE-WIDTH WIGGLE (finally kills the dup-hwnd bug for all windows, clean titles kept). With titleTag off, the transient-title approach was fought by each page's own title observer (un-disconnectable on pre-1.9.288 pages), so same-profile windows parked at the identical rect collapsed onto one hwnd. New approach: when the tag is off, pup gives the window being resolved a UNIQUE width via CDP Browser.setWindowBounds (pup controls this directly, no page script can fight it), matches the one OS window at that exact width, then restores - deterministic and unambiguous even for many same-profile windows. Guarded to never resize a foreground window the user is looking at (falls back to plain bounds there); the window is off-screen during most resolves so the width change is invisible. Title-tag-ON path still uses the exact persistent-tag find. Together with the reconciler's duplicate-hwnd self-heal (clears any shared cache to force re-resolve), every window binds to its own unique handle.
adom-wiki pkg install adom/[email protected]Duplicate-hwnd self-heal: the reconciler now detects any OS handle claimed by more than one live session and clears the cached hwnd on all of them, forcing each to re-resolve to its own unique window (reliable now that 1.9.288 stopped the tag-strip observer from fighting the transient resolution). This corrects stale wrong-hwnd caches that per-profile validation cannot catch (two windows of the same Chrome process), so John's wildlife-compare/haircut-review shared-handle case self-heals within a sweep instead of persisting. Verified: two fresh same-profile windows resolve to distinct handles.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Issue #22 (AdityaAngajala) — session ownership is no longer opt-in. His Finding 1: owner was an optional self-asserted string, so the one real session on his machine, driven actively for 43 minutes by another agent, reported owner:null and had no protection at all; the guard that protects a busy window was opt-in and the real session had opted out by omission. The issue named the blocker as 'relayed commands carry no caller identity, so owner can only ever be a self-asserted string' — that blocker is gone: AD 1.9.180+ sends X-Adom-Caller-* and pup already binds _ownerThread from it. Now the advisory owner field is backed by that AUTHENTICATED identity whenever the caller did not declare one, both at session creation and on any later verb, so a session is owned from birth instead of when someone remembers to ask. Adds ownerSource ('declared' vs 'caller-identity') to browser_status and browser_list_windows so an agent can tell a self-asserted owner from an authenticated one. The cold-start double-claim race in his Finding 2 is NOT addressed here and the issue stays open for it.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Diagnostic: dump the exact composed badge PNG to disk plus the target (hwnd vs titleContains) before handing it to AD, so the composite can be INSPECTED rather than inferred from a screenshot. Four successive theories about the unpainted first taskbar button were wrong (SVG rasterisation, code-not-running, duplicate sessions, the composite cache); this measurement splits the problem cleanly — if the PNG contains the generic icon then the compositor is exonerated and the fault is delivery to that specific window.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Revert the invented badge placeholder (John: the teal tile was 'hideous', and a full-size Adom logo — 'no it shouldn't'). The badge design is the TAB'S OWN FAVICON with the mini Adom mark inset, full stop. When there is no usable favicon pup now paints NO overlay and logs why, instead of substituting a tile or a blown-up logo. Recorded in the code where it matters: the window that keeps hitting this branch DOES have tabs with real favicons (registration.hanover.com) — it reports 'no favicon anywhere in this window' only because duplicate sessions have split one window's tabs across several session objects, so the session painting that taskbar button can only see the PDF tabs. Fixing identity resolution (HWND instead of the title tag Chrome's PDF viewer cannot carry) removes the cause; inventing placeholder art was papering over it.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Harden crashed-renderer recovery: respawnCrashedRenderer is now race-safe (one respawn per page; the auto-heal and a manual reload/navigate can no longer collide into a hang) and every CDP call is hard-timeout-bounded, so a crashed target can never wedge the verb. browser_reload now reports tab_renderer_crashed_unrecovered with a close+reopen hint when the in-place respawn cannot recover (e.g. Chrome too memory-pressured), instead of falsely claiming success. Follows the 1.9.176 fix where the recovery could hang under a concurrent auto+manual respawn.
adom-wiki pkg install adom/[email protected]Recover crashed renderers ('Aw, Snap! Out of Memory'). A crashed renderer detaches the page's main frame, so browser_reload/browser_navigate threw 'detached Frame' — the recovery the crash hint promised could not actually run, leaving the window stuck on the Aw-Snap page. New respawnCrashedRenderer() drives the raw target with Page.navigate to spawn a fresh renderer in the same tab/window/session; browser_reload and browser_navigate now use it (both when the tab is flagged crashed and as a fallback when they hit a detached frame). Plus the renderer crash detector AUTO-heals the tab once (an Aw-Snap tab is already dead, so respawn loses nothing), reporting via the cleanup queue, capped at one attempt to avoid a reload-crash loop. Surfaced by John hitting an Aw-Snap on a shared-profile wiki window after back-to-back heavy tests piled memory into the one shared Chrome.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Audit columns for the standard test table (John: 'put a column for how many times you triggered an orange flash, and another for if you triggered a progress bar in windows taskbar' + 'and how long that prog bar ran'). Every browser_list_windows entry now carries flashCount (both flash paths counted), progressBarCount (times the agent-activity taskbar progress bar engaged), and progressBarMs (total time it ran, live-inclusive if currently running) — so the post-open table proves the window's full attention footprint (flash, progress, overlay, geometry) from one call, no log scraping.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Background windows are BORN off-screen again (John: 'you keep opening pup windows on top of the one i'm working in ... it just happened for all those windows you opened'). Regression chain, owned: 1.9.135 removed the process-wide --window-position=-32000 launch default because it poisoned every window's RESTORE rect (the taskbar-click-shows-nothing bug) — but that default was also what made the birth moment invisible, so new windows started appearing at a visible position ON TOP of whatever the user had up (including the pup window they were working in) for the beat before the park pushed them to bottom-z. Fix: Target.createTarget now passes explicit per-window left/top -32000 for the one creation moment; the per-window unconditional park (1.9.138) immediately rewrites the normal rect on-screen with the inset frame at bottom z-order, so the restore-rect poisoning cannot recur (the park always lands, re-asserts at 2.5s, logs both attempts, and healOffscreenWindow sweeps any stragglers). Birth invisible, life on-screen at the bottom, reveal only on the user's click — the full contract.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]10px inset on every side of the work-area placement (John: 'reduce it by 10px on all sides so i can tell you literally did this purposely') — position = work area X+10,Y+10, size = work area minus 20 in each dimension. A pup window now sits visibly, deliberately framed inside the work area: taskbar never covered, a uniform 10px margin proving the geometry is computed, not accidental.
adom-wiki pkg install adom/[email protected]Park and window-sizing now use the primary monitor's WORK AREA instead of raw resolution (John: 'use the work area'). All four GetSystemMetrics(0)/(1) sites swapped for Screen.PrimaryScreen.WorkingArea, with position taken from the work area's X/Y — so a taskbar on ANY edge (bottom, left, top) is respected and no strip of a pup window ever hides behind it. Same behavior as a genuinely maximized window.
adom-wiki pkg install adom/[email protected]Drop --window-position=-32000 and --window-size from background launches (John: 'if --no-startup-window then stop fighting it'). With no-startup-window Chrome starts with NO window, so the off-screen position arg protected nothing on the main path — while silently poisoning every window Chrome itself creates (popups, target=_blank, restores) with an off-screen DEFAULT position, which is the likely mechanism behind windows found stranded at -32768 even after being foregrounded. Geometry now has exactly one owner: the park (on-screen, bottom z, full size, no-activate).
adom-wiki pkg install adom/[email protected]Emergency follow-up to 1.9.133, which shipped with a JS SYNTAX ERROR (a python-style # comment inside the PS-lines array — my parse check ran AFTER the ship gate instead of before, the documented patch/ship desync repeated). Also fixes the size John hit immediately: the CDP park kept 1280x800, so on-screen-parked windows appeared small; now near-fullscreen fallback at the CDP site and the SetWindowPos park corrects to the true screen work area right after. Park contract: on-screen, bottom z-order, no-activate, full size.
adom-wiki pkg install adom/[email protected]Background windows now park ON-SCREEN at the BOTTOM of the z-order instead of at -32000,-32000 (John's design, implemented immediately after the trap bit him twice in one hour: agenda-monday, then the gmail window whose taskbar click showed nothing). Both park sites changed — the CDP Browser.setWindowBounds park and the SetWindowPos park, which already used HWND_BOTTOM + SWP_NOACTIVATE so only the coordinates were wrong. Background still means: no focus steal, covers nothing the user works on (it is BEHIND everything). But the window is now always at real screen coordinates, so a user's plain taskbar click is pure native Windows foregrounding of a correctly-placed window — no pup code in that path, nothing to catch, the failure is structurally impossible. Known accepted tradeoff: bottom-z windows show in desktop peek. The -32000 launch-instant args remain as belt-and-suspenders for the pre-park moment only.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Clean up zombie sessions automatically and REPORT the cleanup to the next caller (John's design). Two parts. (1) Zombie detection was gated on _lostBrowser, a flag only set when a DISCONNECT EVENT fires — a Chrome killed outright (the bridge-restart tree kill) never emits one, so those sessions sat with 0 tabs, no flag, and were never dropped. That is exactly the four zombies John found cluttering browser_list_windows for every thread. Zero tabs plus a dead CDP port is now sufficient, with a _launchInFlight guard so a session mid-launch is never mistaken for one. (2) A cleanup REPORT QUEUE: each janitorial action (zombie session dropped, orphaned browser processes reaped) is recorded and attached to the NEXT verb response as _cleanupReport, then dropped — report-once. Per John, the receiving thread is usually NOT the one whose window was cleaned; that is accepted, it can ignore the note, and the information still reaches the user eventually instead of never. Verb-scoped so AD's health poll cannot swallow it, capped at 12 entries, and added to the output-merge list because anything left on the outer envelope is silently dropped on a SUCCESSFUL call.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Lint a malformed wiki URL and name the real cause, instead of letting the caller invent one. The HD build thread opened https://wiki.adom.inc/adom-wiki-skillpack, got 'Page not found', and reported to John that 'org pages are invisible to logged-out readers'. That conclusion was WRONG and cost trust: the window was signed in as John the entire time (pup's auto-login had worked), the page exists and is public, and the URL was simply missing its OWNER segment — wiki.adom.inc pages are owner-qualified as // (and ///blob/ for a file). pup already knew the URL 404'd and knew the host, so it could have named the cause. It now does: on a render failure, a new wikiUrlLint() detects a wiki URL with no owner segment (including the /blob/ form), suggests the corrected URL, tells the caller to confirm the real owner with 'adom-wiki page get ' rather than trust the guess, and explicitly says NOT to conclude anything about permissions or login until the URL is right and re-checked. Known non-page routes (apps, skills, components, discover, login, api, ...) are excluded. Unit-tested 6/6 against the thread's three real URLs plus valid controls.
adom-wiki pkg install adom/[email protected]Make a bridge upgrade REPAIR the jump-list task commands on windows that already exist. This is why John's 'Switch to public view' still failed after 1.9.115 fixed the command format: a jump-list task embeds a full CLI command line, and stampPupIdentity only re-commits the list when the appId CHANGES, so any window whose category was unchanged across the upgrade kept its OLD identity-less command and the click was refused silently — while the very same verb worked perfectly when I called it from the CLI, which is exactly why my verification passed and his click did not. On every bridge start pup now clears the jump-list dedupe key for all recovered sessions before the startup brand sweep, so the re-attach is real instead of a no-op and every surviving window gets task commands matching the running version. One AD call per live window, once per boot.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Correct the record on the jump-list blip. The v1.9.112 post-stamp jump-list re-commit did NOT fix it: three fresh windows each got exactly 1 AUMID registration plus 1 re-commit and all still showed the flyout for ~200-300ms before it vanished. The re-commit stays (attaching the destination list to the live button is correct hygiene) but its comment no longer claims to be the cure. The blip is UNRESOLVED and now tracked on adom/adom-desktop#40 with all four eliminated hypotheses and the measurements behind each, plus a decisive diagnostic AD can run on its own window (AD flips its own AUMID for the mode signal, so if AD's own flyout blips the behaviour is inherent to runtime AUMID retagging and reproduces without a bridge).
adom-wiki pkg install adom/[email protected]Jump-list first-right-click dismissal: re-commit the destination list once the taskbar button actually exists. Reached by ELIMINATION, with measurements: nothing fires while windows are idle (0 log lines across 40s), windows that registered exactly ONE AUMID blip too (so it is not category churn), and a registry-only vs Start-Menu-shortcut A/B showed no difference (so it is not the missing shortcut). What every FRESH window shares is that the identity stamp RECREATES the taskbar button (Win11 bakes a button's identity at creation) while the jump list was committed BEFORE the stamp — deliberately, so the header art bakes. So the button is born pointing at a destination list committed against a button that did not yet exist, and the first right-click is the shell reconciling that, which is exactly why the second click works. pup now re-commits the list ~1.6s after a successful stamp, guarded so a superseded stamp does not clobber a newer one. Still a hypothesis until John re-tests a freshly opened window.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]A detected render failure must LEAD the response, not hide behind cosmetics (John, reading a real launcher-mockup response). The 1.9.106 verdict was correct and the calling AI did act on it ('Dev server crashed. Let me restart it'), but _hint opened with a FAVICON nag, then a power lecture, then a browser inventory, so the single most important fact — that the page was a 404 — sat screens down past 32 permission strings and an availableBrowsers list. Rich hints are the right instinct; burying the critical one behind cosmetic ones is not. When renderCheck.ok is false, _hint now opens with the failure, the signals, the HTTP status, what the page actually says, an explicit do-NOT-report-success, and the screenshot command, then appends the cosmetic hints marked as secondary.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Stop reporting ok:true for a page that plainly did not render (John's catch). The launcher-mockup thread opened a .adom.cloud app that served '404 page not found'; pup answered ok:true, said nothing, and the AI reported success. Telling the caller to screenshot was too weak, so pup now LOOKS: a new probeRender() checks the loaded document (main-frame HTTP status captured from goto, plus 404 / 'Cannot GET' / server-error / visible-stack-trace text, effectively-blank body, zero stylesheets loaded, broken images) and the open response carries a machine-readable renderCheck{ok,httpStatus,signals,excerpt}. When it detects a failure, _verifyRender no longer offers advice — it LEADS with 'THIS PAGE DID NOT RENDER CORRECTLY, pup checked it, do NOT report success', names the signals, quotes the page, and says do not tell the user it works while this warning is present. Fixed my own silent bug along the way: the HTTP status was being assigned to a 'session' variable that does not exist in launchSession, so it was throwing into a catch and capturing nothing; it is now stashed on the page object.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Put the owning AI thread ABOVE the taskbar hover-preview, where John was actually looking. The header Windows draws above the preview IS the window title (Chrome derives it from document.title), so the tooltip work in 1.9.101 was real but invisible there. The thread tag now LEADS the title — 'adom-tsci · Example Domain (session: x)' — so it survives the ~25-30 char truncation in that header and answers 'which of my 20 threads made this window' at a glance. Implemented WITHOUT adding a third title mutator: the code already documents that two observers writing the same region ping-pong forever, peg the renderer and flood CDP (which hung browser_open_tab on Edge), so the wiki glyph and the new thread tag are now ONE composed prefix slot under ONE observer, applied in a fixed order, and stripping only ever removes decorations we know we wrote (never a page title that merely contains a middot). Tag capped at 18 chars; re-asserted after navigation.
adom-wiki pkg install adom/[email protected]Fix the owning-thread stamp missing on the window that matters most. The v1.9.101 stamp ran at dispatch and could only find a session that ALREADY existed — but on browser_open_window the session is created inside the handler, so the window a thread had just created got no identity and its hover tooltip read '(no AI-thread identity yet)'. The owner is now stamped as soon as the session is real, so a freshly opened pup window immediately shows 'adom-tsci · galliaApril' on its taskbar preview.
adom-wiki pkg install adom/[email protected]Surface the owning AI thread on the taskbar hover preview (John's ask). pup was DISCARDING the caller identity AD stamps on every relayed bridge request (X-Adom-Caller-Thread / X-Adom-Caller-Container); it now captures both, stamps the FIRST thread to touch a session as that window's owner, tracks lastDrivenBy so a handoff stays visible, and LEADS the thumbnail tooltip with 'thread · container'. With ~20 threads running at once a pup window is effectively an AI thread, so this turns an anonymous Chrome preview into 'that's my adom-tsci thread'. The tooltip is the only UNCAPPED text surface on the preview (the header above the thumbnail is the window title and truncates ~25-30 chars). Also fixes a line that has been wrong since native-first: the tooltip claimed 'Chrome for Testing' unconditionally and now reports the browser actually driving the window, plus the sessionId.
adom-wiki pkg install adom/[email protected]Make pup insist the AI LOOKS at what it just rendered (John's ask). browser_open_window / browser_open_tab / browser_navigate / browser_reload now return a _verifyRender instruction: the exact browser_screenshot command, a concrete checklist of what to look for (blank/white page, unstyled flash of plain HTML meaning CSS never loaded, a stack trace or framework error overlay, missing images, broken or overlapping layout, content cut off, a dev-server 'Cannot GET /', or the wrong build), and the ralph-test loop — fix the source, reload, screenshot AGAIN until the render is genuinely correct. The framing that matters: ok:true means the NAVIGATION worked and says NOTHING about whether the page painted. Wording escalates when the URL looks like the caller's own work in progress (localhost, LAN IP, file://, .adom.cloud, .local; classifier unit-tested 7/7), which is the lazy-AI case John described. Success responses only; never overwrites a handler that already spoke about verification. Also teaches ship.sh AD 1.9.180's caller-identity contract (ADOM_AI_THREAD + per-call reason on gated verbs).
adom-wiki pkg install adom/[email protected]Make pup insist the AI LOOKS at what it just rendered (John's ask). The common failure: an AI generates or edits an app, opens it in pup, sees ok:true, and reports success to the user without ever screenshotting the result — but ok:true only means the NAVIGATION worked, it says nothing about whether the page painted, whether CSS loaded, or whether a stack trace is filling the viewport. browser_open_window / browser_open_tab / browser_navigate / browser_reload now return a _verifyRender instruction with the exact browser_screenshot command, a concrete checklist of what to look for (blank page, unstyled HTML, error overlay, missing images, broken layout, Cannot GET, wrong build), and the ralph-test loop: fix, reload, screenshot AGAIN until the render is genuinely correct. Wording escalates when the URL looks like the caller's own work in progress (localhost, a LAN IP, file://, .adom.cloud, .local — classifier unit-tested 7/7), which is exactly the case John described. Success responses only; never overwrites a handler that already spoke about verification.
adom-wiki pkg install adom/[email protected]CRITICAL delivery fix found while testing the bug-report invitation: anything sendJSON attached to the OUTER response envelope was DROPPED on every SUCCESSFUL call. The conventional success shape is {success:true, output:''} and AD/the CLI unwrap output into the top level, discarding the rest of the envelope — measured: a browser_navigate success returned {durationMs, ok, sessionId, status, tabId, url} with NO _hint, _next, related, pitfalls or _reportIssues, even though sendJSON had set them. Failures survived only because their handlers write those fields on the outer object. So the canonical VERB_META hints — the SDK's whole 'every response teaches the caller' principle — were reaching callers only on failure, exactly backwards. sendJSON now merges the advisory fields INSIDE output when output is a JSON object string, never overwriting what a handler already set there.
adom-wiki pkg install adom/[email protected]Third attempt at the once-per-process bug-report invitation, this time with the actual cause. Machine traffic was eating it at TWO layers, each failing silently: AD's /health and /status probes flow through the same sendJSON chokepoint (fixed in 1.9.96 by requiring a verb), and AD ALSO calls pup's declared statusVerb (browser_readiness) through /command on spawn, so it arrived as a real verb and consumed the invite anyway. The orientation invite now fires on the first SUBSTANTIVE verb (an open/drive — the moment John described, 'when typical verbs are being invoked like open browser'), while read-only probes and enumerations neither consume nor carry it. A FAILURE still always carries the invitation regardless of verb, because that is when the evidence exists.
adom-wiki pkg install adom/[email protected]Fix the once-per-process bug-report invitation never reaching an AI: AD probes /health (and /status for the bridge chip) every ~15s and those replies flow through the same sendJSON chokepoint, so the first health probe after a spawn consumed the invitation and the first real verb carried nothing (measured after a restart). The invite is now VERB-SCOPED — it only counts responses that belong to an actual AI-facing command (res._adomCommand), so a machine-facing probe can neither consume the orientation invite nor advance the periodic counter.
adom-wiki pkg install adom/[email protected]Ask the AI to report bugs, in the response it actually reads (John's ask). pup now attaches a _reportIssues invitation naming its own wiki repo (adom/adom-desktop-puppeteer-bridge) with the exact adom-wiki issue list/create commands and what evidence to include. Deliberately throttled so it is signal, not noise: ALWAYS on a failure (the moment a bug is most likely and the evidence is still in hand), ONCE per bridge process on the first verb (orientation before anything breaks), and every 40th call after that. It also points AD-core problems at adom/adom-desktop instead, so reports land on the repo that owns the code. Injected at the sendJSON chokepoint so all 155 response sites are covered, and never overrides a hint a handler already set. Opt out with browser_configure {reportIssues:'off'}.
adom-wiki pkg install adom/[email protected]Fix issue #22 Finding 4 (AdityaAngajala): a stalled background Chrome-for-Testing prewarm blocked EVERY browser_open_window on a machine that had system Chrome AND Edge, while browser_readiness simultaneously reported browserSource:'system' with a valid chrome.exe. Two defects, both mine from the native-first change: (1) getOrLaunchBrowser still kicked the retired v1.8.71 'converge this box to CfT' background prewarm on a native launch — I removed that same kick from chrome.warmup() in v1.9.90 and missed this one, so a native launch still started a ~150 MB download nobody asked for. Removed; native-first fetches CfT only as the genuine last resort. (2) chrome.readiness() computed ready = found && !installing, conflating 'a background download is in flight' with 'nothing is drivable' — so an in-flight or STALLED last-resort download made the whole subsystem not-ready and the open gate refused on !rd.ready. ready now means only 'a drivable browser exists'; installing stays a separate informational field and never gates drivability.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Fix issue #16's residual: browser_list_windows reporting 0 windows while the windows are open and drivable by sessionId. Root cause: getActiveSession() was a RESOLVER that silently PURGED the session map — it deleted every session whose isSessionAlive() was false, with no _lostBrowser guard (unlike resolveSession, which deliberately keeps disconnected entries for rescan). And isSessionAlive() consulted ONLY the browsers map, so the instant handleBrowserDisconnect deleted that entry on a CDP blip, every session on the profile read as dead. Net effect: one call after a transient disconnect wiped the ENTIRE session map, destroying the exact entries the disconnect handler had just preserved for recovery. Fixes: (1) getActiveSession is now non-destructive — it marks _lostBrowser instead of deleting; removal belongs to the close/rescan paths. (2) isSessionAlive falls back to asking the session's own page whether its browser is still connected, so a drivable session can never report as not-alive. (3) Hardened the v1.9.89 orphan reap with the same lesson: it now REFUSES to sweep when the session map is empty while session files still exist on disk (recovery pending), so it can never mistake the user's live windows for orphans.
adom-wiki pkg install adom/[email protected]Reconcile the repo/release divergence (issue #19): merge Kyle's ten unreleased macOS fixes onto the true 1.9.90 tree. Takes his win32 self-guards on the three powershell.exe spawn primitives (removes a latent mac trap), the desktop_taskbar mac-gating rationale, platform-accurate describe hints for browser_wiki_set_view / browser_alert_window / browser_close / browser_configure, browser_configure now reporting platform + taskbarSupported, and the mac-aware Chrome .dmg install hint (no UAC/awaiting_uac phase on darwin). Reconciles his local _isWin against the module-level one added in 1.9.89. Also fixes bridge.json platforms.macos.supported, which had declared FALSE since the macOS port actually shipped in 1.9.74 and is the machine-read manifest a host reads to decide platform support. All 1.9.86-1.9.90 work verified intact (reap fix, wiki auto-sign, native-first).
adom-wiki pkg install adom/[email protected]Flip pup's default browser to NATIVE-FIRST. launchCandidates() now orders the user's installed Chrome, then Edge (ships on every Windows PC), FIRST, driven with a fresh isolated profile PLUS the noBrowserIdentityFlags that suppress Chrome's sign-in / set-up-a-work-profile merge dialog. Chrome-for-Testing is now the genuine LAST RESORT, fetched only when the box has no installed Chromium at all; warmup() no longer force-downloads CfT when a native browser is present. This makes native as clean as CfT (the identity-dialog reason for CfT-first was already invalidated: CfT shows the same dialog, the flags are the real fix and apply to any Chromium), with no 150MB download, always the user's current battle-tested build, and all taskbar identity overrides work identically. browser_use {browser:cft} still pins CfT for a managed/enterprise box whose policies interfere. Cold-start gate + hints updated; decision doc flipped.
adom-wiki pkg install adom/[email protected]Fix browser_close leaving core-pegging renderer orphans that froze the desktop. The teardown reap was fire-and-forget with an 8s full-Win32_Process enumeration that TIMED OUT exactly when the box was CPU-pegged by the runaway renderers it existed to kill (AdomLapper: 88-98% CPU, dwm starved, forced reboot; 6 CfT procs survived a close, 4 renderers near 100%). Now the reap is AWAITED, VERIFIED, and load-tolerant: WMI image-name filter is pushed server-side so only chrome/msedge rows materialize (fast at 98% CPU), close() awaits the profile-scoped kill of the parent tree PLUS any reparented renderer orphans, and every close response returns chromeProcsRemaining (should be 0). Adds a boot + periodic orphan sweep (reaps pup chrome whose profile has no live session, spared by profile) and a verified close-all sweep.
adom-wiki pkg install adom/[email protected]Wiki auto-sign: pup now signs its wiki window in AUTOMATICALLY from the user's identity that AD already stores at ~/.adom/session.json on the same desktop (mints a single-use browser-session magic link server-side from that bearer token and navigates the vault window to it), instead of ever making the user hand-type a login into pup's no-memory browser. Applies to BOTH the jump-list logged-in-view toggle and the AI wikiView:authed open path; manual /login is now only the fallback when AD itself is signed out or the session expired.
adom-wiki pkg install adom/[email protected]Recover from the 1.9.86 mac-parity regression: rebase onto Kyle's 1.9.85 unified base and re-apply only the puppeteer 24.43.1 / CfT 148 bump. Restores darwin support, recorder-icon.ico, and the AD-base resolver that 1.9.86 dropped.
adom-wiki pkg install adom/[email protected]Cache-bust re-cut of the puppeteer 24.43.1 / CfT 148 bump (1.9.85 release URL served a stale edge-cached zip)
adom-wiki pkg install adom/[email protected]Reunifies the two divergent release lines: John's 1.9.76-1.9.84 Windows work + the mac-parity line (hidden-app background, mac lower/raise/alert, dmg Chrome install, verified-AD-base resolver). Restores pup-cat category icons + recorder icons to the zip. Supersedes 1.9.75 and 1.9.84.
adom-wiki pkg install adom/[email protected]Extend the wiki sign-in auth re-check to ~90s so a real manual SSO+2FA sign-in also flips the glyph/label/icon to logged-in when it completes, stopping early on success or if the window closes
adom-wiki pkg install adom/[email protected]Wiki sign-in: after navigating to the login page, re-check auth in the background and flip the glyph/tab-label/category-icon to logged-in when the hydrogen SSO auto-completes (an already-alive SSO session lands back signed in with no form to fill)
adom-wiki pkg install adom/[email protected]Wiki logged-in toggle: when no wiki session exists yet, navigate THIS window to the sign-in page and raise it, instead of showing a dead-end sign-in-in-this-window toast on the public page
adom-wiki pkg install adom/[email protected]Make the orphan-renderer reap NON-BLOCKING: the v1.9.78 reap ran a synchronous 8s PowerShell CIM query on the close path, freezing the event loop and making the bridge unresponsive to AD's health check (self-inflicted restart). Fire-and-forget async instead
adom-wiki pkg install adom/[email protected]Reclassify a timed-out/detached tab op as the structured renderer-crashed error at the dispatch catch (first-verb fast-fail for issue #16)
adom-wiki pkg install adom/[email protected]Reclassify a timed-out/detached tab op as the structured renderer-crashed error at the dispatch catch, so even the first verb that discovers a crash returns the reload-to-recover hint instead of a generic 20s timeout
adom-wiki pkg install adom/[email protected]Survive renderer crashes (issue #16): detect a crashed tab renderer (page error + Inspector.targetCrashed), fast-fail its verbs with a reload-to-recover hint instead of hanging the window, clear the flag when reload/navigate respawns it, and reap orphaned/crashed renderers scoped to the session profile on close
adom-wiki pkg install adom/[email protected]Never block browser_open_window on a Chrome-for-Testing download when a system browser is available (issue #15): a machine with working Edge and Chrome could not open a window because the gate ignored system candidates, contradicting the documented last-resort behaviour
adom-wiki pkg install adom/[email protected]Power fix: Chrome power-saving flags are now OPT-IN via highFps instead of applied to every window forever (issue #14 battery drain). A highFps window holds a lease (default 20 min, max 120), an active recording holds it open indefinitely so a take is never cut off, and on lapse the window is DOWNGRADED by relaunch carrying its tabs rather than closed. Adds browser_highfps_extend, plus hints on every open so an AI discovers the capability
adom-wiki pkg install adom/[email protected]Self-heal a half-populated Chrome-for-Testing cache dir: delete the versioned folder when it exists without its executable, so a partial or interrupted download stops failing every later install attempt
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Keep the log janitor (dedupe plus quieter drag and overlay lines) and record why the bridge owns log VOLUME while AD owns the file and its rotation
adom-wiki pkg install adom/[email protected]Log the missing-favicon case once per session instead of on every tab-badge update
adom-wiki pkg install adom/[email protected]Log janitor: collapse consecutive identical lines into one plus a repeat count, and stop the drag check emitting one line per tab when nothing moved
adom-wiki pkg install adom/[email protected]Park windows on RECOVERY and on RECLAIM (background-by-default was only enforced on the launch path, so after a reboot every recovered window sat in the foreground), and log every incoming verb for auditability
adom-wiki pkg install adom/[email protected]Let AD desktop_bring_to_front perform the raise after PowerShell clears WS_EX_NOACTIVATE, since SetForegroundWindow is silently ignored under the Windows foreground lock
adom-wiki pkg install adom/[email protected]Use PowerShell only to clear WS_EX_NOACTIVATE and un-minimize, then have AD desktop_bring_to_front perform the real raise, because SetForegroundWindow is silently ignored under the Windows foreground lock
adom-wiki pkg install adom/[email protected]Raise a pup window by resolving its hwnd from the session title and clearing WS_EX_NOACTIVATE before SetForegroundWindow, so a backgrounded Edge window actually surfaces (the PID path was skipped on every detached launch and only ever matched chrome.exe)
adom-wiki pkg install adom/[email protected]Raise a pup window by resolving its hwnd and calling desktop_bring_to_front, instead of relying on CDP setWindowBounds plus bringToFront which never raises an Edge window from the bottom of the z-order
adom-wiki pkg install adom/[email protected]Bake the deep-link into the minted magic URL by appending next= client-side (the endpoint ignores next, the CLI appends it), so an in-place view toggle lands back on the same wiki page instead of the root
adom-wiki pkg install adom/[email protected]In-place wiki view toggle: mint a single-use magic link from an already-logged-in page (browser-session endpoint works with just the session cookie, so the desktop needs no token) and navigate the window, instead of closing and relaunching it under another profile
adom-wiki pkg install adom/[email protected]Wiki view toggle now switches IN PLACE using Colby's browser-session magic link (a logged-in page mints its own single-use link, so the desktop needs no token) instead of closing and relaunching the window under another profile
adom-wiki pkg install adom/[email protected]Claim the jump-list dedupe key before the await so two concurrent callers cannot both commit (a redundant CommitList rebuilds the menu and dismisses one the user is opening)
adom-wiki pkg install adom/[email protected]Brand the jump-list header BEFORE stamping the new appId (Win11 bakes button art at creation, so branding after had no visible effect), and dedupe jump-list commits on appId+view so a CommitList cannot dismiss a menu the user is opening
adom-wiki pkg install adom/[email protected]Brand the jump-list header row: pass hwnd plus headerIcon to desktop_set_window_jumplist (AD 1.9.153). hwnd is required, titleContains silently no-ops. Log headerBranded and iconCheck so it is verifiable in code
adom-wiki pkg install adom/[email protected]Set the thumbnail tooltip from updateTabCountBadge so the normal open path gets one (it was only wired into refreshWindowChrome and the category-change hook, so freshly opened windows had no tooltip)
adom-wiki pkg install adom/[email protected]Rebuild all category icons with PNG-compressed 256 frames (Vista+ rule: a BMP 256 entry renders the generic white document on the jump-list header), bump icon generation to i3, and add the thumbnail tooltip using AD 1.9.152 desktop_taskbar thumbnailTooltip
adom-wiki pkg install adom/[email protected]Agent-activity indicator: taskbar progress bar marks which pup window a thread is currently driving (indeterminate while verbs land, cleared 2.5s after the last one); browser_configure agentActivity on|off
adom-wiki pkg install adom/[email protected]Self-healing session-title tag: collapse duplicate (session: id) tags to exactly one so the taskbar thumbnail caption is not bloated and AD title resolution cannot hit a duplicated tag
adom-wiki pkg install adom/[email protected]Retire adom-pup-browser3.ico as the default: new pup-cat-default9.ico matches the teal-tile category family for category-less windows and the base Adom Pup identity
adom-wiki pkg install adom/[email protected]Jump-list task rows now use the windows category icon (pup-cat-*9.ico) instead of the retired adom-pup-browser3.ico
adom-wiki pkg install adom/[email protected]Shorten wiki jump-list task titles to Switch to logged-in view / Switch to public view so the login word is no longer truncated; the page context stays in the description line
adom-wiki pkg install adom/[email protected]Fix jump-list first-right-click blip: stop stamping a transient .plain AUMID while a window is still loading (it created a jump-list-less button that Explorer resolved first), and clear an AUMIDs jump list when unregistering so stale CustomDestinations files stop piling up
adom-wiki pkg install adom/[email protected]Add Close-ALL-pup-windows jump-list task to every window, unregister AUMIDs on close-all, and reconnect+reattach disconnected-but-alive sessions via rescanProfile so a zombie window stops showing the old default icon
adom-wiki pkg install adom/[email protected]Stop reclaim adopting windows mid-launch: skip profiles with a launch in flight and require two consecutive sweeps before adopting
adom-wiki pkg install adom/[email protected]Inject the session title marker even when a page has no title, so title-less app pages stop making their window invisible to every branding call
adom-wiki pkg install adom/[email protected]Re-evaluate a window category when a tab finishes navigating, so a window whose tabs were still loading no longer freezes on the wrong taskbar icon
adom-wiki pkg install adom/[email protected]Reclaim unmanaged pup windows (openerless popups and orphans whose session died) so they can never sit unbranded in the taskbar
adom-wiki pkg install adom/[email protected]Replace the per-session recovery strike with a crash sentinel so a normal restart can no longer quarantine healthy sessions, and defer the AUMID prune so it cannot unbrand live windows
adom-wiki pkg install adom/[email protected]Add icon-generation token to the per-window AUMID so an icon or branding change forces Windows to rebuild the taskbar button, repairing already-baked white tiles
adom-wiki pkg install adom/[email protected]Fix white taskbar icon: write IconResource into HKCU ourselves because AD register_app_identity ignores iconPath when shortcut is false, leaving every AUMID unbranded; prune orphaned Adom.Pup AUMID keys on startup
adom-wiki pkg install adom/[email protected]Skip placeholder favicons, retry the overlay instead of failing silently, and strip every old session suffix while disconnecting the previous title observer
adom-wiki pkg install adom/[email protected]Skip the check when nothing is multi-tab and throttle it to once per 1.5s so a noisy desktop cannot turn it into a poll
adom-wiki pkg install adom/[email protected]Any adom.cloud slug host counts as an Adom app, and brandSweep re-evaluates categories for long-lived and recovered windows
adom-wiki pkg install adom/[email protected]Adopted dragged-out tabs now get their own session title suffix before branding
adom-wiki pkg install adom/[email protected]Grow the dark teal window 30 percent and keep a real margin between it and the glyph, plus corrected stroke weight
adom-wiki pkg install adom/[email protected]Remove the browser toolbar line, enlarge the category glyph to fill the window body, and embed the authentic Adom mark for app windows
adom-wiki pkg install adom/[email protected]Scale the inner content glyph 1.3x for legibility at taskbar size while keeping the frame and margins
adom-wiki pkg install adom/[email protected]Refresh identity icon, favicon overlay and jump list together with retries on both sides of a drag-out
adom-wiki pkg install adom/[email protected]Parse AD command responses defensively for both the relay wrapped shape and the bare loopback payload
adom-wiki pkg install adom/[email protected]Reuse an existing global window-opened watch instead of leaking one per restart, and ship the drag-out detection diagnostics
adom-wiki pkg install adom/[email protected]Log every step of the drag-out detection so a silent failure cannot hide
adom-wiki pkg install adom/[email protected]Stop filtering window-opened events by window name since a new window has none at creation time
adom-wiki pkg install adom/[email protected]Subscribe to the AD window-opened UIA event and adopt a dragged-out tab as its own session with its own identity and category icon
adom-wiki pkg install adom/[email protected]Match the proven raise path so a detached browser window is shown via CDP instead of PowerShell targeting the wrong window
adom-wiki pkg install adom/[email protected]pup skill gains the window-type icon section: five taskbar icons and their meanings, the wiki view toggle jump list, and the favicon-overlay rule
adom-wiki pkg install adom/[email protected]Log identity stamp failures and retry the category change re-stamp with backoff
adom-wiki pkg install adom/[email protected]Per-session appIds carry the category so a flip creates a fresh taskbar button, per AD's Win11 measurement
adom-wiki pkg install adom/[email protected]Seed the authed flag at session creation so the first taskbar icon is already the signed-in book plus person
adom-wiki pkg install adom/[email protected]Signed-in wiki icon becomes book plus solid person bust so login state reads at taskbar size
adom-wiki pkg install adom/[email protected]Solid dark window body with teal knockout category glyphs and proper margins per design review
adom-wiki pkg install adom/[email protected]Redraw category icons around a shared browser-window frame with the category as window content, Adom mark for apps
adom-wiki pkg install adom/[email protected]Re-stamp the base icon immediately when a window category changes instead of waiting out the ten minute brand debounce
adom-wiki pkg install adom/[email protected]Redraw the five category glyphs in the family dark teal instead of white, and document the Explorer icon-cache failure mode
adom-wiki pkg install adom/[email protected]Regenerate the five category icons with classic BMP frames because the shell RelaunchIconResource loader cannot parse PNG-compressed ICO frames
adom-wiki pkg install adom/[email protected]Give each session its own OS window so per-window branding resolves, add monochrome category icons per the brand icon law, and strip emoji from every user-visible string
adom-wiki pkg install adom/[email protected]Repaint the taskbar overlay after the wiki auth state is recorded so the plate colour is correct
adom-wiki pkg install adom/[email protected]Switch the signed-in plate and icon green from an ad-hoc Tailwind value to the Adom design-system green token
adom-wiki pkg install adom/[email protected]Recolour the overlay plate behind the site favicon green when signed in to the Adom wiki, keeping the favicon in the slot
adom-wiki pkg install adom/[email protected]Retry the identity re-stamp with backoff so the icon flip does not lose the race against the relaunched window title injection
adom-wiki pkg install adom/[email protected]Revert the overlay padlock and put the Adom wiki login state on the main icon as a solid green filled browser glyph
adom-wiki pkg install adom/[email protected]Move the Adom wiki login indicator to the taskbar overlay slot as a green closed or slate open padlock, readable at real 16px taskbar size
adom-wiki pkg install adom/[email protected]Swap the pup main icon between a browser-window outline and a solid padlock to signal Adom wiki login state, with state-keyed identity and AUMID caches
adom-wiki pkg install adom/[email protected]Consume AD 1.9.141/1.9.143/1.9.144: expiresInMs captions on the loopback API, relaunchCommand trio to brand the jump-list header, retire the in-page toast
adom-wiki pkg install adom/[email protected]In-page wikiToast feedback since desktop_caption is relay-only on this AD, caption call now logged not silent, branding waits for the title suffix
adom-wiki pkg install adom/[email protected]Escape JSON quotes in jump-list task args so the CLI receives valid JSON, plus desktop_caption feedback on switch start and completion
adom-wiki pkg install adom/[email protected]Async PS raise (no event-loop block), respond immediately after raise with background cosmetics, optimistic glyph with delayed auth-recheck self-correction
adom-wiki pkg install adom/[email protected]browser_wiki_set_view now does a real OS SetForegroundWindow raise via osRaiseSessionWindow plus a taskbar flash, so the clicked switch is visibly brought to front
adom-wiki pkg install adom/[email protected]Persistent circuit breaker quarantines crash-poison session files so recoverSessions can't loop-crash the bridge; jump-list task carries the pup icon
adom-wiki pkg install adom/[email protected]Jump-list toggle titles now lead with Adom wiki so the menu is self-describing, not generic
adom-wiki pkg install adom/[email protected]Add _launchInFlight dedup so concurrent opens on one profile can't collide and wedge the bridge; add recovery hints and skill troubleshooting
adom-wiki pkg install adom/[email protected]Add browser_wiki_set_view and per-window wiki jump-list toggle (logged-in vs public) via desktop_set_window_jumplist
adom-wiki pkg install adom/[email protected]Register per-session AUMIDs (#207) for alt-tab/jumplist Adom icon.
adom-wiki pkg install adom/[email protected]Word labels for wiki mode; refresh after login.
adom-wiki pkg install adom/[email protected]Favicons win the overlay; active tab, count in tooltip.
adom-wiki pkg install adom/[email protected]Adom-wide auth gating; overlay favicon(1)/count(2+).
adom-wiki pkg install adom/[email protected]Profiles moved out of the clobbered bridge cache to ~/.adom.
adom-wiki pkg install adom/[email protected]Gentle in-tab wiki mode glyph.
adom-wiki pkg install adom/[email protected]Wiki authed shared across threads; routing fix; sharper hints.
adom-wiki pkg install adom/[email protected]Suppress browser sign-in/work-profile prompt in CfT via launch flags.
adom-wiki pkg install adom/[email protected]pup skill gains the window-type icon section: five taskbar icons and their meanings, the wiki view toggle jump list, and the do-not-repurpose-the-favicon-overlay rule
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]App-favicon overlay: pup auto-fetches the loaded page's served favicon (the ui-design standard artifact) and wears it on a dark plate in the taskbar overlay, with explicit appIconB64/appName overrides, a reprimand for app URLs serving no favicon, tooltip-carried tab counts when an app icon owns the slot, and refresh on navigate.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Grouped counter digits sit on rounded-rectangle plates, dark with white windows digit and teal with dark tabs digit, keeping large type with proper contrast.
adom-wiki pkg install adom/[email protected]Circle-less grouped counter with white windows digit and teal tabs digit for dark-theme legibility.
adom-wiki pkg install adom/[email protected]Trial circle-less grouped counter: bold bare digits with a hairline halo, about a quarter taller than the circled variant.
adom-wiki pkg install adom/[email protected]Grouped dual-counter digits enlarged again for taskbar legibility.
adom-wiki pkg install adom/[email protected]Grouped-mode dual counter laid out side by side across the top of the overlay instead of diagonally.
adom-wiki pkg install adom/[email protected]Badge digits enlarged fifteen percent across split badges and the grouped dual counter.
adom-wiki pkg install adom/[email protected]Grouped mode shows a dual counter, window count dark circle plus total tabs in a light teal circle, rendered at runtime via sharp with per-pair caching; all badge circles flattened with no white outline.
adom-wiki pkg install adom/[email protected]Tab-count badge lightened per feedback: sixty percent size anchored upper-right with a hairline translucent outline instead of the heavy white ring.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Per-session AUMIDs (Adom.Pup.) so each pup window gets its own taskbar button with its own accurate tab-count badge; the shared AUMID had grouped all windows into one button with a misleading badge; plain Adom.Pup remains the registered pinnable launcher.
adom-wiki pkg install adom/[email protected]Tab-count overlay badge: pup windows with two or more tabs show the count in the overlay slot freed by the identity takeover, updated on tab open, close, and popup attach, so many-tab review windows are instantly distinguishable from single-tab neighbors.
adom-wiki pkg install adom/[email protected]Brand sweep at startup and after rescans: re-asserts each live session's title suffix and re-stamps it to the current identity so icon rebrands propagate to already-open windows and the taskbar never shows mixed icon generations.
adom-wiki pkg install adom/[email protected]AD-version awareness: pup probes the desktop's AD at startup and on boxes older than 1.9.124 warns visibly that the foreground raise gate is bypassed there (yellow chip, status fields, open-response advisory); all other version gaps continue to self-gate silently.
adom-wiki pkg install adom/[email protected]pup owns its browser provisioning: warmup at every bridge spawn now background-fetches Chrome for Testing whenever it is not cached regardless of installed browsers, so fresh boxes provision at install time and first opens never wait; AD prewarm policy no longer involved and issue 204 withdrawn.
adom-wiki pkg install adom/[email protected]Browser glyph shrunk and tucked into the lower-right corner with clear teal space so it no longer touches the leaf mark; ships as adom-pup-browser3.ico under a new filename per the icon-cache rule.
adom-wiki pkg install adom/[email protected]Identity icon simplified to a minimal line-art browser glyph in the leaf dark-teal with no white, shipping as adom-pup-browser2.ico under a new filename per the icon-cache rule.
adom-wiki pkg install adom/[email protected]New Adom Pup identity icon: the favicon with a browser-window glyph inlaid lower-right so the icon reads as an Adom browser window; ships as adom-pup-browser.ico under a new filename per the icon-cache rule, master SVG in the repo pending promotion to the brand-icons wiki repo.
adom-wiki pkg install adom/[email protected]Full Adom Pup window identity on AD 1.9.134: self-registration at bridge start with a pin that launches a managed pup window, per-window identity stamp at create/park/heal with cacheKey, overlay badge demoted to a self-gating fallback for older AD, adom-pup.ico ships in the zip.
adom-wiki pkg install adom/[email protected]The demarcation gate: unpinned opens require cached Chrome for Testing and return the pollable installing status instead of ever silently driving the user's branded browser; explicit browser_use pin is the only branded path; AD issue 204 filed to flip the prewarm default so install-time prewarm erases the first-use wait.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Foreground gate matching abe's dual-key contract: foreground:true without foregroundReason opens background with foregroundDenied, raise/focus without a reason is refused with foreground_reason_required, and every granted foreground is logged, recorded in lastAgentUpdate, and surfaced as lastForeground in status.
adom-wiki pkg install adom/[email protected]Sized opens keep their requested x/y (the legacy re-assert clobbered geometry back to the primary origin, blocking second-monitor placement; now z-only via AD state:bottom force:false), and window-management is granted by default so getScreenDetails can enumerate the real monitor layout.
adom-wiki pkg install adom/[email protected]Park after the page settles so the first paint's window-raise happens invisibly off-screen; the window's first visible frame is full-size, z-bottomed, and z-confirmed, eliminating the transient on-top blip other threads' windows showed.
adom-wiki pkg install adom/[email protected]Re-assert z-bottom after the open's navigation and at the load event (the first cross-origin nav re-shows the window at first paint and raised it after the park's z-confirm had passed), and after open_tab's new-tab first paint; all with force:false so a user-held window is never yanked.
adom-wiki pkg install adom/[email protected]Placement doctrine: geometry via CDP plain bounds only sized from the page's own screen metrics, re-bottom after every move, confirm the z-order via desktop_list_windows, and move the window back off-screen if z-bottom cannot be confirmed; AD set_window_bounds and CDP maximize are both banned from background placement because each raises the window.
adom-wiki pkg install adom/[email protected]Never use CDP windowState maximized for background placement: Chromium implements it as SW_MAXIMIZE which raises the window to the top of the z-order and covered the user's work; placement now uses AD desktop_set_window_bounds restore:false sized from desktop_list_monitors, preserving the forced z-bottom.
adom-wiki pkg install adom/[email protected]Background windows now appear already-maximized: the park stages the window just past the left screen edge (invisible but monitor-adjacent) before the OS maximize, eliminating the visible small-then-grow; verify and heal thresholds tightened to catch a window stuck at the staging spot.
adom-wiki pkg install adom/[email protected]Adopt AD 1.9.115's force:true on desktop_set_window_state state:bottom so the launch park bottoms a foreground window in one AD call; legacy PS fallback retained only for AD 1.9.114 and older and auto-obsoletes as desktops update.
adom-wiki pkg install adom/[email protected]When AD skips z-bottom because the window is foreground (its requested skip-on-foreground semantics), the launch park now force-bottoms via the legacy path, fixing park-failed on the post-restart foreground-reassignment case; AD follow-up filed for a force flag.
adom-wiki pkg install adom/[email protected]Adopt AD 1.9.114's desktop_set_window_state state:bottom for the park's z-order step, deleting the last PowerShell from the open path so window management is fully direct API, with a legacy PS fallback for desktops on older AD.
adom-wiki pkg install adom/[email protected]Remove the launch-park user-click escape hatch entirely: foreground-at-park has non-user causes (Windows reassigns foreground to a fresh window after the previous foreground window is destroyed, e.g. on a bridge-update restart), which forced never-clicked windows onto the user's screen; the launch park now bottoms unconditionally and a user who clicked during the 2s gap just clicks once more.
adom-wiki pkg install adom/[email protected]Hard rule: a window is never moved on-screen until z-bottom is confirmed; under parallel-open load a lagged hwnd lookup used to place an un-bottomed window on top of the user's work; now it retries up to 8x then stays off-screen as an honest park-failed, and park-failed windows self-heal on any status query.
adom-wiki pkg install adom/[email protected]Badge calls now check AD's real result and log failures instead of silently swallowing them, and the tab-path badge debounce only arms on success so a failed badge retries on the next call.
adom-wiki pkg install adom/[email protected]Self-heal windows stranded off-screen by older builds at reattach and on the open_tab/switch_tab hot path, re-badge debounced so long-lived shared windows like adom-shotlog stay clickable and badged; teach anonymous creators the owner param; enrich open_tab and switch_tab describe entries.
adom-wiki pkg install adom/[email protected]Fix the flash 'pending vs cleared' focus latch: install the window-focus hook into the CURRENT document too, not only future navigations, so windows the user already clicked report flash cleared and the still-unseen window is identifiable programmatically.
adom-wiki pkg install adom/[email protected]Park places the window via the OS maximize (CDP windowState) instead of a screen-size probe that could fail mid-navigation and produce 1600x900 windows; move to primary monitor then maximize, no activation.
adom-wiki pkg install adom/[email protected]Fix the user-click detection: use GetForegroundWindow (the OS truth) instead of document.hasFocus which lies for CDP-created windows and false-fired user-foreground on every open; the z-bottom PS call now checks foreground first at zero extra cost.
adom-wiki pkg install adom/[email protected]Direct-API park: CDP setWindowBounds addresses the exact window (parking the wrong window impossible), AD find_window replaces EnumWindows PS, park runs at newPage so no wait loop, verification checks position not focus, badge fires the instant the park lands.
adom-wiki pkg install adom/[email protected]Close the launch gap: a taskbar click during the first seconds now brings the window up on-screen at top full-size instead of activating it invisibly off-screen; unambiguous because no-startup-window means only the user can make the window foreground.
adom-wiki pkg install adom/[email protected]Eliminate the focus steal at the source: background launches use --no-startup-window so the window is created by a background process the OS denies foreground to; the stability watch, timers, and re-parks are deleted, so a user taskbar click at any moment sticks.
adom-wiki pkg install adom/[email protected]Replace the blind-timer background park with one event-driven watchdog: wait for the window to exist, park once deactivate-first, re-park Chrome self-raises within 50ms, exit after 500ms of calm; afterwards nothing ever re-parks so a user taskbar click sticks; open response awaits the self-verified verdict.
adom-wiki pkg install adom/[email protected]Remove the GetLastInputInfo user-click heuristic, which false-fired whenever the user was typing anywhere and left fresh windows small and foreground; launch passes always park full-size, late re-parks use a simple pup-is-foreground check, centered-80 placement removed.
adom-wiki pkg install adom/[email protected]Revert minimize (it broke screenshots, visibilityState hidden hangs captureScreenshot); background is on-screen z-bottom with EnumWindows real-window handle, deactivate-then-park to avoid pop, and a short 1.2s re-park window so user clicks are not fought.
adom-wiki pkg install adom/[email protected]Background state is now MINIMIZE instead of on-screen z-bottom: minimizing hands focus back automatically and removes the re-park retry loop that fought user clicks, so a taskbar click restores the window and it stays; restore rect set on-screen; screenshots still work via disabled occlusion.
adom-wiki pkg install adom/[email protected]Resolve the real browser window via EnumWindows (largest visible Chrome_WidgetWin_1) instead of the flaky MainWindowHandle, which returned a hidden helper window on some boxes and left pup windows stuck off-screen so clicking their taskbar button showed nothing.
adom-wiki pkg install adom/[email protected]User-AI window balance: a deliberate user click now brings the pup window on-screen and shows it instead of activating it off-screen invisibly; browser_alert_window stop truly clears the Win11 flash tint via off-screen activation; programmatic per-window flash state added.
adom-wiki pkg install adom/[email protected]Respect a deliberate user raise: clicking a background pup window to watch a page load no longer forces it back to the background (open-time re-park now detects a real user click via GetLastInputInfo and latches off).
adom-wiki pkg install adom/[email protected]- v1.8.42: pup taskbar badge = the actual Adom favicon (was a hand-composited tile) (John Lauer)
adom-wiki pkg install adom/[email protected]- v1.8.41: pup taskbar badge is now the favicon-style tile — white Adom leaves on a teal rounded-rect (was bare white leaves) (John Lauer)
adom-wiki pkg install adom/[email protected]- v1.8.40: auto-badge pup windows with the white Adom leaves via AD-core desktop_taskbar (custom PNG overlay, AD >=1.9.106) — resolves the window by its (session: id) title, cross-process, on every open (John Lauer)
adom-wiki pkg install adom/[email protected]- v1.8.39: remove in-bridge ITaskbarList3 overlay (in-process-only, doesn't badge the browser's window) — taskbar badge is an AD-core desktop_taskbar capability; filing a pup-distinct-badge request to AD instead (John Lauer)
adom-wiki pkg install adom/[email protected]- v1.8.38: taskbar overlay badge — stamp the white Adom leaves on each pup window's taskbar button (ITaskbarList3::SetOverlayIcon) so pup windows are distinct from the user's real browser (John Lauer)
- Publish 1.8.38 (John Lauer)
- v1.8.37: cleanup nudge — browser_status/open _hint reminds the agent to close stale/piled-up pup windows (never auto-closes); skill: 'clean up after yourself' section (John Lauer)
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]- v1.8.36: snappy auto-flash — fire the taskbar flash the moment the window is backgrounded (after the local welcome page), not after the heavy URL's domcontentloaded (John Lauer)
adom-wiki pkg install adom/[email protected]- v1.8.35: browser_alert_window {stop:true} clears the taskbar highlight (FLASHW_STOP); fix alert_window to actually flash (was wrongly calling bringToFront) (John Lauer)
adom-wiki pkg install adom/[email protected]- Document the solved background-by-default/focus-steal playbook in the dev skill + CHANGELOG so it's never re-derived (off-screen launch, z-bottom park, AttachThreadInput focus handback, hidden PowerShell) plus the dead-ends (John Lauer)
- v1.8.34: AttachThreadInput focus hand-back — deterministically returns keyboard focus to the user's window after launch (no more keystroke steal); no minimize (no flicker) (John Lauer)
adom-wiki pkg install adom/[email protected]- v1.8.33: revert WS_EX_NOACTIVATE (broke taskbar-click); final = off-screen launch + on-screen-behind park (no pop, not covering, clickable, hidden PS) (John Lauer)
adom-wiki pkg install adom/[email protected]- v1.8.32: WS_EX_NOACTIVATE on background windows = deterministic no-focus-steal (never still-foreground); raise clears the style (John Lauer)
adom-wiki pkg install adom/[email protected]- v1.8.31: park background window ON-SCREEN sized-to-monitor at z-bottom (behind user windows, invisible, but clickable via taskbar); single background retry to avoid flicker (John Lauer)
adom-wiki pkg install adom/[email protected]- v1.8.30: run all window-mgmt PowerShell HIDDEN (execFileSync+windowsHide, no cmd shell) so pup never flashes a console; keep off-screen background shown for screenshots (John Lauer)
- v1.8.29: background = minimize-and-leave (off-screen already invisible), fully drops keyboard focus (John Lauer)
- v1.8.28: launch background windows OFF-SCREEN (never visually pops/covers user's work); raise repositions on-screen (John Lauer)
- v1.8.27: remove redundant pup-side localhost probe (AD core already reprimands localhost on failure); keep the real background-by-default fix + foreground-gate + finite flash (John Lauer)
- v1.8.26: real background-by-default (minimize->show-no-activate drops focus, self-verifying 'background' field); stop navigate/reload/switch_tab from raising bg windows (foreground-state gate); localhost reprimand (desktop-side port probe); finite flash (John Lauer)
- v1.8.25: fix foreground-restore threading (getOrLaunchBrowser now receives foreground; 1.8.24 threw 'foreground is not defined' on every open) (John Lauer)
- v1.8.24: fix background-by-default focus steal (capture user's foreground window before launch, restore it + push pup to back the instant the window appears via CDP-port owner resolution); finite 4-blink taskbar pulse instead of blink-forever (John Lauer)
- Remove internal identifiers from page.json (git-wiki)
- Publish 1.8.30 (John Lauer)
- Skills v1.8.30: teach auto-flash + updateNote/lastAgentUpdate signalling, keystroke-safe raise, open_tab tabId/tabCount, browser_render_html (UTF-8 HTML render) (John Lauer)
- v1.8.23: auto-flash on agent updates (debounced taskbar flash, {silent}/autoFlash:false), lastAgentUpdate/updateNote in list_tabs/list_windows, blur page focus before raise (keystroke-leak fix), open_tab returns tabId/tabCount, new browser_render_html verb (UTF-8-safe HTML render); doc steers alert-not-raise (John Lauer)
- Re-push page.json after pkg 1.8.29 (John Lauer)
- Publish 1.8.29 (John Lauer)
- skill: teach the new first-class page-driving verbs (browser_scroll / browser_set_viewport / browser_screenshot_element) + eval helpers, replacing the hand-rolled evals; pkg 1.8.29 (John Lauer)
- v1.8.22: screenshot_element below-fold clip fix + closest option (John Lauer)
- v1.8.21: browser_scroll + browser_set_viewport + browser_screenshot_element + shadow-DOM eval helpers + fullPage nested-scroll hint (John Lauer)
- Re-push page.json after pkg 1.8.28 (John Lauer)
- Publish 1.8.28 (John Lauer)
- README + pkg description: lead with a crisp 'Install (skills) vs Download (runtime)' explainer incl. why the two version numbers differ; refresh the stale pkg description to the current model. pkg 1.8.28 (John Lauer)
- Re-push page.json after pkg 1.8.27 (John Lauer)
- Publish 1.8.27 (John Lauer)
- Add pup-adom-wiki user skill (driving/verifying the wiki in pup + the logged-out reality) + README 'Extend pup' third-party breadcrumb section; skill map updated. pkg 1.8.27 (John Lauer)
- Re-push page.json after pkg 1.8.26 (John Lauer)
- Publish 1.8.26 (John Lauer)
- skills: add 'Driving & verifying tricky pages' — shadow-DOM piercing survey, scroll-the-element (not window) for nested scroll containers, count-in-DOM-then-confirm; + pointer from the main skill's key rules. From the adom-desktop download-card audit. pkg 1.8.26 (John Lauer)
- Re-push page.json after pkg 1.8.25 (John Lauer)
- Publish 1.8.25 (John Lauer)
- README: add a full Recording section — example GIF preview, the two recorders (CDP screencast VP9 vs MediaRecorder), and a WebM/MP4/GIF format comparison with real sizes, pros/cons, and verified ffmpeg convert commands (incl. the H.264 even-dimension gotcha); pkg 1.8.25 (John Lauer)
- Add example recording assets (native VP9 WebM + H.264 MP4 + GIF preview) for the README recording section (John Lauer)
- v1.8.20: lazy ffmpeg re-detection on record_start (install-then-record, no restart) (John Lauer)
- v1.8.19: fix browser_open_tab hang — tolerant title-suffix injector (prefix match) + drop the redundant per-tab observer that dueled it (John Lauer)
- v1.8.18: fix browser_open_tab CDP-pipe deadlock on Edge (opener() check before target.page() in popup-tracker) + newPage timeout guard (John Lauer)
- Re-push page.json after pkg 1.8.24 (John Lauer)
- Publish 1.8.24 (John Lauer)
- Re-push page.json after pkg 1.8.23 (John Lauer)
- Delete skills/pup-bridge-publish/SKILL.md (John Lauer)
- Delete skills/pup-bridge-dev/SKILL.md (John Lauer)
- SDK correction (maintainer-provided): pkg ships ONLY the pup user skill; dev/publish skills are source-only in dev-skills/ + publish-skills/ (not in files[], no user-invocable scoping); skillpack package.json declares dependencies:{adom/adom-desktop:^1.9.63} to pull the AD CLI + core skills; docs corrected (John Lauer)
- Publish 1.8.23 (John Lauer)
- Re-push page.json after pkg 1.8.22 (John Lauer)
- Delete publish-skills/pup-bridge-publish/SKILL.md (John Lauer)
- Delete dev-skills/pup-bridge-dev/SKILL.md (John Lauer)
- SDK re-audit: pup is open source, so ship dev/publish skills in skills// scoped user-invocable:false (dev-skills/*.md is dead per the Bridge SDK checklist); skillpack package.json dependencies emptied to {}; docs corrected (John Lauer)
- Publish 1.8.22 (John Lauer)
- maintainer docs: correct the skill-layout convention — dev/publish skills belong in dev-skills/ + publish-skills/ (auto-excluded from the pkg tarball), NOT skills/ (which ships them as user skills). Fixes the backwards 'skillpack way superseded source-only' framing that caused the 28KB tarball (John Lauer)
- Delete skills/pup-bridge-publish/SKILL.md (John Lauer)
- Delete skills/pup-bridge-dev/SKILL.md (John Lauer)
- Re-push page.json after pkg 1.8.21 (John Lauer)
- pkg leanness: move maintainer skills to dev-skills/ + publish-skills/ (auto-excluded from tarball); install.sh installs only the pup user skill; drop them from pkg files[] — user containers no longer get ~37KB of publish/dev recipes (tarball 28K->12K) (John Lauer)
- Publish 1.8.21 (John Lauer)
- Re-push page.json after pkg 1.8.20 (John Lauer)
- Publish 1.8.20 (John Lauer)
- docs: README rewritten for the generic non-profile-browser model (drop stale real-signed-in-browser + CfT-primary claims; background-by-default + ownership); CHANGELOG consolidated 1.6.0->1.8.17; pkg 1.8.20 (John Lauer)
- Re-push page.json after pkg 1.8.19 (John Lauer)
- Publish 1.8.19 (John Lauer)
- v1.8.17: hard background guarantee (sizing decoupled from foreground) + evaluateOnNewDocument title-suffix resilience; pkg 1.8.19 (John Lauer)
- Re-push page.json after pkg 1.8.18 publish (John Lauer)
- Publish 1.8.18 (John Lauer)
- v1.8.16: session ownership — refuse declared cross-thread window steals, reprimand anonymous grabs, expose owner in status; skill teaches owner + task-prefixed sessionIds; pkg 1.8.18 (John Lauer)
- Re-push page.json after pkg 1.8.17 publish (John Lauer)
- Publish 1.8.17 (John Lauer)
- Skills: document the AD 1.9.86 shell-approval flow — gate-hits auto-surface the in-window dialog, request_shell_approval re-summons it, retry the original verb, never shell_auto_approve; pkg 1.8.17 (John Lauer)
- Re-push page.json after pkg 1.8.16 publish (John Lauer)
- Publish 1.8.16 (John Lauer)
- dev skill: add the outbound bridge->AD notify recipe (direct-API, AD 1.9.84 full verb surface, bridge token, cross-AD target, notify-first ordering); pkg 1.8.16 (John Lauer)
adom-wiki pkg install adom/[email protected]Teach the v1.8.23 agent-signalling features: auto-flash on mutating verbs (silent/autoFlash/readOnly), updateNote + lastAgentUpdate in list_tabs/list_windows, keystroke-safe raise, open_tab tabId/tabCount, and the new browser_render_html UTF-8 HTML-render verb.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Fixes the peer-ping parse from 1.8.14: AD's direct-API targets verb returns {clients:[...]} including the local box, not {targets:[...]}. adPeerNames now reads clients, excludes self by hostname, and dedupes — so the Chrome-approval toast actually reaches the user's OTHER devices (laptop) via cross-AD target:all while the UAC stays on the box that needs it
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Temporary debug build echoing received open_window arg keys to diagnose whether width/height reach the bridge
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Cold-start Node bootstrap is now zero-prompt: typed verbs (send_files/tar/registry_set) instead of shell_execute or the UAC MSI. Proven on a fresh Azure box.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Bridge now binds loopback-only, so no Windows Firewall prompt for Node.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]Cold-start now warns the user about the Node.js UAC prompt (chat + desktop notification) before installing, so they approve it.
adom-wiki pkg install adom/[email protected]Edge now launches reliably (was a false 'exited immediately'); bridge self-warms on install; disk-space + install-real-Chrome + verbose hints so the AI resolves any browser situation in fewer turns.
adom-wiki pkg install adom/[email protected]Spawn-verified browser fallback + browser_use to pin chrome/edge/cft; pup now falls through a broken browser instead of failing, caches the working one, and tells the AI exactly what it picked.
adom-wiki pkg install adom/[email protected]pup now drives the browser already on the machine (Chrome->Edge) with a fresh profile — usually no download; Chrome for Testing only as a last resort.
adom-wiki pkg install adom/[email protected]SDK self-audit pass: homepage now the platform wiki page; every verb response carries _hint/_next/related/pitfalls.
adom-wiki pkg install adom/[email protected]SDK self-audit pass: bridge.json homepage now the wiki page; discovery_triggers tightened to pup's niche.
adom-wiki pkg install adom/[email protected]Skill note: pup launches with FULL browser permissions by default for full debug (strictPermissions:true to opt out).
adom-wiki pkg install adom/[email protected]Skill update for AD v1.9.47 Tier-1 model: for 'is it ready' use AD bridge_readiness (not browser_status); AD background-fetches Chrome via the bridge's prewarm declaration.
adom-wiki pkg install adom/[email protected]Pkg now installs ONLY the pup user skill (open/close/tabs/screenshot/record, background-by-default). The developer + publishing skills moved to dev-skills/ in the source — get them via repo clone, not pkg install.
adom-wiki pkg install adom/[email protected]Container skills update: user-first pup skill (background-by-default, tabs, recording, screenshot) + pup-bridge-dev (auto-discover->install flow) + pup-bridge-publish; install.sh now deploys to .claude AND .codex skills.
adom-wiki pkg install adom/[email protected]Container-side skills only: the pup user skill (now with the cold-start playbook) + pup-bridge-dev + pup-bridge-publish developer skills. The bridge runtime is the Releases zip + bundled in Adom Desktop, not this tarball.
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]