docs/testing/2026-08-16-pokeagent-performance/README.md

PokeAgent performance evaluation

Date: 2026-08-16 America/Chicago

Live snapshot: 2026-08-17T03:32:41Z

Session: embodiment-f9c39d68-c379-48a1-91c0-a41637d998fd

Environment: hosted pokemon-firered

Verdict

Clankie controls the real hosted FireRed body reliably, and the emulator, world transport, and voice path are healthy. The dominant cost is the agent loop: decisions arrive every ~22 seconds, only ~11% of wall time belongs to explicit helper-controlled frames, and the run remains in Oak's intro after ten minutes. Progress is also volatile when exact progress persistence is disabled.

The live proof covers boot, observation, actions, text entry, menu selection, frame progression, and voice delivery. It does not yet cover hosted overworld navigation, battles, multiplayer interaction, or a durable in-game save.

Live run

MetricValue
Wall time616.5s
Turns27
Accepted24 (88.9%)
Adapter rejections3 (11.1%)
Mind failures0
Throughput2.63 turns/min
Join to first action30.74s
Turn gap median / mean22.07s / 22.53s
Turn gap P95 / max36.35s / 43.07s
Logical frame34,836
Effective emulator rate56.5 FPS (94.2% of 60 FPS)
Helper-controlled frame time65.7s (10.7%)
Time outside helper-controlled frames550.8s (89.3%)
Inputs executed83
Accepted actions reporting a screen change20/24 (83.3%)
Unique observation digests27/27
Unique framebuffer digests23/27
Replayed actions0
Badges0
Cartridge save0 bytes
Resumed checkpointnone

The three rejections are two semantic_state_unavailable results and one dialog_not_open. Clankie changes strategy on the next turn each time, but the rejected decisions account for ~65.5 seconds of the observed timeline.

Timing attribution

The world transport is not the bottleneck. The delay from world-host action completion to Clankie's journal is 5.4ms mean, 8ms P95, and 12ms maximum. Logical emulation remains near real time while the model thinks.

helperFramesSpent / 60 measures explicit action-helper frame budget, not CPU time. The remaining 89.3% includes observation, inference, orchestration, narration scheduling, and idle time; it must not be labeled pure model latency.

The hosted FireRed setup reaches the overworld around frame 7,900 with the verified state-aware A-only intro path. This run is still in the intro at frame 34,836, 4.4x later in watcher-visible game time. It uses START twice and calls semantic helpers on undecoded screens, both avoidable sources of intro churn.

The same milestones improve over the preceding fresh run:

MilestonePreviousEvaluated runChange
Gender choice7m 08s4m 24s38% faster
Player named8m 08s6m 20s22% faster
Bedroom reached13m 42snot reached at snapshotpending

Voice

MetricValue
Narration requested14/27 turns (51.9%)
Spoken responses11
Deliberate silent completions2
In flight at snapshot1
First-audio mean / median576ms / 535ms
First-audio P95 / max660ms / 753ms
Playback mean9.39s
Playback range6.58s to 13.28s
Total spoken airtime103.3s (16.8% of wall time)
Fast-path use100%
Handoff latency0ms

Voice starts quickly. The concern is editorial rather than transport: half of the turns request narration and spoken updates average more than nine seconds during an intro.

Actual generated voice wording remains unavailable by policy. A play trace records the bounded event offered to the room and joins it to content-free delivery receipts; it does not retain PCM, a room transcript, or generated speech text.

Historical baseline

The snapshot covers 26 journals and 1,050 turn records. Eleven journals have a clean summary; fifteen historical journals end through later lease_lapsed lifecycle accounting after process replacement.

MetricValue
Action acceptance903/1,050 (86.0%)
Adapter rejection136/1,050 (13.0%)
Mind failure11/1,050 (1.0%)
Historical turn gap mean / median16.53s / 10s
Historical turn gap P95 / max52s / 180s
Summarized runtime125.4 minutes
Summarized turns729
Summarized throughput5.82 turns/min
Distinct turn-end tiles160
Weighted actions per new turn-end tile3.85
Turn-weighted coherence0.526
Viewer frames published / dropped44,583 / 21,304
Historical viewer-frame drop rate32.3%
Volition offered / taken727 / 69 (9.5%)
Volition suppressed / skipped94 / 503

The strongest productive run records 206 turns in 34.4 minutes, 96.6% action acceptance, 71 distinct turn-end tiles, and 2.84 actions per new turn-end tile. It reaches Viridian, explores its accessible buildings, obtains Oak's Parcel, and returns toward Pallet. A following run delivers the parcel, obtains the Pokedex and Town Map, and attempts the first catch.

Viewer-frame drops and logical emulator pacing are different metrics. The current emulator advances at 56.5 FPS even though older summarized runs drop 32.3% of frames offered to the viewer path.

Quality evaluation

An evaluation turn is a causal packet, not a score inferred from hashes:

The evaluator reports evidence and unknown separately for:

  • movement start, target, end, and effectiveness;
  • action appropriateness for the decoded scene;
  • stated intent to the action taken with it;
  • standing objective continuity and retirement;
  • structured execution result and observed effect;
  • rejection recovery, repeated failures, stalls, and recurring states;
  • narration offer, suppression, model silence, playback, a settled response nobody heard, or a missing receipt;
  • clean summary or terminal embodiment lifecycle accounting.

V1 journals remain readable but cannot reconstruct their missing semantic states. Their movement and scene judgments remain unknown, rather than being guessed from prose or digests.

Current instrumentation

  • Production journals use V2 causal evidence for new runs.
  • gameplay:evaluate-journal evaluates a journal with optional lifecycle and voice trails.
  • The launcher gives Clankie its configured play shutdown deadline plus a two-second reporting cushion, so ordinary restarts cannot preempt terminal play accounting.
  • Hard crashes are accounted by joining header.runId to the durable embodiment lifecycle event after restart reconciliation.
  • Hosted exact progress persistence is operator policy. It is disabled by default and enabled only with WORLD_PERSIST_PROGRESS=1 in the PokeAgents world host.

Rerun

pnpm --filter @clankie/play gameplay:evaluate-journal -- \
  ~/.local/state/clankie/gba-play/<run>.jsonl \
  --events ~/.clankie/events.jsonl \
  --voice-receipts ~/.local/state/clankie/discord-live-receipts.jsonl

The standard evaluator intentionally stores no ROM, savestate, screenshot, audio, credential, or full room transcript.