Run three phone participants in one public lobby
Point a shared-world study at a public multiplayer app you operate, and watch three phone-sized participants create and join one lobby at the same time.
lobby-trivia-3player.yaml
in the humanish repository is a worked example of the external-public shared-world route. Copy it
into your project's humanish/studies/ to run it. Three phone-sized participants play the same
multiplayer lobby on a public deployment at once, and one Observer shows all three. Point subject.appUrl and subject.publicTarget at a
deployment you own or operate.
What the study does
- The public site is the shared plane. humanish clones nothing, starts no subject sandbox and seeds no data.
- The participant marked
host: truecreates the lobby first. humanish reads the/lobby/CODEpath from the host's browser and puts the code into the other participants' missions. Those participants join through the app's own Join flow, because visiting/lobby/CODEdirectly does not make a visitor a member. - The study passes when all three participants reach the same
/lobby/CODE(lobbyConvergenceDigest, a digest only) and their sessions overlap in time.
Make the participants phone-sized
The participants use the mobile (414×896) and small-mobile (360×740) presets. Without mobile
emulation, a hosted desktop renders both at 500 CSS px wide, because Chrome refuses a narrower
window, so the two presets lay out the same and only the heights differ. The participants also get
no touch input, and the device pixel ratio stays in the prompt and the metadata.
Add mobile emulation to the study so each participant gets its preset's real viewport:
execution:
desktop:
fidelity:
mobileEmulation: trueWith it, each Chrome or Chromium participant on a mobile preset browses at its preset width (414
or 360 CSS px), with the preset's device pixel ratio, touch events and a mobile user agent. The run
bundle records what the page reported under desktopGeometry.fidelity. Emulation is still not a
physical phone. Mobile emulation lists the settings and the
read-back.
Run it
A dry run is the default. It costs nothing and checks the study's plumbing and its evidence contract without sandboxes or model tokens:
npx humanish run lobby-trivia-3playerFor a live run, set mode: live in the study, then run it with OPENAI_API_KEY and
E2B_API_KEY available:
npx humanish watch lobby-trivia-3player --dotenv .env.localTo watch from a phone, serve the run's Observer through an authenticated edge:
npx humanish observe --all --expose --tunnel ngrok --oauth google --allow-email you@example.comwatch --expose streams live desktops only on the computer-use route, so a shared-world run is
watched through observe --all.
What the evidence claims
The operator attests to owning or operating the deployment
(subject.publicTarget: { owner, authorized: true }); humanish cannot verify that. The run
records shared-world attribution, N participants on one plane, and humanish verify checks that
it claims nothing stronger:
- provenance is
external-public, because humanish seeded nothing; - there is no synthetic attestation, because a public site is not synthetic;
- the operator controls the plane, and humanish only observed it;
- there is no authoritative shared-state proof;
- concurrency rests on overlapping sessions and the observed lobby convergence.
One run says nothing about adoption, scale or repeatability.
Check the app before a live run
The lobby mechanics in this study were read from the app's source at the time it was written: the
create and join calls that lead to /lobby/CODE, the six-character code alphabet
ABCDEFGHJKLMNPQRSTUVWXYZ23456789, and the rule that a direct visit does not join. A new deploy can
change them. Check the two places the study depends on: the lobby-code pattern
(/\/lobby\/([A-Z2-9]{6})(?:$|[/?#])/, which tolerates a locale prefix, a query and a hash) and the
wording of the join mission the other participants follow.