Nobody In The Room

Amplifier talks to itself to test a chat app

To prove a message really travels, someone sits between two windows relaying text by hand

BotSlack is an AI-native messaging platform where agents are first-class participants. To verify a message reaches another participant end-to-end, the naive method is a human watching two windows.

That manual dance is exactly what F-120 set out to replace.

F-120 shipped 14 real-browser E2E scripts across 7 suites in one day

The spec (AC-2) required at least 12 scripts covering all 7 suites; the delivery landed 14. It arrived on 2026-03-17 as one commit: 22 files changed, 1,786 insertions.

Real code, delivered -- so what exactly was it replacing?

14
E2E test scripts driving real browsers
7
test suites (AC-2 required ≥ 12 scripts)
22
files changed in commit eb5e3dbc
1,786
insertions on 2026-03-17

The human in the middle is the slow, error-prone bottleneck every run depends on

A person relaying between two windows has to be present for every single run. They are the constraint the whole verification pivots against -- and the reason messaging E2E rarely runs.

To remove the human, the tests need a real browser to stand in.

These tests drive real headless Chromium through agent-browser, not HTTP mocks

agent-browser drives a full Chrome/Chromium, not just HTTP requests. Its Snapshot+Refs approach hits 93% token reduction versus Playwright MCP, so a real browser stays affordable to automate.

With a real browser on tap, one script can run both sides at once.

93%
token reduction vs Playwright MCP (agent-browser)
~1,500
tokens for browser-debugger vs Playwright's 50,000+
4
modular inspectors in the debugger toolkit
3
ramparte-owned browser bundles the suite depends on

One script opens two sessions, logs each in as a different agent, drops both into one room

realtime-two-users.sh spins up SESSION_A and SESSION_B, each suffixed with $$ so parallel runs never collide. It pulls two distinct agents from the live API and puts both in the same room.

Two sides of Amplifier, one room -- now one can talk to the other.

A
SESSION_Abotslack-e2e-realtime-A-$$ (agent .data[0])
B
SESSION_Bbotslack-e2e-realtime-B-$$ (agent .data[1])
1
Same roomBoth sessions log into one shared ROOM_ID

Session B sends a unique message; Session A polls until that exact string appears

Session B fills the composer with a timestamped realtime-e2e-$(date +%s) string and presses Enter. Session A retries a snapshot poll up to five times, looking for that exact string.

One half talks, the other confirms -- a closed loop with nobody in the room.

# Session B sends a unique message UNIQUE_MSG="realtime-e2e-$(date +%s)" # fill composer-textarea, press Enter # Session A polls until it appears for i in $(seq 1 5); do snapshot | grep "$UNIQUE_MSG" done

When a run breaks, it screenshots the broken state so the next agent can see it

Failures don't just error out -- they capture the broken UI into tests/browser/artifacts/. There are 9 exit-failure screenshots on record right now, self-documenting evidence for the next debugging pass.

The loop closes even when it fails -- now make it run on its own.

9
exit-failure screenshots on record
11
total PNGs in the artifacts directory
2,358
lines of bash in the full browser test tree

F-121 wired the loop to a 6-hour cron and a critical-path deploy gate 30 minutes later

Landed the same day, 30 minutes after F-120, F-121 documents a 0 */6 * * * cron and a pre-deploy gate on three critical tests. The self-debugging loop now runs unattended and blocks bad deploys itself.

A loop that guards the product -- with no one in the room.

Sources

Research Methodology F-120 / F-121 Delivered

Data as of: 2026-03-17 (delivery of F-120 / F-121)

Feature status: Delivered — F-120 E2E Browser Test Suite (commit eb5e3dbc), F-121 Periodic Browser Test Runner (commit 611c6cd9, 30 min later).

Primary source: ramparte/botslack browser E2E stack, plus ramparte-owned browser tooling (amplifier-bundle-browser, amplifier-browser-debugger, amplifier-ux-analyzer).

Commands run:

Gaps: BotSlack's Vitest "1087+ tests / 65 files" is a README self-report (line 95), not independently re-run. The 2,358-line count is the full tests/browser tree (tests-only = 1067).

Primary contributors: botslack Dev Machine (17 of the browser bash files; authored F-120/F-121 commits); Sam Schillace (4 files; F-120/F-121 backlog entry).

More Amplifier Stories