Go to file
type-two 82d5ff494c fix: promptEchoed matched a 60-char PREFIX — 13 prompts silently skipped
THE ROOT CAUSE of the djsim_phonewall run, and it was never Flow.

promptEchoed() answered "has this prompt already been submitted?" by searching
the chat pane for prompt.slice(0, 60). All 15 calendar prompts open with the
same 60 characters:

  "The illustrated top picture-panel of a cheap 1979 promotiona"

So once Alien's prompt was echoed in the chat, every subsequent calendar looked
already-submitted. The driver logged "Prompt already echoed in the session —
not re-typing", typed nothing, and waited out the full 3-minute image timeout.
Thirteen times, at a metronomic 3m30s apart. Flow was working the whole time.

No fixed slice is safe: djsim_phonewall needs 160 chars of PREFIX to
disambiguate its prompts; djsim_batch3 needs 190 chars of SUFFIX. So match the
whole normalized prompt, or (if the DOM mangles the middle) require both ends
in the same element. Whitespace-normalized, with the container guard kept.

test_prompt_echo.mjs pins it: asserts the old impl DOES false-positive, the new
one doesn't, that it still fires as the "it stuck" signal, survives DOM
whitespace reflow, ignores a page-sized container, and that every prompt in
every bank is distinguishable from all its neighbours (0 missed, 0 cross-matched).

The circuit breaker from the previous commit stands: it would have stopped this
after 3 instead of 13. But the driver should never have been silent in the
first place.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 19:07:10 +10:00
banks art(bank): djsim_phonewall — 15 cursed 1979 wall-calendar picture prompts (Skylab/Alien/Joy Division/…) 2026-07-08 13:13:08 +10:00
.gitignore Flow rinse: browser downloads, fast-fail, autoStart, launcher + self-healing launchd 2026-07-06 01:20:32 +10:00
background.js fix(harvest): four verified stages — pill wait, menu wait, jiggle-hover flyout, download-event confirmation 2026-07-08 09:03:25 +10:00
content.js fix: promptEchoed matched a 60-char PREFIX — 13 prompts silently skipped 2026-07-08 19:07:10 +10:00
flowclient.py Flow rinse: browser downloads, fast-fail, autoStart, launcher + self-healing launchd 2026-07-06 01:20:32 +10:00
games.monsterrobot.flowrinse.plist Flow rinse: browser downloads, fast-fail, autoStart, launcher + self-healing launchd 2026-07-06 01:20:32 +10:00
install.sh Flow rinse: browser downloads, fast-fail, autoStart, launcher + self-healing launchd 2026-07-06 01:20:32 +10:00
launch.sh Flow rinse: browser downloads, fast-fail, autoStart, launcher + self-healing launchd 2026-07-06 01:20:32 +10:00
local_server_example.py fix: circuit-breaker on failure streaks; stop binning rate-limited tasks 2026-07-08 18:57:56 +10:00
manifest.json Flow rinse: browser downloads, fast-fail, autoStart, launcher + self-healing launchd 2026-07-06 01:20:32 +10:00
popup.css Flow Auto-Pilot: trusted-CDP input driver, local queue server, 91-prompt bank 2026-07-05 22:44:10 +10:00
popup.html fix(harvest): robust Download-row finder + two-step hover + Copy Log button + 300-line log 2026-07-08 11:33:18 +10:00
popup.js fix(harvest): robust Download-row finder + two-step hover + Copy Log button + 300-line log 2026-07-08 11:33:18 +10:00
queue.jsonl content.js: auto-click "Try again" on Flow's transient error; fix 2 queue ratios 2026-07-06 01:40:25 +10:00
README.md Flow rinse: browser downloads, fast-fail, autoStart, launcher + self-healing launchd 2026-07-06 01:20:32 +10:00
requeue.py fix: circuit-breaker on failure streaks; stop binning rate-limited tasks 2026-07-08 18:57:56 +10:00
test_prompt_echo.mjs fix: promptEchoed matched a 60-char PREFIX — 13 prompts silently skipped 2026-07-08 19:07:10 +10:00

Flow Auto-Pilot

A Brave extension + local queue that drains a prompt bank through Google Labs Flow (Nano Banana 2 images, Veo videos) on the webui-only credits you can't reach via API. The extension types prompts into the Flow agent box with trusted CDP input (Flow ignores synthetic DOM events), waits for the media grid to grow, harvests the new asset URLs, and downloads them with the page's session cookies.

Not headless: Brave must be running and logged into the Flow account. But once the tab is open with Auto-start ticked, it runs unattended.

Parts

File Role
manifest.json, background.js, content.js, popup.* the Brave MV3 extension
local_server_example.py queue server on :8017queue.jsonl in, results.jsonl out
queue.jsonl the prompt bank (one task per line)
flowclient.py enqueue() / wait_for() so a game project can request assets
launch.sh start server + keep Mac awake + open/focus one Flow tab
install.sh + games.monsterrobot.flowrinse.plist self-healing launchd agent

Run it by hand

./launch.sh https://labs.google/fx/tools/flow/project/<PROJECT_ID>

Server comes up (under caffeinate), Brave focuses the Flow tab, and with Auto-start ticked the rinse begins. Files land in ~/Downloads/flowrinse/<category>/.

Run it unattended (launchd)

./install.sh

Fires launch.sh at login and every 10 min. Because launch.sh is idempotent (port check + tab reuse), the repeat runs are no-ops that self-heal a dead server or a closed tab.

macOS TCC gotcha (same as the vault-backup job): launchd can't execute scripts inside ~/Documents, so install.sh runs a copy at ~/Library/Application Support/flowrinse/. That copy owns the live queue.jsonl / results.jsonl / downloads/ once the agent is running. Re-run ./install.sh after editing launch.sh or local_server_example.py to resync the copy. First run pops one Automation prompt (allow control of Brave) — click Allow on the rig's screen.

launchctl kickstart -k gui/$(id -u)/games.monsterrobot.flowrinse   # run now
launchctl bootout   gui/$(id -u)/games.monsterrobot.flowrinse      # stop it

Enqueue from another project

from flowclient import enqueue
enqueue("Sierra EGA record-store back room, 160x168, 16-color",
        kind="image", category="morp2_bg")

Or over the wire: POST http://localhost:8017/enqueue with {"prompt","kind","model","category","dest"}.