Six characters fight one Dynamis Divergence wave inside an 18-player alliance: a Bard, a Geomancer, a White Mage, a Corsair, a Blue Mage and a Warrior. Each plays the actions its own character played in recordings taken at a busy Locus imp camp. The other twelve players and the monsters act at the rates recorded around the party there, mapped onto the alliance. Three GearSwap suites run that fight on the same gear. Rahvin GS 2.1 runs as it ships. Mirdain 1.5.12 is the original include it grew from. Selindrile is a third author's suite. Each suite runs in two states. Lean has the optional machinery switched off. Moderate uses each suite's own defaults plus the modes this party plays. The method and the caveats are on the last sheet.
An earlier copy of this report charted Rahvin GS 2.0 from a run of 2026-09-13. The measurement has changed a great deal since, most of all by pricing GearSwap's own work from the game, so no figure here compares with that copy. The last sheet lists what changed.
Every suite's cost splits four ways. Two parts are GearSwap's own work, run for the suite: its refresh, and the walk through the bags it runs around every event. Both are priced from timings Rahvin took in the game on his own six characters. The third part is the Windower crossings the suite makes, also priced from the game. The fourth, the rest, is the suite's own code.
The two flows below trace GearSwap's work and each suite's own code to the kinds of event that cause them, and the four sections after them take each cause in turn.
GearSwap's refresh and its walk are most of every suite's cost, and a suite decides how often GearSwap runs them by what it hands GearSwap and when. The flow reads left to right: each suite's GearSwap work on the left, the kinds of event that set it off on the right, and a band for every pairing, as wide as its share.
The same split for the rest of the bill, each suite's own code: what remains once GearSwap's refresh and walk and the Windower crossings are taken out, measured in the sandbox on the real clock.
Cause 1
Before GearSwap hands an event to a job file, it refreshes its picture of the player, the world and the party. Most of that work is the bags: every refresh rebuilds every bag the character owns, item by item, whether anything changed or not. In Rahvin's own timing in the game the bag rebuild was 79% to 94% of a full refresh, so a refresh costs more the more a character carries.
A refresh comes in two sizes. A full one also rebuilds the character's own record. GearSwap runs a full refresh before each action the player types, again when the action completes, and for every buff packet that changes a buff, every status change and every gs c command. An event a suite registers through GearSwap's wrapped registration gets a short refresh if the last refresh was 0.05 to 0.5 seconds before, a full one if it was longer, and none inside 0.05 seconds. A short refresh still rebuilds every bag, so it costs about what a full one does.
Why the suites differ.
Cause 2
Around every event it runs for a suite, GearSwap reads the gear the character wears and then walks the equippable bags, the inventory and eight wardrobes, 720 rows in all, to match what the handler proposed against what the character carries. It walks them even when the handler proposed nothing.
Why the suites differ.
Cause 3
Cause 4
Some of a suite's work leaves Lua and crosses into Windower: writing text into an on-screen box, drawing a screen primitive, decoding a position packet, reading a character's or a monster's record. The sandbox counts each crossing, and each is priced from Rahvin's own timing of it in the game.
Three differences between the model and the game are known and left in place, each measured on Rahvin GS 2.1 and recorded with its size rather than modeled. None moves any column by as much as one percent.
Mirdain 1.5.12 registers no per-frame handler; its prerender row in the background table is the bare dispatch. Rahvin GS 2.1 registers two, kept separate so an error in one cannot stop the other. One runs the enchanted-item, Hoxne and thrown-item ticks behind clock compares. The other is the received-gear failsafe, which returns at once unless a received-gear hold stands. Selindrile's library registers two as well: its automation tick and its own 0.1 s movement poll. Selindrile's Geomancer job file adds a third, which draws its luopan's status box.
One full action chain: pretarget where the suite sends one, precast, the outgoing packet, the action packets, midcast and aftercast, and whatever follow-up the suite queues for itself. Every recast-table read and all chat formatting up to the point a line is handed to Windower are included. Identical gear lands on every suite, so the differences are plumbing: how much selection, merging and bookkeeping each suite runs to dress the same action.
These figures are measured in the sandbox, with the sandbox's light stand-in for GearSwap's bag walk inside them. GearSwap's refreshes and its full walk around the same chain are priced in the causes above.
Background paths scale with the traffic around the character rather than with how often it acts.
A party does not stand on one mob for the whole fight. It fights one monster at a time, kills it, disengages, runs to the next and re-engages. Disengaging and re-engaging each run a full set build and equip through every suite's status-change path, and GearSwap refreshes for each status change. The movement rows show two designs. The Mirdain-lineage engines check position inside their engine pass on the character's own outgoing packets. Selindrile polls on its own per-frame handler.
When a party member casts a tracked spell on you, gear for the incoming effect is only worth wearing if it lands before the spell does. Two of the three suites have a mechanism, built differently. Rahvin GS 2.1's is cross-client. The caster's client sends an IPC message when the cast starts and another when it ends, so the target's window is the whole cast time less one same-machine hop. Selindrile's is local. Selindrile's Sel-Stahp engine reacts to the server's own casting echo, so its floor is the server round trip, and its swap is suppressed while the receiver is mid-action. Mirdain 1.5.12 predates the system.
A fair comparison starts with what each suite is trying to be, because these are not three attempts at the same product. Selindrile is a self-contained product. Selindrile aims to play the character: an automated character with an on-screen HUD, some thirty optional automation subsystems and a packet-reaction engine, all inside one suite. The two Mirdain-lineage engines draw a narrower boundary. They swap gear. The player either drives the character by hand or pairs them with outside software that handles spell and ability sequencing. What Selindrile builds in, this lineage leaves outside GearSwap. Within that boundary, 1.5.12 is the original include, with modes, keybinds, a status box, movement gear and Treasure Hunter. Rahvin GS 2.1 keeps that surface, with its keys rebindable per character, and adds an enchanted-item engine, Hoxne Ampulla automation, gear reporting on four channels, a slot-ownership ladder for held gear, sets keyed to active buffs, a scored day, weather and distance chooser, four on-screen display styles, per-character settings and the only cross-client received-spell gear system in the field. It is a much larger body of code: about 13,700 lines across fifteen component files, against 3,300 lines in 1.5.12's single file.
The Mirdain-lineage cells were verified against each engine's source. The Selindrile inventory was read from its source at the pinned upstream commit of 2026-07-23. Selindrile ships dated example gear, which is why every measured column runs the same ported, parity-checked loadouts instead.
A gear-swap layer that runs nothing you did not ask for.
A gear-swap layer beside outside automation software. The Mirdain-lineage engines are designed as exactly this, with sequencing left outside GearSwap. Rahvin GS 2.1 at its defaults adds the layers a driven character benefits from: set naming, empty-set detection, a wearability check on the items it equips for itself, the received-spell IPC, enchanted-item handling and held gear for capacity-point pieces. What the outside tool itself costs, no column here can see.
Automation living inside the GearSwap suite. That is Selindrile: some thirty subsystems on its automation tick, an on-screen HUD and packet-reaction gear. Selindrile aims to play the character, and its columns price that ambition.
The earlier copy of this report, from the run of 2026-09-13, charted Rahvin GS 2.0. Most of the difference between its figures and these comes from the measurement, which changed a great deal. So nothing on this page is a change between releases, and no figure here should be set beside that copy's. What changed in the measurement:
None of these is a change between Rahvin GS releases. They change the measurement, which is the same for all three suites.
A cell is only comparable within this run. The scenario, rates and model are rebuilt for each run, so a figure here is not the same measurement as the matching cell in an older copy of this report. The suites are compared against each other on identical input.
GearSwap's prices are Rahvin's characters'. A refresh rebuilds every bag, so its price follows how much a character carries. A character with fuller or emptier bags than Rahvin's pays more or less per refresh on every suite alike. The rates were recorded at a busy camp, not in a Divergence wave, and the alliance's twelve are added to the refresh by inference.
What was measured in the game, and what was not. GearSwap's refresh and walk, the Windower crossings and the fight's rates come from the game. The suites' own code runs in the sandbox on the real clock. No figure here is a measured frame rate: the frame chart is engine work against a frame's length.
The two lineage columns are whole trees of different ages, not engine files. Rahvin GS 2.1 is measured as it ships, with engine, gear library and job files together. 1.5.12 runs the job files as a later Mirdain-named release shipped them. So the gap between those two columns is what a player moving from the original include to this suite would see, and it is not purely the engine. No arrangement isolates the engine and stays realistic, so the realistic one is reported.
The suites draw the automation boundary in different places. Selindrile bundles play automation into the measured suite. The Mirdain-lineage engines are designed as the gear-swap layer of a setup where sequencing, if automated at all, runs outside GearSwap, where no column here can see it. A moderate-state gap between them is partly a boundary difference. The lean and parity columns are less affected, because optional automation is off there, with one stated exception: Rahvin GS's received-spell system keeps its shipped default, so its lean column carries a subsystem 1.5.12 does not have.
Memory is a within-run comparison. All three suites are measured in one process, so what a character finds already loaded depends on what ran before it. The per-box ranking and the gaps between suites hold; the exact kilobytes belong to this run. The live-heap column in the memory table is a whole-process reading, which is why every suite's rows sit at a similar level. Read it as an envelope and never rank it. None of this is a leak in any suite.
How far to trust the small differences. Treat gaps of a few percent in the suites' own code as noise and read the ranks. GearSwap's priced work carries the in-game prices' own uncertainty, and the same prices price every suite.
What the plus or minus covers, and what it does not. Three limits are not random, so no standard error measures them, and they stay here as ranges. Timed in a hot loop, not in the fight: GearSwap's refresh, timed both ways, cost 2% to 17% more in the fight than in a hot loop for a full refresh and 13% to 26% more for a short one, on the characters the model runs; the suites' own code is timed in hot loops and has no in-fight timing to set beside it. Loaded or quiet: this project's timings in the game on a machine other work was loading read up to 22% slow against a quiet one. One camp standing for a Divergence alliance: run at the camp as it was, the model sends 0.93 to 1.07 of the equip calls the camp session made; mapped onto the alliance, 0.79 to 0.94, from the alliance's kill rate. The recorded rates' own sampling error is not in the plus or minus either: measuring it would take the model re-run on resampled rates.
What the price part covers.
One price rests on a ratio.
Small gaps against the game, left in place. Where a gap was sized, it was by running the fight once more with the gap closed, and none of those moves a column by more than a quarter of one percent or one character's figure by as much as 1%. What was not sized says so.
Selindrile is measured at its pinned upstream commit of 2026-07-23, on ported gear, with its shipped defaults. Claims about Selindrile are claims about that version on this scenario and nothing broader. Selindrile's measured columns exist because its library genuinely boots, casts, equips and tracks here, verified end to end before any number was recorded.
This report compares feature-bearing suites. Gear-swap frameworks that ship machinery for job authors rather than finished features for players are a different product class. Ranking one beside these three would compare unlike work, so none is included.
Chat volume.