GearSwap suites · Divergence three-suite reportSheet 1 / 4 · At a glance & what the cost is made of
Mirdain 1.5.12 · Rahvin GS 2.1 · Selindrile · six boxes · 18-player alliance · every chart says which way is better

Three suites, one Divergence wave

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.

At a glance

    Best on each measure

    What the cost is made of

    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.

    Engine CPU for the whole six-client box per second of fighting, moderate state, split by cause. Each bar is one suite; the shades of its color are the causes, in the legend's order. Hover or focus a part for its figure.
    Numbers

    Where GearSwap's work comes from

    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.

    GearSwap's refresh and walk at Rahvin's in-game prices, whole box, moderate state, split by the kind of event that set each one off. Bands are as wide as the work they carry. Each kind of event on the right is drawn in three parts, one per suite in the order of the left, with each suite's figure beside its name. Hover or focus any band or part for its figure.
    Numbers

    Where each suite's own code goes

    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.

    Each suite's own code, whole box, moderate state, split by the kind of event it ran for. Each kind is the sandbox's measure of it less two things the first flow and the crossings price from the game instead: the sandbox's own run of GearSwap's walk, exactly as often as each timed step made it, and the sandbox's own cost of the reads. Hover or focus any band or part for its figure.
    Numbers

    Cause 1

    GearSwap's refresh

    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.

    GearSwap refreshes a minute across the six clients, moderate state. A skipped call is a wrapped event inside 0.05 seconds of the last refresh: it costs no refresh, but the walk below still runs.
    Numbers

    Cause 2

    GearSwap's walk around every event

    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.

    Numbers

    Cause 3

    Each suite's own code

    The suite's own code for the whole box, per second of fighting, in both states: what remains once GearSwap's refresh and walk and the Windower crossings are taken out.
    Numbers

    Cause 4

    Windower crossings

    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.

    Windower crossings a minute across the six clients, moderate state, by kind. Their priced cost is in the table.
    Numbers
    GearSwap suites · Divergence three-suite reportSheet 2 / 4 · Per character, memory, frames

    Per character

    Engine CPU per client per second of fighting, moderate state, split by cause as above. Each group is one character; each bar one suite.
    Numbers

    Three small gaps against 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.

    • Party songs on the casters. A party song lands on the Geomancer and the White Mage as on everyone else, where the casters' own recordings show some songs rising and falling on them. It moves the White Mage's Rahvin GS 2.1 figure by about 1.04%, give or take 0.5%, the Geomancer's by 0.75%, and that column by 0.22%.
    • The Geomancer's Regen. The White Mage's area Regen IV keeps the Geomancer's Regen up, where the Geomancer's recordings had no White Mage beside her. It moves the Geomancer's Rahvin GS 2.1 figure by about 1.70%, and each of the other five characters' by 0.55% to 0.85% the other way. Across the column it nets to between +0.19% and +0.44%.
    • Buff changes in one packet. Buff changes that arrive in one packet in the game fire one at a time in the model. It moves the White Mage's Rahvin GS 2.1 figure by about 1.67% and four other characters' by 0.35% to 0.58%, and that column by 0.52% in all, 0.16% of it the White Mage's.

    Actions Selindrile's queue drops

    Memory churn

    Memory allocated for the whole box per second of fighting, moderate state, split by cause as above.
    Numbers

    Memory held as boxes are added

    What each suite keeps in memory as boxes are added, moderate state: the first box's figure, then the per-box figure for each box after it.
    Numbers

    Garbage collection

    Frame time

    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.

    Worst frame per client

    Numbers
    GearSwap suites · Divergence three-suite reportSheet 3 / 4 · Actions, the race, the suites

    Cost of one action

    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.

    Cost of one complete action chain, per action, moderate state. The line spans the cheapest suite to the dearest on that action. Hover a dot for its figure.
    Numbers

    Background events

    Background paths scale with the traffic around the character rather than with how often it acts.

    Cost of one background event, measured on the Bard, moderate state, in the sandbox. Costlier one-off events sit in the table rather than the chart, where their scale would flatten everything else.
    Numbers

    Killing a mob and moving on

    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.

    Cost of each step of the kill-and-travel cycle, per event, measured on the Bard, moderate state, in the sandbox.
    Numbers

    The received-spell race

    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.

    Numbers

    What each suite is

    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.

    Which features each suite has

    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.

    Feature notes

    Which suite fits which player

    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.

    GearSwap suites · Divergence three-suite reportSheet 4 / 4 · What changed, method, caveats

    What changed since the earlier copy

    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:

    • GearSwap's own work is priced from the game. Its refresh and its walk around every event were left out of the earlier run as identical for every suite. They are neither small nor identical: the suites trigger them at very different rates.
    • The fight comes from recordings. Its rates were recorded at a busy Locus imp camp, Rahvin's six characters among other parties, and mapped onto an 18-player alliance: the packets in and out, the buff changes, the monsters' actions and where they land. Kill times and the alliance's skillchains on the party's monster stay stated, since they depend on eighteen attackers and Divergence monsters.
    • Each character plays its own recorded actions. The rotations stated in August are retired. The Corsair, for one, now fights in melee, as it did at the camp, where it fired no shot.
    • Frame rates are Rahvin's own caps. The Blue Mage runs in the foreground at 60 fps and the other five in the background at 20. The earlier run had the Bard at 60 and the rest at 30.
    • The melee timer follows the game's rules. An ability, weapon skill or spell resets the swing, and a ranged shot pauses it for the whole shot.
    • Boot memory is read once the heap settles, and each client loads its own copy of every table it touches.
    • Windower crossings are priced from the game: text writes, screen primitives, position decodes and record reads.
    • The measurement cells themselves were corrected. Before any of the pricing above, those corrections had already moved cells measured on 2026-09-13: a cast chain by +23%, the engine's packet pass by +82% and the movement poll by +63%. Every cast now also allocates 0.625 KB more, for a fuller spell record.
    • Events the game spreads out are spread as Rahvin's trace session timed them: a character's presses and their lead-in, the members engaging and going idle, and status changes arriving on the server's packet bundles. A buff packet that carries several changes runs one refresh, as every buff packet in the trace did.
    • Each timed step runs what the fight runs. An action another ability sets up is timed with that ability's status up: Entrust before an entrusted aura, Pianissimo before a song aimed at one member, Accession before an area spell. The kill cycle's engage and disengage change gear as the fight's do, and a gs c command runs every handler GearSwap runs for it. An action GearSwap refuses ends GearSwap's newest open action, as GearSwap itself does.
    • GearSwap's walk is charged whole. Every event the fight counts is charged the game's price for the walk, and each timed step gives back exactly the sandbox's own run of the walk it made, so the suites' own code is what remains.
    • And many smaller fixes, each checked against the game where the recordings allow: the party's own actions reaching each other, monsters aimed as recorded, buffs moving as the game moves them, the equip round trip and the server's packet bundles.
    • New on the page: plus or minus one standard error on the headline figures, and the actions Selindrile's own queue drops, counted apart from the interruptions the game makes.

    None of these is a change between Rahvin GS releases. They change the measurement, which is the same for all three suites.

    How this was measured

    Scenario
    Six local clients inside an 18-player alliance against a Divergence wave. The Blue Mage runs in the foreground at 60 fps and the other five in the background at 20, as Rahvin's own clients run. Every suite sees the same event streams. The party's own rates and each character's actions come from Rahvin's recordings at a Locus imp camp in Caedarva Mire, and the other players' and monsters' activity from the same camp, mapped onto the alliance.
    Cadence
    No hand-picked gaps. Every timing rule is sourced and self-tested against the wiki's own worked examples: haste caps, dual wield, Fast Cast, recasts, the post-action lockouts and the melee timer. Each melee character's swing and the TP it brings come from its recording. Weapon delay comes from the game's item data, and cast times and recasts from its spell data.
    What runs
    Each suite's complete shipped code, compiled into a per-client sandbox in GearSwap's own load order. Each of the two Mirdain-lineage trees runs with the job files and gear library it carries. Selindrile runs its full library chain with its bundled organizer include. Registrations, schedules and settings run as shipped. Nothing is extracted or paraphrased.
    States
    Lean is every chat channel off, Hoxne off and Treasure Hunter None, every lock at its load default. For Selindrile this is the parity tier, with its Bard's weapons held through songs as the 1.5.12 source holds them. Moderate is each suite's own first-load defaults plus the modes this party plays: Hoxne on the Bard where the engine has the mode (Rahvin GS 2.1), Treasure Hunter Tag on the Corsair on all three, and the Bard's weapon lock on Songs where the engine has that mode (Rahvin GS 2.1), as Rahvin plays it. For Selindrile this is the practical tier, its Bard's weapon set freed for songs.
    Gear
    The same six loadouts everywhere, but each lineage engine brings its own copy of them. Rahvin GS 2.1 runs the job files and gear library it carries. 1.5.12 runs those files as a later Mirdain-named release shipped them, the set this comparison has loaded under it since its first run; it cannot load 2.1's, which call engine hooks it does not have. So the pair differs by a whole tree, not by an engine file alone. Selindrile runs generated ports of the same six loadouts, each wearing its source's weapons, with every set checked against the original. Selindrile's upstream files stay pinned byte for byte.
    GearSwap's work
    The sandbox counts GearSwap's refreshes and events by GearSwap's own rules, client by client, and prices each at Rahvin's in-game figure for that character: his mean per call over a counting session he played on his six characters, full refreshes, short ones, events proposing nothing, events re-wearing gear and events changing it. A refresh walks the party list, so the alliance's other twelve members are added at the per-member cost he measured with a party of six, an inference. The sandbox runs GearSwap's set handling itself, with an index standing in for the bag walk. Every event the fight counts is charged the walk's in-game price whole, and each timed step gives back exactly the sandbox's own run of the walk it made.
    Windower crossings
    The game's own interface is modeled, not present. Item, mob and recast queries build tables of realistic shape per call, identically for every suite. Text writes, screen primitives, position decodes and record reads are counted by the sandbox and priced by Rahvin's timings in the game, in place of the sandbox's own cost. A chat line's call costs under half a microsecond and is left uncounted; what a chat line really costs is its rendering, which no figure here sees.
    Timing
    Unit costs come from continuous hot loops of 250 ms or more, on the real clock, outside the sandbox. Inside it, time is virtual and driver-controlled, so busy windows, throttles and item cooldowns all run on their true cadence. The measurement ran pinned to one processor at high priority on an otherwise quiet machine.
    Allocation
    Each event type's heap growth, measured with the collector stopped and weighted by how often the event fires, plus GearSwap's refresh and walk at the bytes Rahvin measured in the game. That is the churn charted. The sandbox's own heap growth over the fight is measured too; it leaves out GearSwap's refresh and walk, which do not run here, so it does not compare with the charted figure.
    Collector
    Both sides are timed in interleaved chunks, ten a side. The stopped side collects between chunks, so only one chunk of garbage is ever live. Interleaving also keeps run order from favoring either side.

    Where these numbers can mislead

    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.

    • A press whose target has died. The model still runs GearSwap's interruption refresh for it, which the game skips. Without it Rahvin GS 2.1's figure would fall 0.15% (its Warrior's 0.34%), Selindrile's 0.07% and Mirdain 1.5.12's 0.01%.
    • The White Mage's cures on the Blue Mage. The model's White Mage cures the Blue Mage about three times as often as in Rahvin's trace session, 1.31 times a pass against 0.43, and the roster plays both healers at once where each trace segment had one. At her traced rate Rahvin GS 2.1's figure would fall 0.20% (the Blue Mage's 0.96%); the other two suites' would not move.
    • Selindrile and Mighty Guard. Selindrile aborts the Blue Mage's Mighty Guard whenever Unbridled Learning is down. The recordings pace the two together, but the model raises Unbridled Learning's status from the recorded buff churn rather than from its use. With it up at every press, Selindrile's figure would fall 0.03% (the Blue Mage's 0.12%).
    • Presses Selindrile holds back on its own. Beyond the interruptions the recordings show, Selindrile cancels 16 presses a state over the 16 passes: a character asleep or under Amnesia as the press lands, a double press, Bolster, Entrust aimed at the Geomancer herself, and the Bard's Auto-Pianissimo, which never re-casts here because the sandbox plays no line inside a combined command. Played through, they move Selindrile's figure by about 16 µs/s, 0.02%, most of it the Auto-Pianissimo. Recasts met after Selindrile's queue re-issues a press add at most 0.005% to Selindrile's figure. Mirdain 1.5.12 and Rahvin GS 2.1 hold back a few presses of their own too (1.5.12's Geomancer 3 and Corsair 2, 2.1's Geomancer 1, over 16 passes), counted but not measured.
    • A luopan's release. In the trace one release in three ran its own refresh for the status change; the model runs that refresh with the release. Running it apart would add at most 0.008% to any column.
    • Presses the game never finished. GearSwap's work for them is priced, 12.6 to 16.8 µs/s a column in the moderate state, but no timed step runs a press that never finishes, so the suites' own code for them is not measured.
    • Timed steps that re-wear gear where the fight sometimes changes it. In the fight 13% to 14% of Mirdain 1.5.12's and Rahvin GS 2.1's re-dresses at a change of state change gear, where their timed steps re-wear it: about 1.6 to 1.8 µs/s of their own code. In the fight 65% to 87% of the Mirdain-lineage luopan losses change gear, not measured, and about 61% of Selindrile's luopan gains, estimated under 0.1 µs/s.

    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.

    Measured 2026-09-28/29 · PUC Lua 5.1.5 · Mirdain 1.5.12 & Rahvin GS 2.1 × moderate/lean; Selindrile × practical/parity