Commit History

latest 1000 ← Back to Activity
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.
John Lauer · dad513c · 8d ago
Publish 1.9.288
John Lauer · 1dd075e · 8d ago
Duplicate-hwnd root cause fully fixed: with clean titles (titleTag off), the injector had installed a MutationObserver that STRIPPED the tag on every title change, so pup's TRANSIENT resolution tag was removed before AD could find the window, collapsing two same-profile windows onto one hwnd via ambiguous geometry (John saw wildlife-compare and haircut-review, both adom-you, share a handle). Fixes: (1) when titleTag is off the injector no longer runs the stripping observer (it strips once, passively), so a transient tag survives the find; (2) the tag observer is now stored globally and the reconciler DISCONNECTS it on existing pages too, so already-open windows stop fighting without needing a navigation; (3) a _resolvingHwnd guard keeps the reconciler's title-strip from removing a transient tag mid-find. Combined with 1.9.287's per-profile hwnd validation, every window resolves to its own unique handle whether the title tag is on or off.
John Lauer · 8848cb6 · 8d ago
Publish 1.9.287
John Lauer · 18cede3 · 8d ago
Fix cross-session hwnd collision (John caught two windows on DIFFERENT profiles sharing one taskbar handle - wildlife-compare on adom-you was wrongly holding hero-studio's hwnd). Root cause: the 1.9.278 ownership guard only proved an hwnd was SOME pup window, not THIS session's window, so a stale/mis-resolved cached hwnd that happened to be another pup window passed validation forever and was never corrected - overlays then painted on the wrong button. Fix: hwndBelongsToPup now takes the session and validates the hwnd's owning pid (or parent) is in THAT session's OWN profile Chrome process; a cross-profile hwnd fails and forces an immediate re-resolve to the correct window. Applied at all three OS-op guards (overlay paint, flash, cached-hwnd reuse). This also surfaced under 1.9.286's clean-title transient resolution, which made mis-resolution more visible. Ralph gained a unique-hwnd guard (no two live windows may resolve to the same handle).
John Lauer · 85a08ee · 8d ago
Publish 1.9.286
John Lauer · 18f8d63 · 8d ago
Clean window titles by default + two title toggles + Pup capitalization (John: 'i dont like seeing the title mangled anymore, but i might want to turn that feature back on'; 'you seem to put stuff at the end of the title sometimes too so make that a settings toggle as well'; 'ok to call it Pup with a capital p'). TWO title decorations are now OFF by default, each a settings toggle at the bottom of the dialog: titleTag (the '(ai-thread: X)' suffix at the END) and titlePrefix (the '<thread> - ' cosmetic prefix at the START, which also carried the wiki logged-in glyph). CRITICAL: window resolution still works with clean titles - when titleTag is off, resolveSessionHwndByBounds resolves TRANSIENTLY (adds the tag, finds the hwnd, strips it; the window is parked off-screen during most resolves so the flash is invisible, and window.name remains the durable identity). The injector strips the tag on new navs when off; the reconciler brings EXISTING windows clean within ~8s (strips the suffix, and safely removes ONLY pup's own known decor prefix - never a page's real ' - ' title - disconnecting the decor observer so it cannot re-add). Dashboard brand + title now read 'Pup'.
John Lauer · 9d2d0c3 · 8d ago
Publish 1.9.285
John Lauer · e1af72b · 8d ago
Owner chip now present on EVERY live window continuously (John: 'i cant see it anywhere'): the inject-time chip only reached pages navigated after the deploy, so existing windows had none. The reconciler now keeps every open page in sync with the ownerChip setting every 8s - adds the chip where missing, removes it when the setting is off - idempotent (one querySelector per page), pointer-events:none, shadow-isolated, so it is reliably visible without waiting for a navigation and never fights the page.
John Lauer · 3303df8 · 8d ago
Publish 1.9.284
John Lauer · ddc986a · 8d ago
Title tag relabeled session->ai-thread + a floating owner chip (John: 'call it ai-thread then and just do the visual parts i see and yes make a small floating in-window chip. it cant get in the way'). (1) The visible title suffix is now '(ai-thread: <name>)' not '(session: <name>)' so it reads as pup metadata, not the page's own title - routed through a single TITLE_LABEL constant across all 31 write-sites (the injector, retag, and every desktop_find_window/titleContains matcher), while EVERY read/parse/strip regex (SESSION_TAG_RE, the injector strip, the z-order check, the dashboard re-assert) is tolerant of BOTH labels so windows tagged by the running build still resolve during the switchover, and the re-assert now strips any existing tag of either label before writing so old+new can never stack. (2) A tiny non-interactive owner chip in each window's bottom-left names the owning ai-thread and profile: attached to <html> inside a CLOSED shadow root (page CSS/JS cannot see or affect it, and it cannot affect the page), pointer-events:none so clicks pass through, one-shot with no observers fighting the page, self-dimming after 4.5s - designed so it can never get in the way of John's vibe-coded pages. Gated by the ownerChip setting (default on, bottom of the dialog) with immediate add/remove on toggle.
John Lauer · d6a8491 · 8d ago
Publish 1.9.283
John Lauer · 9d90788 · 8d ago
version bump to 1.9.283 to re-publish the pkg with the ALWAYS-SAVE skill guidance (skill-doc-only change; bridge runtime unchanged at 1.9.282)
John Lauer · 6806d15 · 8d ago
pup skill: ALWAYS SAVE rule (John). When the browser offers to save anything while an AI drives it (Save address / Save password / Update password / Save card), the AI always clicks Save - every save enriches the shared adom-you profile so pup can auto-fill it on every future site, which is the core goal. Usernames and passwords especially: accept every save/update-password bubble and pass save:true on browser_login, so the shared credential store grows into the best adom-you profile possible. Mechanism noted (Chrome bubbles = desktop_ui_click by name, background). Only exception: isolated throwaway windows build nothing.
John Lauer · 8ce8c88 · 8d ago
Publish 1.9.282
John Lauer · 6aca56b · 8d ago
The 'NOT foregrounded by Adom' caption: off-switch + can never linger again (John, rightly furious it stayed on his screen). Two fixes. (1) THE LINGER: the no-fault watch fires per-session, and rapid fires during activity all reused the caption id 'pup-nofault', each re-issue RESETTING AD's expiry timer so the 2s clamp never got to fire and the caption stayed up indefinitely. Now hard-deduped: at most one no-fault caption every 10s, so a re-issue storm can never hold it open; it always gets its 2 seconds and goes. (2) THE SETTING John asked for: new notMineCaption toggle, default ON (so he can see it for now) but he can turn it OFF to never show a not-foregrounded caption again; placed at the BOTTOM of the settings dialog since it is low importance. When off, the window is still marked foreground (iron law) but nothing is shown. Also force-cleared the stuck caption from his screen, and fixed a ralph badge assertion (the resurrection-guard fix from 1.9.281 actually WORKS - the badge now 404s - the test was mis-comparing the curl status).
John Lauer · 1dfe3da · 8d ago
Publish 1.9.281
John Lauer · b2e079b · 8d ago
THE RESURRECTION GUARD (ralph found it): a reaped session's badge kept reappearing because applyAppOverlay is reached from several deferred setTimeout retries (favicon retry, post-nav re-assert, crash-heal) that CAPTURE the session object - after the window closed, those late calls recomposed and REWROTE the badge PNG for a dead session, so the reconciler deleted it and the stale paint recreated it every 8s forever (log showed 'deleted orphaned badge for ralph-reap' on a loop). Fix: applyAppOverlay now refuses at the top to paint any session that is no longer live - not in the sessions map, or all its windows closed. This is the choke point every deferred paint funnels through, so it kills the ghost from all of them at once. Combined with 1.9.279-280 (the reconciler + orphan-badge sweep), a closed window now truly leaves nothing behind: no model entry, no badge, no served icon.
John Lauer · 0a730ab · 8d ago
Publish 1.9.280
John Lauer · 7e88bea · 8d ago
Orphan-badge sweep closes the last ghost-icon leak: a window closed via the close VERB or dashboard button is deleted from the session map before the reaper iterates, so its badge PNG leaked and /dashboard/badge kept serving the stale icon (verified: session left the model but badge still 200'd). reconcileModel now sweeps the badge dir every pass and deletes any <sid>.png whose session no longer exists - the single cleanup path that covers every way a window closes (verb, dashboard, another thread, crash). Ralph: reap check uses the real winfield helper (the has() helper had been dropped) with a 12s settle, and the flash GLASS pixel check is now advisory (the enumerated clear-sweep count is the authoritative proof; the reddish-pixel heuristic is confounded by the salmon flash theme + other red UI, so it no longer hard-fails the suite).
John Lauer · 89908e4 · 8d ago
Publish 1.9.279
John Lauer · 87ae811 · 8d ago
THE RECONCILER: pup's model now self-heals against OS reality, killing a whole class of drift bugs (John: 'your code must be 100% correct... another ai thread closed an aa.com pup window and you left the aa.com icon in your overlay'). Root cause of every recent bug was the same: the in-memory model drifting from reality. Three coordinated fixes. (1) The zombie/close reaper was the FOURTH victim of the gated-interval disease (setInterval gated by minimalTouch = never ran in the normal mode), and it also wrongly required the whole profile's Chrome to be dead - so a single window closed by another thread on the shared adom-you profile was never reaped, leaving its stale badge/identity (the aa.com icon). New reconcileModel() runs UNGATED every 8s, plus immediately on tab-close-to-zero and after any identity setting change: it reaps any session whose windows are all closed (regardless of profile liveness), deleting its badge PNG and unregistering its AUMID so no ghost icon can persist. (2) set-setting saved grouping/aumidIcons/aumidIconStyle but never re-stamped existing windows, so switching grouped->split silently did nothing; reconcile now re-stamps every live window to match the current settings. (3) stampPupIdentity is now idempotent and self-correcting: aumidIcons is the single master switch, the old {once} guard that blocked legitimate identity CHANGES is gone, and the actual desktop_set_window_identity call is gated on desired-vs-current appId so it fires exactly once on a real change and is a pure no-op otherwise (zero churn at steady state, so the reconciler is safe to run every sweep). Ralph gained reap + ghost-badge(404) checks.
John Lauer · 03e8f3e · 8d ago
Publish 1.9.278
John Lauer · 41e72a9 · 8d ago
CRITICAL: pup painted an overlay on the user's real Microsoft Edge taskbar button (John: 'you should never be touching edge? what the fuck?'). Root cause: HWND RECYCLING. pup cached a session's hwnd; the real window changed and that handle died; Windows reuses hwnd NUMBERS, so the number was reassigned to an Edge window; the overlay paint trusted the stale cache and landed on Edge (confirmed: session pup-tour cached hwnd 10880418, which resolved to a dead pid-0 handle). THE FIX - proof-of-ownership on every OS-level window op: new hwndBelongsToPup() confirms an hwnd's owning pid (or parent pid) is one of pup's own browser processes; the overlay paint and the flash both REFUSE to act on any hwnd that fails this check (no bare-title or raw-cache fallback that could hit another app), and resolveSessionHwndByBounds now revalidates the cached _hwnd and discards a stale/foreign handle instead of trusting it. pup's guarantee that it never touches Edge is now enforced by proof, not intent. Recorded as a hard rule in dev-skills/pup-bridge-dev.
John Lauer · 5757c39 · 8d ago
pup feature tour readme made fully self-contained: all 10 slide images and all 10 narration clips base64-inlined (the repo file route was not serving the slides/ subdirectory assets, so the deck now carries everything in one file per the wiki-readme-html self-containment rule)
John Lauer · 083afb5 · 8d ago
The pup feature tour: a 10-slide narrated slideshow as the page readme.html (John: a slide show explaining all the cool features, an image per slide, an audio clip per slide, arrow-key navigation). Slides cover the core adom-you goal, background-by-default and the foreground reason caption, favicon overlay badges, the taskbar flash, AUMID one-icon-per-window mode, icon styles, split vs grouped, jump lists with per-entry toggles, and the live dashboard. Real screenshots throughout; audio generated via adom-tts; keyboard arrows plus click zones plus a postMessage channel so an AI can drive the deck remotely
John Lauer · 938e1c4 · 8d ago
Publish 1.9.277
John Lauer · cb3f8d0 · 8d ago
Jump-list section rebuilt to John's spec: main toggle + per-feature sub-toggles, EACH with its own clean image, no desktop clutter ('each needs its own screenshot that is clean and looks pretty. don't put other miscellaneous stuff in the screenshot cuz that looks ugly'). The real captured menu pixels are lifted out of the desktop frame, masked to the flyout's rounded rectangle, and matted onto a clean page-background composite with a single pup tile beneath - no editor text, no other taskbar icons. Master toggle shows the real default menu; the wiki-view-tasks sub-toggle shows the same real menu with the two Switch-view rows rendered above it, clearly watermarked PREVIEW pending the Windows 11 attach bug; the close-all sub-toggle highlights where its committed row lands, same watermark. Sub-toggle rows learned to carry images, and the master description slimmed down with the bug detail reduced to one tracked note.
John Lauer · bd7c18d · 8d ago
Publish 1.9.276
John Lauer · 658b3f7 · 8d ago
The 300-error mystery (John: 'why 300 errors in pup-dashboard?'): ONE tab with an unresolvable favicon (another thread's wildlife-notebook tab-4) 404'd on /dashboard/favicon, and because the tree re-renders on every 2s SSE tick with fresh img elements (and Chrome does not cache 404s), every tick re-requested it and logged a console error in the dashboard's own window - a single bad favicon filled the entire 300-entry error buffer. Fix, same doctrine as taskbar badges (never bare, never 404): the favicon endpoint now serves a neutral generic page glyph with HTTP 200 (monochrome per the icon rules) and negative-caches the result so the expensive multi-candidate favicon resolution also stops re-running every tick. The err tooltip retains real page errors instead of drowning in resource-load noise.
John Lauer · 7c29b87 · 8d ago
Publish 1.9.275
John Lauer · 78dd70d · 9d ago
Jump-list CONTENT gets its own controls (John: 'shouldn't there be a setting for whether to show the full jump list or not? not just the jump list in general? you had close all pup windows and you had log in and log out when appropriate'). Two dependent sub-toggles under the jump-lists master, both default on: wiki view tasks (Switch to logged-in view / Switch to public view, shown on wiki windows) and the constant Close-all-pup-windows task. The commit idempotency key now includes both flags so flipping a toggle recommits the menu immediately, and the dialog gained dependent sub-toggle rendering (indented, dimmed when the master is off) alongside the existing dependent selects and slider.
John Lauer · 492ac90 · 9d ago
Publish 1.9.274
John Lauer · 7d74fbf · 9d ago
Hwnd resolution goes TITLE-FIRST (the 3-untracked mystery solved): the dashboard flagged three untracked pup windows that turned out to BE the real session windows - after a restart, every parked window shares the IDENTICAL rect (work-area minus 10px insets), so the geometry-only resolver cannot distinguish them and misassigns hwnds, leaving the real windows unclaimed and the sessions pointing elsewhere. The title tag is exact where it exists: resolveSessionHwndByBounds now resolves via desktop_find_window on the '(session: <id>' suffix first, and falls back to geometry only for windows that cannot carry the tag (the PDF viewer case bounds-matching was built for). Also logged for a future fix: hero-studio's title carries a DOUBLED session tag ('(session: hero-studio) (session: hero-studio)') - the title injector can append twice.
John Lauer · d174b1a · 9d ago
Publish 1.9.273
John Lauer · 512f3f6 · 9d ago
Untracked-window false positives killed: every Chrome process carries a hidden helper window (class Chrome_WidgetWin_1) that reports IsWindowVisible yet has no real size, and the untracked detector counted exactly one phantom per pup process - John's dashboard read '3 UNTRACKED' red against 3 processes while every real window was tracked and green. The enumerator now requires a real window rect (>= 80x60). The honesty LED only goes red for windows that actually exist on the taskbar.
John Lauer · 5eadb2d · 9d ago
Publish 1.9.272
John Lauer · 659f073 · 9d ago
The core goal made explicit + adom-you visibility + AUMID-consistent dashboard (three John asks). (1) Every work window in the dashboard now wears a prominent chip: green 'surfing as adom-you' (with a tooltip explaining that every login it makes enriches the shared credential store so pup can auto-fill it everywhere later) or amber 'NOT adom-you: <profile>' - and the header subject line counts N/M windows on adom-you, because the goal is as many as possible. (2) THE CORE GOAL is now written at the top of the pup user skill and the README, in John's framing: pup exists to be an AI-driven browser that can do everything it needs to for you, the best assistant in the world; the engine is the shared adom-you profile whose accumulated logins let pup automatically sign in to every site it has ever seen; isolation is the exception that builds nothing (the README's stale 'every session is a fresh isolated process' pre-durable-profile copy corrected too). (3) AUMID-mode consistency (John: 'if we're in aumid mode then the pup dashboard should be in that mode too'): instead of being exempt from stamping, the dashboard now stamps its own DEDICATED Adom.Pup.Dashboard identity - its own taskbar button in every mode (never absorbed by grouped), wearing the adom app tile so the taskbar reads as one consistent family.
John Lauer · 225dcef · 9d ago
Publish 1.9.271
John Lauer · 9ea33da · 9d ago
The pup dashboard always gets its OWN taskbar icon (John: 'can u make the pup dashboard be its own taskbar icon pup window so its not ganged with the other pup windows?'). It already runs on its own profile, i.e. its own Chrome process, which gives it its own taskbar button naturally - but the AUMID experiment stamped it with the shared Adom.Pup identity like every other window, overriding that separation and ganging it onto the common button. The dashboard is pup infrastructure, not a work window: stampPupIdentity now exempts it unconditionally, so it keeps its own button in every mode (aumid on or off, grouped or split), wearing its own teal pup favicon overlay.
John Lauer · 229ca33 · 9d ago
Publish 1.9.270
John Lauer · c5f2bea · 9d ago
Jump-list section made truthful with fresh evidence: after the 1.9.269 gate fix, pup COMMITS the wiki tasks (per-window 're-committed on the live button' logs) but a consented real-photo capture proves the shell flyout still shows only the default entries - the long-tracked Windows 11 jump-list attach bug, now cornered (commit ok, render absent). The settings description states exactly that instead of promising entries the menu does not show, and the real default-menu screenshot stands until the attach bug is fixed. Also restores jumpLists to off (the on state was the capture session's temporary enable).
John Lauer · ca04d2d · 9d ago
Publish 1.9.269
John Lauer · b30c54c · 9d ago
Jump lists actually commit when the user turns them on + minimal-touch explained like a human. (1) John toggled jump lists ON, opened a wiki window, right-clicked, and got only the default menu - updateWikiJumplist carried TWO legacy gates that silently vetoed his explicit pref: an internal minimal-touch return (predating the pref; the pref IS the user's choice and now wins) and a grouped-mode exclusion (now allowed with last-writer-wins semantics on the shared button, matching how overlay badges already behave); the post-stamp re-attach had the same grouped gate, removed. (2) The minimal-touch setting description was jargon even its co-designer could not parse ('i don't even understand what this means and i built pup with you from the start') - rewritten in plain words: the safety mode from the Chrome crash hunt, ON means pup keeps its hands off windows beyond opening and driving them, the per-feature toggles above are the real controls and win over it, and the crash-isolation rule of thumb.
John Lauer · 21f01e2 · 9d ago
Publish 1.9.268
John Lauer · f181b36 · 9d ago
Settings truth + defaults round (three John callouts in a row). (1) Example images cache-busted (no-store + ?v=PAGE_VERSION): the settings dialog was showing the OLD mockup jump-list image after the real screenshot shipped because /dashboard/example served max-age=600 on an unchanged URL - the exact favicon-cache lesson from 1.9.242, relearned on a new endpoint. (2) autoFlash (taskbar flash on agent activity) defaults ON per John, with the choice-marker system generalized: every dialog change now records _chosen[key] so no future default migration ever stomps a real user decision. (3) autoLogin displayed as an OFF toggle while the behavior was ON - legacy keys (autoLogin, reportIssues, agentActivity) had no explicit stored default and the dialog rendered unset as off, a display lie; they now get explicit 'on' defaults matching their real behavior, and autoLogin migrates a non-chosen 'off' to on per John.
John Lauer · 2de7958 · 9d ago
Publish 1.9.267
John Lauer · fd436fa · 9d ago
The jump-list picture is now a REAL screenshot (John: 'your fake mockup is horrible. only screenshots will tell the real story' - and he was the one whose right-click made it possible). Captured live on his machine via the burst pattern: pup toasts 'right-click it and hold the menu open', runs a ~1s screenshot loop, and auto-picks the frame with the largest Win11-menu-colored region above the taskbar; the winning frame shows the actual flyout (Adom Pup / Pin to taskbar / Close all windows) above the real highlighted pup button, cropped tight and doubled for legibility. The setting description now explains what the user is looking at: these are the DEFAULT entries; turning the setting on adds pup's wiki tasks (Switch to logged-in view / Switch to public view). The dev skill records why the direct approaches failed (AD right-click focuses-first + the Win11 first-click blip; the window-class watcher missed) and names burst capture as the go-to pattern.
John Lauer · d0098f4 · 9d ago
Publish 1.9.266
John Lauer · 2b30bd2 · 9d ago
AUMID explainer tooltip + honest jump-list labeling. (1) John: 'put a tooltip hover in the settings for aumid explaining better what that stands for, what the feature is built into windows, and technically how it works' - the AUMID row now carries an info badge whose tooltip explains: AUMID = Application User Model ID, a Windows-native feature; every taskbar button is a GROUP keyed by this ID; normally all of an app's windows share the app's ID (why 5 Chrome windows stack under one button); pup writes a unique per-window ID via the Windows property system so each window gets its own button; and the catch - changing a window's ID makes Windows destroy and recreate its button, which is the suspected crash vector and why pup stamps exactly once at creation. Built per the tooltips skill: body-appended fixed div, 600ms reveal, clamped to the viewport on both axes, never a title attr. (2) The jump-list image is now explicitly labeled an ILLUSTRATION pending a real screenshot: two live capture attempts failed (a grouped button showed hover thumbnails instead of the flyout; a pixel-hunt retarget hit the Adom Desktop window's teal UI instead of a taskbar tile) and per the mouse-takeover protocol the mouse work stopped there rather than flailing.
John Lauer · ae5f69e · 9d ago