Skip to content

Testing and diagnostics

Play scripts

The client is driven by play scripts: text files that pick a modpack, wait for a state, click a menu item, walk, and assert on values the mods report. Twelve of them pass against a live vanilla server, covering block import, world render, returning to explored ground, entities, titles, boss bars, chat, flight, day and night and weather.

A script can send a command to the server's remote console. That is the strongest evidence available, because the words on the wire are Minecraft's own and not ours.

Recorded joins

A byte-exact recording of a real vanilla client's join is replayed over a loopback socket, so protocol work is verified rather than guessed. Two independent decoders agree block for block on thousands of checks against it.

Diagnostic counters

Mods publish [assert] name=value values, which scripts read. The ones that settled real bugs:

CounterMeaning
voxel.server.socket-1 none, 0 connecting, 1 open, 2 closed
voxel.server.greetedthe handshake has been sent
voxel.server.columnnoteone column's geometry against the window's
voxel.catalog.rows, rowsseen, readinginputs to "names are readable"
voxel.dress.at, cursorprogress of block-name resolution
voxel.keep.misses, lastmiss, sectionswhat a slide asked the keep store for
voxel.stream.restoredrestores caused by a window slide only

Lessons about measurement

  • Aggregates hide geometry. "1,176 sections outside the window" reads the same whether the window is one chunk off or in another world.
  • A counter told only when it changes makes its own reset invisible. Tell counters every frame.
  • A server's opening position is provisional. Reset walk counters on every placement, because a teleport is never travel.
  • A quiet log does not mean a mod is not running; a busy mod can shout everything else down. Run the mod headlessly to ask directly.
  • Every failure looks like "the server closed the connection" unless the socket counters exist, because the host reports every zero-byte read that way.

Frame cost

A slow mod frame reports where it went, for example how much of it was host calls and which call was busiest. That split is the whole question: in this project nearly all of a catalog row's cost was interpreted string-building on the mod side, not the host, and reading the bare millisecond number without the split led to optimising the wrong half more than once.

aoughwl — self-hosted platform for things n stuff. Contact / Support on Discord for access to the private backends.