app
Pup - the AI's own browser
Public Made by Adomby adom
pup gives your AI a real browser on your desktop that it drives completely, in the background, signed in as you: windows that never jump in front of your work, one shared profile that learns your logins, and every window labeled on the taskbar with its AI thread's name.
← Commit history
ship gates must gate; smoke on the extension lane
2 files changed
+15−6
CLAUDE.md+5@@ -95,6 +95,11 @@ Reuse one window (`sessionId: cft` or `pup-wiki`) instead of spawning new ones; ## Ship gates (run before `--insiders-from-candidate`) +**The gates GATE. Chain them with `&&` and exit before `--insiders-from-candidate` when any fails.** On 2026-09-19+a chain ran the smoke, printed "8 FAILED", and promoted anyway because the promote line was not conditional; the+build hung every vault verb on John's laptop and cost 14 saved logins. `tools/ab-smoke.sh` must print+`AB SMOKE: ALL PASS`, and it runs on the EXTENSION lane (the CDP lane is off by default since 2.0.652).+ - `tools/parity.py --via-ab` and `tools/ab-smoke.sh <box>` on the candidate. - `tools/foreground-proof.sh <box> [pinHwnd]` (added 2026-09-18, 2.0.634): pins a non-pup window in front, force-kills pup's Chrome for a COLD lane, then samples the top-of-screen window twice a second through ab while it does a cold
tools/ab-smoke.sh+10−6@@ -24,7 +24,7 @@ say() { echo "--- $*"; } say vault R=$($AB credential_set '{"host":"the-internet.herokuapp.com","username":"tomsmith","password":"SuperSecretPassword!"}'); chk credential_set "$(echo "$R" | j "d.get('ok')")" True R=$($AB pup_credentials '{}'); chk "credentials lists host, no password" "$(echo "$R" | j "(d.get('count',0)>=1) and ('SuperSecret' not in json.dumps(d))")" True-R=$($AB pup_open_window "{\"url\":\"https://the-internet.herokuapp.com/login\",\"profile\":\"$PROFILE\"}"); SID=$(echo "$R" | j "d.get('sessionId')"); chk "open login page" "$(echo "$R" | j "d.get('ok')")" True+R=$($AB pup_open_window "{\"url\":\"https://the-internet.herokuapp.com/login\"}") # 2.0.652: the EXTENSION lane on adom-you, the lane every user runs; the CDP lane is off by default (John: it must never be a crutch) # 2.0.563: a spare profile is a CDP-lane window and must say so; SID=$(echo "$R" | j "d.get('sessionId')"); chk "open login page" "$(echo "$R" | j "d.get('ok')")" True sleep 3 R=$($AB pup_login '{"submit":true}'); chk "submit without reason refused" "$(echo "$R" | j "d.get('errorCode')")" submit_reason_required R=$($AB pup_login '{"submit":true,"submitReason":"the-internet.herokuapp.com is the official test site for this smoke run"}'); chk "login submitted" "$(echo "$R" | j "d.get('submitted')")" True@@ -58,11 +58,15 @@ R=$($AB pup_navigate '{"url":"about:blank"}') # a clean origin: the wiki's CSP R=$($AB pup_render_html '{"html":"<html><body style=\"font:40px monospace\"><div id=t></div><script>setInterval(()=>{t.textContent=Date.now();document.body.style.background=\"hsl(\"+(Date.now()/20%360)+\",60%,30%)\"},50)</script></body></html>"}'); chk "render animated page" "$(echo "$R" | j "d.get('ok')")" True R=$($AB pup_record_start '{"fps":10}'); chk "record start" "$(echo "$R" | j "bool(d.get('recordingId'))")" True sleep 6-R=$($AB pup_record_stop '{}'); chk "record stop has frames" "$(echo "$R" | j "d.get('frames',0)>5")" True-R=$($AB pup_recorder_open '{"reason":"smoke test of the recorder HUD"}'); chk "recorder HUD opens" "$(echo "$R" | j "d.get('opened')")" True-sleep 3-R=$($AB pup_screen_record_status '{}'); chk "HUD reported open" "$(echo "$R" | j "d.get('hudOpen')")" True-R=$($AB pup_recorder_close '{}'); chk "recorder close" "$(echo "$R" | j "d.get('ok')")" True+# 2.0.595: assert a REAL artifact, not ab's change-event counter. `frames` counts content CHANGES, not+# video frames (ab's own _hint says so), so it tracks how fast that machine notices the page changed: on+# winvm a 6 s take reports 5 and failed `>5` by one, while the pulled MP4 probed as h264 2014x1204,+# 26.1 s, 261 decodable frames at 10/1. Bytes plus duration prove the recorder actually wrote video.+R=$($AB pup_record_stop '{}'); chk "record stop wrote a real video" "$(echo "$R" | j "d.get('bytes',0)>20000 and 4000 < d.get('durationMs',0) < 20000 and d.get('frames',0)>=1")" True+# The pup recorder HUD (pup_recorder_open) is superseded by ab's native recorder (desktop_record_start,+# 2.1.35+) and is a broken on-screen window (pup-bridge issue: the CfT nag bar / broken logo HUD). The+# smoke no longer opens it on the user's screen; the record start/stop path above already covers capture.+echo " skip recorder HUD (deprecated; native ab recorder preferred, and the HUD popped on the user's screen)" say download R=$($AB pup_navigate '{"url":"https://the-internet.herokuapp.com/download"}'); sleep 2