Live Interaction Test Catalogue
This catalogue defines the live RuneLite tests required for production behavior whose correctness depends on the active client rather than Java compilation or source-level ID parity.
Current production callers under these paths derive it:
src/main/java/com/n3plugins/Api/actionssrc/main/java/com/n3plugins/sdk/widgetssrc/main/java/com/n3plugins/sdk/walker- plugin-specific runtimes under
src/main/java/com/n3plugins - the revision-sensitive packet surface under
src/main/java/com/n3plugins/PacketUtilsandsrc/main/java/com/n3plugins/Packets
The generated WidgetCatalog is an address source, not live evidence. A
successful build, an accepted Agent Server operation, DISPATCHED, or a matching
packet trace does not by itself prove the requested game transition.
Status vocabulary
Use exactly one status for each executed case:
| Status | Meaning |
|---|---|
PENDING | The case has not been executed on the target revision. |
BLOCKED | A documented account, location, quest, item, or interface prerequisite is unavailable. |
OBSERVED | The live widget/menu state was captured, but the action and postcondition were not both tested. |
CONFIRMED | The expected dispatch evidence and domain postcondition were both observed. |
DISPROVEN | Current live behavior contradicts the implementation assumption. |
INDETERMINATE | Dispatch occurred but restart, timeout, or missing postcondition prevents a verdict. |
Current execution record
2026-07-30: revision 239, fixed layout
Live fixture:
- account
N3 B, world454, initial location(3092,3243,0); - RuneLite revision
239, mapping label2026-07-08-rev239-11233-release-artifact-derived; - revision health and action pacer ready, Walker idle;
- empty inventory and equipment; Draynor bank immediately adjacent;
- Agent Server authentication disabled, explicit direct-MCP session and exclusive lease used for writes.
| Catalogue case | Verdict | Live evidence |
|---|---|---|
OP-001 | OBSERVED | Each tested Agent Server action queued one EVENT_MOUSE_CLICK; no duplicate mouse packet was observed. This does not yet cover a real canvas coordinate or synthetic-input mode. |
OP-002, WD-007 | DISPROVEN | Explicit op 1 on Music tab widget 35913782 emitted IF_BUTTONX (35913782,-1,-1,1) and did not select the tab. A normal option-one tab action must not be certified through this packet family. Operation b30ed416-57c4-418f-8f46-f0d754582699. |
OP-005, WD-003 | DISPROVEN | Native CC_OP dispatched for top-level tabs and bank Close controls, but no tested control produced its domain postcondition. WidgetActions trace order was option,target,op,index,widgetId,itemId; manual RuneLite events use the different option,target,opcode,identifier,param0,param1 trace schema, so the two log formats must not be compared positionally. |
OP-006 | DISPROVEN | Open-bank Close owner resolved as packed ID 786434, runtime index 11, bounds (475,12,26,23), action Close, listener and onOp present, selected mode NATIVE_CC_OP. Dispatch operation 8d31063e-20b0-4cff-80aa-65e44241ca74 left the bank open. |
OP-010, BANK-001 | CONFIRMED | Bank booth 10355 at (3091,3243,0) with actions Bank, Collect emitted OPLOC; bank state changed from closed to open and at least 40 bank items were readable. Operation 7ff6529d-0c36-4755-8ac9-8d1035c20648. The result reported actionIndex=2 for the first displayed action Bank; retain this as an index-convention finding. |
BANK-001 already-open | CONFIRMED | A second open request returned Bank is already open without another object action; operation ad3a5a4c-ae10-4e83-9960-613ed531ab2c. |
BANK-005 | OBSERVED | Bank item grid packed ID 786444 exposed live runtime indexes, item IDs, quantities, and eight actions. Observed examples include Coins at index 0, Bronze dagger at index 5, Air rune at index 10, and Bread at index 14. No item was withdrawn. |
BANK-006 absent item | CONFIRMED | Withdrawal of the guaranteed-absent fixture __N3_LIVE_TEST_ABSENT_ITEM__, amount 1, failed closed as BANK_ITEM_NOT_FOUND with no inventory change; operation 956089b0-88dd-47d6-8b85-91a33e96cc0d. |
BANK-010 empty inventory | INDETERMINATE | Deposit-inventory control 786479 was visible with action Deposit inventory, listener and onOp present. With an already-empty inventory the operation emitted IF_BUTTONX and remained DISPATCHED; there was no possible item-delta postcondition. Operation b44afbee-899a-4beb-a840-818b29501ca2. |
TAB-001 | DISPROVEN | Fixed-layout semantic owners resolved for all 13 tabs. Non-paced native dispatches for Combat, Skills, Equipment, Magic, Friends, Settings, Music, and Logout all left postDispatchSelected=false. Quests, Prayer, Friends Chat, and Emotes failed closed as PACED. Inventory's already-open fast path was CONFIRMED. Manual client clicks are not counted as Agent Server success. |
TAB-004 | CONFIRMED | Opening already-selected Inventory returned CONFIRMED, Tab is already open, with postDispatchSelected=true; operation fdcb50fa-ba3b-4533-85e2-5ff1a369cc7a. |
WD-006 | OBSERVED | Deliberately close tab requests produced structured PACED failures without an action dispatch. Longer spacing is still required to certify the ready boundary and unresolved-operation ordering. |
INV-001, EQP-001 | BLOCKED | The live fixture had no inventory or equipped items. Container emptiness was observed, but slot/action behavior could not be certified. |
READ-005 | OBSERVED | Camera read returned yaw 16205, pitch 3064, zoom 128, and viewport 512x334; visual projection comparison remains pending. |
PASS-001 | OBSERVED | Live reads returned nearby NPCs, objects, players, and four ground items. Object actions were populated, but NPC/player/ground-item action arrays were absent from the typed snapshots. |
PASS-004 | OBSERVED | Same-tile same-plane line of sight returned true; the same coordinates on plane 1 returned false. Door/wall/diagonal and collision cases remain pending. |
PASS-005 | OBSERVED | All 24 live skills, including Sailing, returned real and boosted levels. No XP or quest transition was performed. |
PROD-001, PROD-005 | OBSERVED | Production was closed. All five quantity addresses resolved (ONE through X, children 32 through 36) and correctly reported invisible; no products were present. |
MINI-002, MINI-003, MINI-009 | OBSERVED | Minigame interfaces and dropdown were closed, cooldown was 0, and all 12 destinations were enumerated as invisible with no live widget address. Address/action testing remains blocked until the grouping or magic entry interface can be opened. |
DLG-005 | BLOCKED | No visible Continue widget was present in the bank fixture. |
PRAY-001 | OBSERVED | Live prayer controls resolved with listener-owned Activate actions and NATIVE_CC_OP; action testing was stopped because the shared native dispatcher is disproven and the account has only level 1 Prayer. |
The ASM invocation-plan resolver repaired the listener-owned native-widget blocking defect recorded above. The follow-up execution record below
supersedes the affected DISPROVEN verdicts for the tested fixed-layout cases.
2026-07-30 follow-up: repaired ASM native dispatcher
Live fixture:
- account
Mamieparle, world308, location(3092,3243,0); - RuneLite revision
239, mapping label2026-07-08-rev239-11233-release-artifact-derived; - fixed layout, headless UI suppression off, synthetic input disabled;
- revision health and action pacer ready, Walker idle;
- Agent Server authentication disabled, direct-MCP session
yPWg9eV_NPuZRc5JYJigWQgC7SuaozKQand exclusive lease used for writes.
| Catalogue case | Verdict | Live evidence |
|---|---|---|
OP-001 native-widget sequence | OBSERVED | A repaired native tab action emitted exactly one EVENT_MOUSE_CLICK followed by one WidgetActions CC_OP trace. The tab postcondition occurred. Source no longer queues the redundant mouse packet for native CC_OP; raw widget and packet actions retain their required mouse-event sequence. Live re-test requires a plugin reload. |
OP-005, WD-003 | CONFIRMED | Listener-owned native CC_OP now produces domain transitions. Opening Settings selected the tab with postDispatchSelected=true; operation 0f3567cc-abab-4cf7-992d-4a0633ca9379. The bank Close owner also hid the bank; operation 97752b41-196d-43c7-9243-f25948c9fc50. |
OP-006, BANK-002 | CONFIRMED | Open-bank Close resolved to packed ID 786434, runtime index 11, bounds (475,12,26,23), action Close, listener and onOp present, dispatch mode NATIVE_CC_OP. The bank changed from open to closed. In-memory screenshots were captured before opening, while open, and after closing at 22:16:17, 22:16:25, and 22:16:40 UTC. |
TAB-001 | CONFIRMED | All 13 fixed-layout tabs produced postDispatchSelected=true: Combat 499ceeb9-84c5-4808-be48-4471af00b17d; Skills cf81c6df-8d72-4add-8536-ca8d14e95f6c; Quests 281ad4a9-4364-43c9-b71e-0d8e6aa8b97f; Inventory c8ce2373-3cf3-4417-bbc5-32944486b9ba; Equipment e0d14798-a045-48dc-a64f-519d384ed4fd; Prayer b9a49c08-fe19-499a-9aaa-88c6e54e2187; Magic d35a29a3-4163-4487-a75a-3a33f1318923; Friends Chat 1190dff4-9cae-494e-9e73-3ecb9f5ad677; Friends 8e24c989-a8b1-4c2a-8145-72a50627b6bb; Logout f8c92057-0b9d-464d-91ba-a5075d88ae00; Settings 0f3567cc-abab-4cf7-992d-4a0633ca9379; Emotes 31e4e298-fbe0-43ac-8dbd-08c08b5df570; Music b460601b-0640-462b-8be3-8f010729a644. Deliberately short spacing also produced structured PACED failures without dispatch. |
BANK-005, BANK-006 withdraw 1 | CONFIRMED | Bronze dagger 1205 resolved at bank-grid runtime index 28. Withdraw-1 changed inventory from empty to exactly one dagger; operation 5b2506bb-48d0-4d0d-ae06-048d388318ab. |
INV-002, EQP-002 | CONFIRMED | With Inventory visible, Wield swapped the Bronze dagger into the weapon slot and the Rune axe into inventory; operation 9658c5be-caed-4d43-82b5-dfa912093f37. Equipping the Rune axe restored the initial weapon and returned the dagger to inventory; operation 58c6cb97-0979-4e7b-a6f8-a8ddff8eb11b. Wield correctly used raw RuneLite action slot/op 3; the response's cleaned non-empty action list omits the two preceding empty slots and must not be interpreted as positional. With Inventory hidden, the same typed action failed closed as WIDGET_HIDDEN. |
BANK-010 non-empty inventory | CONFIRMED | Deposit-inventory control 786479 changed inventory from one Bronze dagger to empty and restored the bank fixture; operation 496a33a6-943d-4dfe-91b3-acda1768317e. |
WD-007 invalid raw op | DISPROVEN | Explicit raw ops 0 and 11 on visible bank Close widget 786434 were both queued instead of rejected; operations f5eb614d-9858-49bc-ab79-f581f0fb9ea0 and 17f53c4a-2a9f-4af3-b673-50b9ea29fc44. An immediate bank-state read remained open, but later reads transiently reported closed and then open without an intentional open request, so the delayed side effect is indeterminate. Source now rejects values outside 1..10 as ACTION_INDEX_INVALID, covered by WidgetActionsTest; live re-test requires a plugin reload. |
WD-004, WD-007 missing/stale widget | CONFIRMED | Closed production quantity widget 17694752 failed as WIDGET_NOT_FOUND; operation 887ebf77-acff-4381-a600-25b703360a3e. Bank Close packed ID 786434 with stale runtime index 999 also failed as WIDGET_NOT_FOUND; operation 521c985b-b885-4162-8fda-64c91b5e2fab. Replaying the same idempotency key returned the same operation record without a second dispatch. |
BANK-003, BANK-012 worn-items panel | CONFIRMED | Listener-owned widget 786539 changed from Show worn items to Hide worn items, operation d01fa65f-2d30-4e42-abb2-0c37dbfc92d4, then back to Show worn items, operation 80d3c7f6-f17a-48ad-8d0b-697b192b931b. The live response's availableActions reflected the post-dispatch label, not the action list used for resolution. Source now clones the pre-dispatch actions before invoking a listener, covered by WidgetActionsTest; live re-test requires a plugin reload. |
BANK-006 withdraw 5, 10 | CONFIRMED | Earth rune 557 changed inventory from empty to exactly 5 through Withdraw-5, operation 3817d5b7-f132-4e8e-88f4-04e4e7dcff33, and from empty to exactly 10 through Withdraw-10, operation f82b7405-8223-46c3-a9d2-b3d17786bc56. Each stack was redeposited, restoring the fixture. |
OP-009, BANK-001 NPC variant | CONFIRMED | Banker index 1753, ID 1618, at (3090,3243,0) exposed Talk-to, Bank, and Collect. Requested Bank queued OPNPC and changed bank state from closed to open; operation 2159054a-65d6-4706-83e4-0d4c3715b3db. Bank correctly used raw RuneLite action slot/op 3; the cleaned non-empty action list is descriptive rather than positional. Unsupported action Dance failed closed as ACTION_NOT_FOUND with the same live action list; operation ce52cba4-feee-46fe-b774-cf20e3b357d0. |
OP-017, PASS-007 | CONFIRMED | Navigation preview returned one reachable step from (3092,3243,0) to (3092,3244,0). Walker operation 6173aa63-ff8f-4f44-bc76-df5d4e371d8d reached the exact destination with distance 0, then operation c77d655e-1995-445c-89b2-d9b210c1563f returned to the initial tile. Same-coordinate plane 1 preview was unreachable and write operation 4fa2f490-d661-44de-b6de-13eb00697dcb failed closed as PATH_NOT_FOUND without movement. |
| Agent Server terminal convergence | DISPROVEN | Operation 0f3567cc-abab-4cf7-992d-4a0633ca9379 retained state DISPATCHED even though its own synchronous observation recorded postDispatchSelected=true. Source now promotes a dispatched result to CONFIRMED when its synchronous postcondition observation is true, which makes the MCP/REST operation ledger terminal while leaving unobserved generic writes at queue-level DISPATCHED. Covered by AgentActionServiceTest; live re-test requires a plugin reload. |
2026-08-02 refresh: repaired artifact loaded
Live fixture:
- account
Unhear, world433, initial and restored location(3234,3219,0); - RuneLite revision
239, mapping label2026-07-08-rev239-11233-release-artifact-derived; - fixed layout, headless UI suppression off, synthetic input disabled;
- revision health and action pacer ready, Walker idle;
- Agent Server direct-MCP session and exclusive lease used for writes.
| Catalogue case | Verdict | Live evidence |
|---|---|---|
OP-005, WD-003, TAB-001, Agent Server terminal convergence | CONFIRMED | Opening Equipment through the listener-owned Worn Equipment control selected the tab with postDispatchSelected=true, and the operation ledger reached terminal CONFIRMED; operation bfa5ffb2-5ef1-4775-91d2-1e2122c496fe. Opening Inventory restored the initial selected tab with the same observed postcondition; operation 728a37a4-7fff-4002-830c-7e88143b230f. This freshly confirms that the repaired native dispatcher and synchronous terminal-convergence artifact are loaded. The remaining fixed-layout tab constants retain the 2026-07-30 verdict; resizable layouts remain pending. |
WD-007 invalid raw op | CONFIRMED | Explicit raw ops 0 and 11 against visible listener-owned widget 35913796 both failed terminally as ACTION_INDEX_INVALID, with the required 1..10 range reported and no dispatch; operations d02c2f01-14ce-43aa-885c-624c0354fc27 and c3f5f8de-a296-4d05-9417-8f2ab85b6afa. This freshly confirms the repaired fail-closed boundary is loaded. |
OP-017, PASS-007 | CONFIRMED | Navigation preview returned one reachable step from (3234,3219,0) to (3234,3220,0) and rejected the same-coordinate plane-1 target as unreachable. Walker operation be9adacd-c770-4613-9e5a-8f8b0f0ae83b remained ledger-level DISPATCHED, while live state observed arrival at distance 0 with Walker idle. Operation 792a7ea1-64f4-46c1-a9f4-6fe3fd6cc3c3 returned to the exact initial tile with the same domain postcondition. The verdict relies on the observed navigation state, not the queue-level operation state. |
INV-001 | OBSERVED | Inventory enumeration exposed Air rune 556, quantity 25, at runtime slot index 1, with Drop and Examine actions. No inventory action was issued, so action-slot behavior remains pending for this fixture. |
PASS-003, PASS-008 | OBSERVED | The bounded recent-event snapshot contained live projectile movement records for projectile 668, including source (3250,3192,0), target (3250,3195,0), client tick, and timestamp, alongside ordered NPC spawn/despawn and animation records. Projectile spawn/removal and retention-boundary transitions were not both observed, so neither case is complete. |
TAB-001 continued | CONFIRMED | Fresh Combat and Skills transitions each reached terminal CONFIRMED with postDispatchSelected=true; operations 1839d573-130b-4099-8014-9ece707faaf3 and 54ebbbf9-8b37-4cdc-87f6-f0a4e4bd1a88. The following Quests request was paced before dispatch, so the sequence stopped; the other constants retain their earlier fixed-layout verdicts rather than receiving new operation evidence in this fixture. |
WD-006 pacing | CONFIRMED | A deliberately close Quests tab request failed terminally as PACED with postDispatchSelected=false and did not change the selected tab; operation 1f119003-90b3-4bbb-a8db-59f8c6f3cb1c. No automatic retry was issued. |
COMBAT-003 | DISPROVEN | Pre-state was unarmed, ACCURATE, and retaliating=true. Requesting auto-retaliate disabled only opened the Combat tab; operation f69bfcc7-4b94-4e80-a9d7-696453c95796 remained DISPATCHED, while a typed combat read still reported retaliating=true. The now-visible raw-packet owner 38862880 exposed Auto retaliate but was not invoked. CombatActions.toggleAutoRetaliate returns immediately when TabActions.ensureOpen dispatches the tab transition, so the one-shot Agent Server operation never resumes the requested control action. No retry or compensating toggle was issued. |
PASS-001 | OBSERVED | Current scene enumeration returned 22 NPCs, 50 nearby objects, and 13 ground items. Object action data included ladder 16683 with Climb-up; NPC snapshots still omitted action arrays. No scene action was issued. |
PASS-004 | OBSERVED | Line-of-sight reads from (3234,3219,0) returned true for an adjacent cardinal tile, an adjacent diagonal tile, and (3230,3219,0); the same coordinate on plane 1 returned false. A proven door/wall occlusion and instanced-region comparison remain pending. |
PASS-005 | OBSERVED | All 24 skills, including Sailing, returned live base and boosted levels. This fixture included Prayer 11, Magic 12, and Hitpoints 14; no XP, boost/drain, or quest transition was performed. |
READ-005, READ-009 | OBSERVED | Camera state reported yaw 455, pitch 3064, zoom 296, and viewport 512x334. World Map state was closed at position (1985,1401) with zoom 3. Neither read was compared against multiple visible client render states, so visual certification remains pending. |
COMBAT-003 terminal follow-up | DISPROVEN | The unresolved auto-retaliate operation f69bfcc7-4b94-4e80-a9d7-696453c95796 subsequently reached terminal TIMED_OUT. Its retained result still contained only the Combat-tab native dispatch, and a fresh typed combat read still reported retaliating=true; no duplicate or compensating write was issued. |
READ-006 | OBSERVED | Typed reads agreed on the inactive baseline: unarmed ACCURATE combat with special attack disabled at 0 energy and auto-retaliate enabled; Prayer at 11 points with no active or selected quick prayers; standard spellbook with no selected spell, autocast, defensive autocast, or home-teleport cooldown. Visible-control comparisons and state transitions remain pending. |
READ-007, PROD-001 | OBSERVED | Production, Grand Exchange, shop, and trade readers all returned explicit closed states. Production exposed no products and five invisible quantity descriptors; GE returned CLOSED, shop returned no stock, and trade reported neither screen open. These establish closed-interface baselines only; no visible-open comparison or domain action was performed. |
PASS-005 continued | OBSERVED | The retained event snapshot contained ordered XP transitions: Attack 1035 -> 1039 (+4) and Hitpoints 2401 -> 2402 (+1) then 2402 -> 2404 (+2), with skill, level, client tick, and timestamp. The progress reader also distinguished finished and in-progress quests and returned diary task mappings. Boost/drain, a newly induced XP transition, quest transition, and absent-diary behavior remain pending. |
PASS-008 continued | OBSERVED | limit=3 and limit=1 reads retained the newest records independently for inventory deltas, animations, projectile movements, NPC spawn/despawn, XP gains, and varbit changes. Records carried client tick or timestamp evidence and preserved chronological order within each category. Cross-category global ordering and restart-reset behavior remain pending. |
| Passive loadout and runtime baselines | OBSERVED | Loadout state matched the inventory/equipment readers: Air rune 556 quantity 25, Forestry kit 28136, Ghostspeak amulet 552, and Lederhosen shorts 6181. Stream protocol 2 was enabled on its configured port with maximum 5 FPS and 2 connections; workflow state was empty, and the current menu contained only Cancel. These are inventory/runtime diagnostics rather than completed interaction cases. |
COMBAT-003 reloaded repair attempt | DISPROVEN | With Combat freshly selected, operation 166889cf-b9f7-45eb-a58e-fb350612007c invoked native CC_OP op 1 against widget 38862880 with the exact Auto retaliate action, but the visible control remained Auto Retaliate (On), the typed state remained retaliating=true, and no corresponding var change appeared. The ineffective forced-native source change was removed. Dedicated action-tab gating is now implemented in shared actions and Agent Server, but requires another rebuild/reload before live verification. |
EQP-001, EQP-002, EQP-003 | CONFIRMED | From the Equipment tab, Remove op 1 on Forestry kit 28136 moved it from the CAPE slot to inventory index 0; operation 7d666f42-166d-4e47-97f7-2d16ea0349fc. Equipping while Equipment remained selected failed closed as WIDGET_HIDDEN, operation db53f2df-cf58-4f58-be4c-2318d2c611fd, proving the missing Inventory-tab gate. After explicitly opening Inventory, Wear used retained raw slot 3 and restored the exact initial loadout; operation 0ff41557-8767-4959-afa5-bc857ce0a0f1. Shared EquipmentActions now gates equip through Inventory and named unequip through Equipment; live verification requires reload. |
EQP-002, EQP-003 reloaded gate verification | CONFIRMED | Without manually selecting either required tab, n3_equipment_unequip first dispatched Worn Equipment and then Remove on Forestry kit 28136; operation 88b9d3a3-398d-4a08-b5d7-e44920157cf0, followed by an observed move from the CAPE slot to inventory index 2. Direct n3_equipment_equip then dispatched Inventory followed by raw retained op 3 (Wear) on the same item; operation 2722228c-ea09-4b3a-8393-372c0afe79a6. The exact starting loadout and rune counts were restored. This confirms the dedicated gates in the reloaded shared plugin API and Agent Server continuation path. |
COMBAT-003 reloaded continuation verification | PARTIAL | Direct auto-retaliate disable first dispatched Combat Options, then queued IF_BUTTONX op 1 on owner widget 38862880; operation 884eaa6e-63a8-4af7-8e18-ad502e75445a. The visible child changed to Auto Retaliate (Off), proving tab continuation and the control action. The typed combat read incorrectly remained retaliating=true: live varplayer 172 changed 0 -> 1 for Off while CombatActions.isRetaliating() read id 172 through getVarbitValue. Raw parent-widget toggles confirmed varplayer 172 values 1 for Off and 0 for On, and restored the initial On state. Source now reads this value through getVarpValue; live typed-read and terminal-operation confirmation require another reload. |
COMBAT-003 varplayer repair verification | CONFIRMED | On the reloaded artifact, the initial visible and typed states both reported On/retaliating=true. High-level operation 26945dbd-2e53-476f-8fca-3921b161cb86 automatically opened Combat and toggled Off; the visible child reported Off, varplayer 172 changed to 1, and the typed reader reported retaliating=false. Operation 45005849-d5e7-4e59-8eb8-09fc4e726f45 restored On with visible text, varplayer 0, and typed retaliating=true. Both ledgers remained DISPATCHED because their synchronous observation preceded the game-tick transition; domain postconditions establish the verdict. |
COMBAT-002 | DISPROVEN | From a visible unarmed Combat tab, requesting DEFENSIVE failed terminally as WIDGET_NOT_FOUND; operation 6bb2501b-7543-4836-a839-53dfd17c2d65, with attack style unchanged as ACCURATE. Live owner widgets were group 593 children 6 (Punch), 10 (Kick), hidden 14, and 18 (Block), while CombatActions used stale children 4, 8, 12, and 16. The revision-239 owner mapping is repaired with focused regression coverage; live action verification requires reload. |
COMBAT-002 reloaded owner verification | PARTIAL | The repaired high-level request reached owner widget 38862866 and queued raw IF_BUTTONX op 1; operation fc61374c-0747-458d-a5be-3c24bbc11e91, but the style did not change. Dispatching the owner’s exact live action Block through native CC_OP changed varplayer 43 from 0 to 3, while the typed reader incorrectly remained ACCURATE because it read id 43 as a varbit. Native Punch on owner 38862854 restored varplayer 43 to 0. Shared CombatActions now reads attack style through getVarpValue and interacts using the owner’s live action label so listener-backed controls receive native dispatch; live high-level round-trip verification requires reload. |
COMBAT-002 native and varplayer verification | PARTIAL | On the next reload, high-level operation 8eb8e1ce-310b-48ed-be56-6d0d8879ebda automatically opened Combat and invoked native Block on owner 38862866; varplayer 43 changed 0 -> 3. The typed reader then reported CONTROLLED, proving that raw 43 is a weapon-specific button index rather than a universal style enum. Native Punch operation 13d3a37b-7405-4c8a-a6fb-1309a3a267d6 restored varplayer 43 to 0. Shared reads and writes now resolve the index through RuneLite’s revision-239 EnumID.WEAPON_STYLES and ParamID.ATTACK_STYLE_NAME metadata, retaining the upstream weapon-type 22 and 30 fallbacks. Live high-level round-trip verification requires reload. |
COMBAT-002 dynamic style verification | CONFIRMED | The reloaded typed reader correctly decoded the retained unarmed fourth-button state as DEFENSIVE at varplayer 43 = 3. High-level operations normalized to ACCURATE with native Punch (db25bf5f-57e8-4457-bd18-69781f97d90d), selected DEFENSIVE with native Block (415dc683-492a-4958-9133-52f955df01a2), and restored ACCURATE with native Punch (bb8de8ea-d766-45e6-a7e3-a6be8b5b12dd). Typed state and varplayer agreed at each 0 -> 3 -> 0 transition. |
MAGIC-002 | DISPROVEN | From no selected spell, high-level WIND_STRIKE selection opened Magic but failed terminally as ACTION_NOT_FOUND; operation 08d8791f-212e-420e-b383-2602a9b27985, with spellSelected=false retained. Live widget 14286859 was visible and listener-owned with an on-op listener but an empty action array. A manual selection supplied the exact native trace: option Cast, target <col=00ff00>Wind Strike</col>, action type WIDGET_TARGET, identifier 0, child -1, and widget 14286859; the following manual Cancel restored spellSelected=false. Shared selectSpell now gates Magic for plugin callers and uses a dedicated native widget-target dispatch matching that trace; live verification requires reload. |
MAGIC-002 widget-target verification | PARTIAL | Reloaded high-level operations 37aeb79a-2b4f-4d09-b0c0-fb889a4e93ef and 4ec291cd-62fc-4595-ae82-6bd5387d1c21 emitted the exact native WIDGET_TARGET tuple for Wind Strike. The first could not select after the user dropped all Mind runes; after the runes were recovered, the second visibly selected Wind Strike and the user confirmed it required an NPC target. The typed reader still reported false because isSpellSelected() read autocast varbit 276 instead of RuneLite's selected-widget state. Source now checks client.isWidgetSelected() and the selected widget's Magic-spellbook group; deselect clears that client target state directly. Live typed-read/deselect verification requires reload. |
MAGIC-008 Wind Strike on NPC | CONFIRMED | After the high-level operation selected Wind Strike, the user supplied the otherwise unavailable target click on Imp index 2691. Native trace recorded WIDGET_TARGET_ON_NPC; four casts consumed four Mind and four Air runes (30/55 to 26/51), produced projectile 91 toward the Imp, and awarded Magic and Hitpoints XP. This confirms selection-to-target behavior and the domain postcondition, but the target click was manual rather than an Agent Server action because no target-bearing spell route is currently exposed. |
Prayer THICK_SKIN toggle | CONFIRMED | From 11/11 points and no active prayers, operation 1b60a688-214e-43ff-a59d-1c9a1d30405d automatically opened Prayer and activated THICK_SKIN; the typed state listed it active. Operation e9c83f88-b811-49d4-acb2-b1f745e5247b deactivated it, restoring no active prayers and 11/11 points. |
OP-009, DLG-005 NPC dialogue | CONFIRMED | A first Talk-to dispatch against Donie produced no dialogue while a closed door blocked the route, so scene presence alone was not treated as reachability or success. After the user opened the door, navigation preview proved the tile immediately south of Donie reachable. One Talk-to action against live index 2721 then opened a visible Donie dialogue with Click here to continue; operation 4f893b04-77a8-41a4-aa72-5f8b58b2d314. One n3_continue_dialogue action removed the continue widget and closed the one-line dialogue; operation d690cacf-c817-48c6-b5eb-aefa4fcbb160. Both ledgers remained DISPATCHED; the visible interface transitions establish the verdict. |
MAGIC-012 selected state and deselect | CONFIRMED | On the reloaded artifact, operation afda0c5d-550f-4317-ab40-89b00489fd2f automatically opened Magic and selected Wind Strike through the native WIDGET_TARGET tuple; the corrected typed reader reported spellSelected=true. Dedicated deselect operation 4d0f9df3-44bc-446e-85fc-1081e83f9563 reached terminal CONFIRMED, changed the typed state to false, and consumed no runes. A second selection followed by confirmed Inventory-tab operation 4c675fab-73af-45dd-a2af-01574505744f cleared the client target automatically; the typed reader returned false, and operation cc90e313-7787-40cd-adcf-e94f4be615e5 confirmed the no-selection deselect path. |
MAGIC-007 inventory-spell transaction hardening | STATIC_ONLY | Shared MagicActions.castOnInventoryItem now owns an exact-spell, exact-inventory-target transaction. Focused tests prove one selection, one target dispatch, no explicit Inventory action, duplicate suppression, competing-target pacing, wrong-selection rejection, logout reset, packet-failure handling, and five-second fail-closed stale recovery. Loaded-client acceptance remains pending: record the exact WIDGET_TARGET and WIDGET_TARGET_ON_WIDGET tuples and observe the destination-stack, XP, and coin postconditions before promoting this row. |
INV-001 inactive-tab interaction gate | DISPROVEN | After Magic deselect correctly left Magic active, Examine on visible-model inventory slot 0 failed as WIDGET_HIDDEN; operation 885e08e6-87fd-497d-b9b0-4f98679c35c6. Shared InventoryActions now gates item interactions and slot moves through Inventory, while Agent Server preflights and continues inventory interact, drop, and patterned-drop routes. Shared Magic deselect also gates Magic for direct plugin callers. Focused tests pass; live verification requires reload. |
INV-001 inactive-tab gate verification | CONFIRMED | From Magic, high-level Examine operation 38c7442e-8c96-43c6-aebb-7aada75e7dcb first dispatched the Inventory tab and then native op 10 on Mind rune 558. The item widget became visible and a captured screenshot showed the examine chat result, Used for basic level missile spells. From Inventory, no-selection Magic deselect operation 5d92ae17-a505-4012-8d74-9c78583219a5 opened Magic and reached terminal CONFIRMED, verifying that even no-op domain actions retain their dedicated gate. From Magic, absent-item drop operation 5b9ea8d3-ccde-47c4-9ae1-fb977e8b1888 opened Inventory before failing closed as TARGET_NOT_FOUND, with no drop dispatch or inventory change. |
BANK-006, BANK-007, BANK-011 X quantity | CONFIRMED | With Lumbridge bank open, one Withdraw-X action on Body rune 559 emitted IF_BUTTONX for bank item widget 786444, runtime index 4, followed by count-dialog value 14. Bank quantity changed 30 -> 16 and inventory changed 0 -> 14; operation 5952c562-7666-40fd-bdd7-7126b94621ac. One Deposit-All operation c3a3155f-ab52-4dce-a19a-5cacf2e4fcd1 restored bank 16 -> 30 and inventory 14 -> 0. SDK inventory deltas agreed with both transitions. |
BANK-008, DLG-006, OP-019 noted-mode/input finding | DISPROVEN | Requesting one noted Shrimp 315 used stale bank child 786458 (NOTE_GRAPHIC) and opened the visible Enter amount: prompt instead of changing withdraw mode; operation c8b9293b-26c2-4e93-97cf-c292886c2d68. No Shrimp delta occurred. Live discovery identified 786457 (Bankmain.NOTE) as the listener-backed Enable Notes control and 10616875 (Chatbox.MES_TEXT) as the prompt text. Microbot's functional implementation independently uses Bankmain.NOTE to enable notes, Bankmain.QUANTITY1_TEXT to return to item mode, and canvas keyboard events for text plus Enter. Shared bank controls, same-operation mode continuation, and a general Agent Server canvas-keyboard amount action are repaired in source; live verification requires rebuild/reload. |
2026-08-03 refresh: revision 240 / client 1.12.34.1
Live fixture:
- account
Mamieparle, world433, location(3092,3243,0); - RuneLite revision
240, mapping label2026-08-03-rev240-112341-release-artifact-derived; - fixed layout, headless UI suppression off, synthetic input disabled;
- revision health and action pacer ready, Walker idle;
- Agent Server direct-MCP sessions and exclusive leases used for writes.
| Catalogue case | Verdict | Live evidence |
|---|---|---|
| Revision-240 baseline | CONFIRMED | The loaded 1.12.34.1 artifact reported revision 240 and the expected mapping label with healthy revision state. Reads exposed the live Draynor fixture before any write. |
OP-010, BANK-001 | CONFIRMED | Bank booth 10355 accepted Bank; operation a8457049-046f-4467-876e-d77b3fc73910 remained ledger-level DISPATCHED, while a typed bank read changed from closed to open. The domain transition establishes the verdict. |
WD-007 invalid raw op | CONFIRMED | Raw op 0 against visible bank Close owner 786434, runtime index 11, failed terminally as ACTION_INDEX_INVALID; operation 0f8848bb-98e3-4844-8e19-019d4a3c7bea. The bank stayed open and no action packet was added. |
OP-005, TAB-001 | CONFIRMED | Listener-owned Equipment operation f120bd44-3c95-4566-817f-3b0d439200b2 and Inventory operation 899d95e6-cd6f-4c79-a136-f117cf82932f both reached terminal CONFIRMED with postDispatchSelected=true. |
OP-001 native CC_OP sequence | CONFIRMED | On the rebuilt artifact, Equipment operation 7f554351-e261-477d-a79a-fb14b1ac48e5 and Inventory operation bf89cb83-e00b-4a37-86e7-dd7488ea6da7 both reached terminal CONFIRMED with postDispatchSelected=true. Each added exactly one WidgetActions native CC_OP trace and no packet interaction; the packet-interaction list remained empty. Raw widget-packet actions continue to emit their required click before IF_BUTTONX. |
COMBAT-003 | CONFIRMED | Auto-retaliate operation 0f05c7ed-d884-41e6-b741-8b13ecce1c36 changed the typed state from true to false. Operation 152dfbdb-de81-4fbf-b895-d3cbc078d8f7 restored true. Both ledgers remained DISPATCHED; the typed postconditions establish the round trip. Their traces also supply the OP-001 redundant-click finding above. |
BANK-008, BANK-006 noted withdrawal | CONFIRMED | From item mode, noted Burnt shrimp 7954 operation 9e4e4939-617b-4f39-9bdc-ba874c4d1bf9 emitted one Enable Notes raw widget sequence followed by one Withdraw-1. Bank quantity changed 41 -> 40, and inventory received exactly one noted Burnt shrimp 7955; depositing inventory restored the fixture. This confirms the observed-mode continuation repair. |
BANK-008 return to item mode | CONFIRMED | From item mode, native operation 58114572-5421-42af-b09d-4dc209db65f4 enabled Notes on the live Bankmain.NOTE owner 786457. High-level unnoted Earth rune 557 operation 07788e9a-ef07-4c4d-9bca-ee786515ad2a then invoked Disable Notes, waited for the observed mode change, and continued with one Withdraw-1. The control returned to Enable Notes, bank quantity changed 28 -> 27, inventory received exactly one unnoted Earth rune, and SDK deltas recorded both sides. Deposit operation 5c35b1cf-227e-4220-9181-29a73fb90039 restored the fixture. |
BANK-007, DLG-006, OP-019 amount input | CONFIRMED | From an item-mode baseline with Earth rune 557 quantity 28, withdrawal operation 862f5a98-216e-445c-ae0c-f92474d6da65 opened the visible Enter amount: prompt without changing either container. Amount operation 963852d0-7269-4ee6-b23b-8726c0daaf9a typed 14 and delivered the pressed/typed/released Enter sequence. The prompt became hidden, inventory gained exactly 14, bank quantity changed 28 -> 14, and the SDK bank-container delta was -14. Deposit operation 2c36f882-de97-4f4e-8e03-94111ae35a1a restored bank 14 -> 28 and inventory 14 -> 0. |
BANK-001 open/already-open | CONFIRMED | Draynor bank booth open operation 6d3ea492-28ab-4442-8cb0-37cfb135b0e5 changed the typed bank state to open. Repeating the request while open returned terminal CONFIRMED without another interaction; operation 827a79bf-b1ca-49e3-98a3-f6248ec635b5. This fixture had no NPC banker, chest, ambiguous target, or unreachable target. |
BANK-002, BANK-003 close owner | CONFIRMED | Packed frame 786434 alone is actionless, so operation 0adfec03-97e4-45e7-941b-bead095ef473 failed closed as ACTIONS_NULL. Resolving runtime child index 11 exposed listener-owned Close; native operation 34f41009-c2c0-4ea0-92b8-2220b958faf8 closed the bank, and final operation 16d21db7-758c-4130-9603-40e6c1b0a101 repeated the postcondition after restoration. |
BANK-003 search, settings, and tutorial controls | PARTIAL | Search opened and closed through native operations cbfc75fe-e5be-47f1-a0a1-b4c9858d5f9f and dd7627a1-c28c-4eec-80b7-5fe7c798c025. Settings used the live Show menu/Hide menu labels, not the descriptor's stale Settings; operations ad42e813-e993-4438-b8fd-addfd55675b1 and be28d3fe-1801-4729-b628-0a5de482c5f5 round-tripped the panel. Tutorial used live Show tutorial, advanced to page 2/16 through its dedicated Continue owner, then closed; operations 5098aeab-f104-4b2d-a054-33a100c054a4, b8af5f6e-795d-4a20-a55c-2747e6abd956, and c3c27603-581e-4f1e-9ba1-d086e0f7c468. Generic dialogue Continue rejected this separate surface as DIALOG_NOT_OPEN. Group Storage was hidden for this non-GIM account, and Incinerator was an actionless item-drop target, so Agent Server issued neither descriptor action. Source now uses Search, Show menu, and Show tutorial, and marks Incinerator read-only; live re-test needs a reload. |
BANK-003 settings visibility controls | CONFIRMED | Incinerator, tutorial, deposit-inventory, deposit-worn, empty-containers, inventory-item-options, and bank-item-options toggles each changed their live action/state and returned to the starting setting. Representative round trips: Incinerator 345d9c53-cb28-4228-aefc-9aa820d2a031 / d20efb0e-806e-484b-b796-e656918c7add, deposit inventory dfc4f6da-f6c7-4c3e-85d9-cc3f8d1d4380 / 10d7b615-0dda-4adf-8369-1d4120f6f96a, and bank item options 9727252e-5ae5-4a6d-bd5a-4be2b71d1505 / 981a216c-9f13-4a51-87c9-707145ac0715. |
BANK-004 read-only descriptors | CONFIRMED/PARTIAL | Universe 786433, item grid 786444, bank-side inventory 983043, tab container 786442, and scrollbar 786445 all rejected synthetic Click as ACTIONS_NULL; operations 6e83657d-ca54-4cfa-9604-7dc73c6bcadd, cb05a292-3049-483c-834f-ba7e3895a214, 424ac592-8919-4e34-89ea-7e6d1c7e917a, 3b3ed7f4-3d21-405d-b766-04442150dac7, and 61e4c4e7-eead-4f10-8c33-bef3433a1816. The hidden worn container rejected as WIDGET_HIDDEN in e660b2a1-0c1a-450e-b477-0ca6f7f8c3f7. The tested artifact marked SEARCH_BUTTON_BACKGROUND read-only, but live owner 786474 has native Search; the source descriptor now reflects that action and needs reload verification. |
BANK-006, BANK-007 item-mode withdrawals | CONFIRMED | Earth rune 557 produced exact item-mode deltas for Withdraw-1, -5, -10, -X, and -All. Representative operations were f56cd026-d71d-419c-8fd9-e02993ab4486, 7f59813b-6e1e-43e1-85c7-a34b2da7027d, 8fa9ec3c-bf89-421f-a919-42bc004aa700, X dispatch/input bea859fd-9d32-4cc6-a72d-83550baf42db / 3c900416-e115-4630-bd2b-01f17536b1d0, and All d3d00d50-94cb-42e4-996d-b90321f936cf. Each fixture was deposited before the next case. |
BANK-006, BANK-007, BANK-008 noted withdrawals | CONFIRMED | With Notes enabled (3958=1), Willow logs 1519 produced noted item 1520 and exact bank/inventory deltas for 1, 5, 10, X=6, and All=1040; operations ac9a7861-123c-4340-9466-75294eb37132, 27aeb95d-7ea2-493d-a0b1-547b4651914c, a32a7a5c-f122-4431-a97c-a3d27dd31363, X dispatch/input ba20cd2b-7197-4e8e-9da1-30975d96618c / 02c9e1fa-9671-4db6-b089-c09072cab188, and All d0584ed8-8f0e-4432-b939-3112096e31af. Willow logs returned to 1040. A first item-mode restore attempt stopped as PACED without mutation; retry f466d2e2-529f-4719-9810-91e89c4c5717 changed 3958 to 0 and withdrew one unnoted Earth rune. |
BANK-009 default/custom quantity | CONFIRMED | Screenshots showed default 1, 5, and 10 controls selected after operations c2fe1e5a-da91-4d44-9e7b-54b18b9dc150, 3ef93bdb-370c-4402-a20b-ca45d5d288f3, and 4ffa1c90-e1fb-4459-848e-309fa3d0c0cf. After reconnect, All operation b20fe83a-9ec1-4747-bd76-d46fb2f1d1db changed the first bank action to Withdraw-All; bbebcfd2-4d1d-4430-9835-0c3777f141b6 restored X. Set-custom operations changed 3960 to 7 and back to 14, with first actions Withdraw-7 and Withdraw-14; final restore input was 37e00c35-4a2d-4f34-9103-4d613c4c099f. |
BANK-010, BANK-012 aggregate deposits | CONFIRMED | Deposit-inventory operation 449abfca-454a-41b8-b077-c336fde0ad9a returned Earth rune 27 -> 28 and emptied inventory. Deposit-worn operation 37b99610-d975-4513-ae64-31cfc6bff799 moved the equipped Rune axe 1359 and Forestry kit 28136 into bank slots 93 and 94. Agent Server withdrew and re-equipped both through native inventory operations 799ac9ea-106f-4972-b032-3005d20a811d and 28aa2529-dd0a-4d4f-8c9d-dd0edc80ef31; the final equipment snapshot exposed both Remove owners and inventory was empty. |
BANK-011 bank-side deposits | CONFIRMED | Starting with 28 Earth runes in inventory, native bank-side operations cc48908d-68c1-48b7-ad50-df50ff84a797, 62d3b816-92c7-4a42-8e87-52c9ce21f79b, e3f87cbd-c83c-4764-8183-5bd189f3797d, X dispatch/input 49cfba55-fd8e-43e1-a7fb-fb3b92d9ef5b / 1aa3c45d-8700-4ea3-b8f9-b2e29835ca58, and All ec357f7a-d100-4cb1-8980-19ebec2971a5 produced inventory 28 -> 27 -> 22 -> 12 -> 6 -> 0 and bank 0 -> 1 -> 6 -> 16 -> 22 -> 28. |
BANK-012 worn-items panel | DISPROVEN | Native Show operation 909c0716-f98c-4d09-80a4-d13c880a340d changed the button to Hide worn items and exposed container 786493, but the canvas lost the bank panel and the typed bank-open read became false. Native Hide operation 1eca58f2-3210-4ffc-993f-0a19a6406fce restored the normal bank view and open-state read. The backing equipment item owners remained discoverable, but the visible panel postcondition failed. Bank.isOpen() had used the item grid, which this mode hides; source now uses the bank universe and needs reload verification. The canvas postcondition remains unconfirmed after that repair. |
BANK-013 tabs and persistent modes | CONFIRMED/PARTIAL | Tab 1 native operation fbfee46b-09b7-49ab-a752-adcedf27a4d2 changed the header to Tab 1 (267); View all items operation 5e1df8c9-3fed-42c2-9fe6-8ed899604fba restored The Bank of Gielinor (77.2K) after a transient render frame. Insert/Swap round trip used 24098236-8959-432c-9cdb-2f90851e7d04 / 55bb7dc2-3065-4fee-a24b-e64ed6d3768f; placeholders used 6b00e1a1-82bd-4fac-bc8a-20641964b6c4 / a4333af0-130e-4ec3-9dfc-1e8ff206cb92; tab-display Roman/first-item round trip used 8b993d80-2db7-4a8f-b149-85af2c907105 / 47a3b04f-5c08-4880-8ba6-37f20acf46bb. Scrollbar behavior and duplicate-item/search-layout selection still need dedicated fixtures. |
BANK-014 and destructive/unavailable controls | BLOCKED | No Bank PIN was present. Group Storage was hidden on this non-GIM account. Releasing 29 existing placeholders, bank fillers, and incinerating an item were not run because they alter user bank organization or destroy an item; Incinerator also requires item-target/drag support not exposed by the current Agent Server action catalog. |
| Bank-closed failure boundary | CONFIRMED | With the bank closed and inventory empty, deposit-inventory operation 81eb784a-bb5d-4211-a15e-3d585922d5f7 failed terminally as BANK_NOT_OPEN; no state changed. |
| Bank-control fixture restoration | CONFIRMED | The bank cohort ended with bank closed, inventory empty, Earth runes 28, Willow logs 1040, Rune axe and Forestry kit equipped, item mode 3958=0, custom quantity 3960=14, Insert 3959=1, placeholders 3755=1, and no Agent Server lease held. |
| Fixture restoration | CONFIRMED | Both reload-verification passes ended with bank quantity 28, an empty inventory, item withdraw mode selected, the bank closed through native CC_OP, and no Agent Server lease held. Close operations were ceaecb4b-af8d-42a8-a5b7-5ff3fd7e5083 and 3c3a3691-c157-460a-8231-8fd2b0305d6c. |
2026-08-09: revision 240 Grand Exchange baseline
Live fixture:
- world
553, location(3166,3487,0), revision health and action pacer ready; - immediately adjacent Grand Exchange booths, with one
Exchange/Collectbooth selected by the typed open action; - inventory contained 7,000,000 coins only before the fixture. The authorized
one-item fixture bought and later returned one Feather (
314) at the live default of 3 coins each; it left no offer open. - direct-MCP session and exclusive lease were used for writes and released after the checks.
| Catalogue case | Verdict | Live evidence |
|---|---|---|
GE-001 | CONFIRMED | Open operation a7d480a1-21d6-491b-906c-d51c3d77b57f dispatched one typed Exchange action to a nearby Grand Exchange booth. The visible interface then exposed its unique Close owner. A second open operation ef591d3e-cf8b-4142-b869-67806e5a4ba1 was terminal CONFIRMED as already open, without another interaction. |
GE-002 | CONFIRMED | The visible Close owner was packed widget 30474242, runtime index 11, listener-backed with selected dispatch mode NATIVE_CC_OP. Close operation e625e82f-8dbc-40bb-bcb3-295d29596683 emitted native action CC_OP option 1; its ledger stayed DISPATCHED, but the Close owner disappeared and the captured canvas no longer showed the GE interface. |
GE-003, READ-007 | CONFIRMED | After the rebuild/reload, ge.state returned CLOSED, then MAIN_SCREEN after a typed booth open, and CLOSED after native Close. This accepts the ClientThreadBridge repair; per-slot state comparisons remain pending an offer fixture. |
GE-004 | OBSERVED | In the world-553 free-to-play fixture, the first three offer cards exposed listener-owned Create Buy offer actions; the remaining five had no available Buy action. The full eight-slot matrix remains blocked by membership and offer-state fixtures. |
GE-005 | CONFIRMED | After rebuild/reload, typed n3_dialogue_text("Feather") dispatched to the visible Chatbox.MES_TEXT2 item-search field. The result owner was the listener-backed rectangle 10616884, dynamic index 0, action Select; its text child at index 1 is intentionally non-actionable. Selecting it populated the one-Feather, 3-coin buy setup. |
GE-006 | CONFIRMED | The sell setup exposes carried items under InterfaceID.GeOffersSide.ITEMS as packed widget 30605312: Coins index 0 and Feather 314 index 1, each listener-backed with Offer. The generic inventory read/action now resolves this GE-side container while GE is open and preserves its live actions; selecting Feather dispatched native CC_OP op 1 and produced the expected sell setup (quantity varbit 4396=1, price varbit 4398=3). The normal backpack mapping and an internal script 6009 were both incorrect here: the latter overwrote Offer as Drop/Examine and is no longer invoked. |
GE-007 | CONFIRMED | n3_ge_cancel(slot=1) resolves the first card's named Abort offer action, rather than hard-coding raw op 1 (View offer). The live control exposes View offer, Abort offer, and Modify offer; the repaired action dispatched native CC_OP op 2, removed the abort action from the card, and left the Feather available for collection. |
GE-008 | CONFIRMED | The typed collect-all route dispatched and, after both the filled buy and the aborted sell, returned the expected item/change to inventory. Collect-to-bank remains untested. |
GE-009 | CONFIRMED | The live collect-all owner was packed widget 30474246, index 0, and emitted a native CC_OP when it collected the completed purchase. |
GE-010 | OBSERVED | The one-item fixture verified the normal buy/sell setup and collection transitions. Insufficient funds/items, full inventory, offer limits, and numeric input edge cases remain pending. |
GE-011 | BLOCKED | No deliberate interface rebuild was injected between GE pipeline steps. |
2026-08-10: revision 240 Port Sarim safe cohort
Live fixture:
- account
Mamieparle, world382, initial and restored location(3036,3254,0); - revision health and action pacer ready, Walker idle, transactional interfaces closed, no combat target, and no active prayer;
- inventory, equipment, auto-retaliate, selected tab, and location were restored;
- direct-MCP session and exclusive lease were used for writes and released.
| Catalogue case | Verdict | Live evidence |
|---|---|---|
TAB-001 Account Management | DISPROVEN | High-level operation e485fd3d-1b33-4e64-9add-9fd4f55ff2e3 failed terminally as ACTION_NOT_FOUND even though live widget 35913777 exposed both requested aliases, Account Management and Account, plus Community and Useful links. Exact generic-widget operation 7c1bbef0-0337-4b4a-b249-4e5959d276a0 dispatched native CC_OP op 1; follow-up operation fbef842c-f59f-4235-8c0a-11b2ff77ca94 confirmed the tab was selected. TabActions now chooses one preferred live alias before invoking the uniqueness-enforcing widget resolver; focused tests pass, but the repair needs rebuild/reload verification. Inventory restore operation 0f8907cd-338d-4083-80fd-9983aa2f825f reached terminal CONFIRMED. |
OP-017, PASS-007 | CONFIRMED | Preview found one reachable step from (3036,3254,0) to (3036,3255,0). Operation e0132131-f67f-43a5-b8ea-eed5fd5739d4 remained ledger-level DISPATCHED, while typed state observed exact arrival, Walker idle, and distance 0; operation 8696985c-7798-4dce-85e4-0d318a061d35 restored the initial tile with the same postcondition. Same-coordinate plane 1 preview was unreachable and operation 8cf328e5-162e-4817-abad-1af67f9f0b8f failed terminally as PATH_NOT_FOUND without movement. |
COMBAT-003 | CONFIRMED | Correctly typed operation 563c16e8-0e27-4b01-9632-85afcd8bb1d7 changed typed auto-retaliate state from true to false; operation 70b8e42b-a3a5-4bab-9f48-4ad6fc5b1a94 restored true. Both ledgers remained DISPATCHED; the typed state transitions establish the round trip. |
PRAY-005 | CONFIRMED | Quick-prayer setup operation c113ed66-7f4d-4fd7-a934-99cd68295e0b invoked native orb op 2 through the live Setup owner. Typed state changed quickPrayerOpen=false -> true; opening Inventory closed it and restored false without enabling a prayer or changing points. |
PRAY-007 unavailable prayer | CONFIRMED | With Prayer level and points 9, Piety operation d19eadae-bc06-473c-87c2-2ce047b87b78 failed terminally as PRAYER_WIDGET_NOT_FOUND. No prayer became active, quick prayer remained disabled, points stayed 9, and Inventory restore operation 98cdaa98-2502-4621-952b-6e902fec62ef closed the setup surface. |
TAB-001 Account Management reloaded repair | CONFIRMED | After rebuild/reload, high-level operation 895c859b-8e72-42f8-b56a-e1912b93ddaa chose only the preferred Account Management alias, invoked native CC_OP op 1, and reached terminal CONFIRMED with postDispatchSelected=true. Inventory restore operation b076e1c5-1e6a-4d1b-b468-497052f3988f also reached terminal CONFIRMED. This supersedes the repair-pending boundary above. |
SHOP-001 open/close | DISPROVEN | Brian 2892 exposed Talk-to and Trade; operation dc782e88-4c3c-4b7a-881d-77f953000b31 dispatched raw action slot 3, moved into range, and exposed the live shop item container. Steel battleaxe 1365 at dynamic index 3 had quantity 2 and actions Value, Buy 1, Buy 5, Buy 10, Buy 50, and Examine. While open, shop.state repeatedly failed with must be called on client thread; after native Close operation a6625750-abca-45f4-84ba-09f59acaf121, the unique Close owner disappeared and shop.state again returned open=false. AgentSdkReadService now routes shop.state through ClientThreadBridge; focused tests pass, but the repair needs rebuild/reload verification. No purchase occurred, inventory/equipment were unchanged, and Walker operation 3a561bc6-f8fb-4a59-9083-897b6b724144 restored the initial tile (3037,3237,0). |
SHOP-001 reloaded read repair | CONFIRMED | After rebuild/reload, Brian Trade operation 56901153-084e-469d-bff8-3d2d69800372 exposed the shop and the typed shop.state read returned open=true with all six stock IDs: 1375, 1363, 1365, 1367, 1369, and 1371. Native Close operation 55e9392e-521d-49a5-bdba-75929ab3c0df removed the unique Close owner, after which the typed read returned open=false with empty stock. Closed-shop buy operation 0595f878-415d-46e3-8338-0e1511a6fee8 failed terminally as SHOP_NOT_OPEN; no purchase or container delta occurred. Walker operation efaa9206-474a-4cab-8f34-0a5bc7a7e993 restored the initial tile (3035,3237,0), and the lease was released. |
SHOP-002 buy by ID | CONFIRMED | With explicit spending authorization, Buy 1 Steel battleaxe 1365 operation 7837541d-3053-4264-9dbe-505618a20668 added exactly one Steel battleaxe and changed coins from 337707 to 337057 (650 gp). Buy 5 Bronze battleaxe 1375 operation 158b2497-a10c-4712-a635-214379a6d731 against stock 4 added exactly four Bronze battleaxes, changed coins to 336847 (210 gp), and reduced live stock to zero. The purchased items remain in inventory. Buy 10/50 and exact-name routes remain pending. |
SHOP-003 zero stock | DISPROVEN | At live stock zero, Buy 1 Bronze battleaxe operation 381a87ec-1b2d-442a-99c0-1045576c8315 returned DISPATCHED even though coins and inventory did not change. ShopActions now rejects a present item with quantity <= 0 as SHOP_ITEM_OUT_OF_STOCK before dispatch; focused validation passes, but live confirmation requires rebuild/reload. Shop Close operation 18cb6952-3c7e-42ad-a039-38fd879999af completed, Walker operation fbeacc72-aa46-475e-98cb-b6b52b103116 restored (3035,3237,0), and the lease was released. |
BOX-001 open/enumerate | CONFIRMED | Port Sarim Bank deposit box 26254 at (3045,3234,0) exposed live action Deposit. Operation 4a3d948e-e043-434a-9d38-29ed47907fb7 opened group 192; the live inventory container exposed Mind rune 558 quantity 14225 with Deposit-1, Deposit-5, Deposit-10, Deposit-X, Deposit-All, and Examine, plus the visible Deposit worn items control. |
BOX-004 quantities | CONFIRMED | Mind rune deposits produced exact live container transitions 14225 -> 14224 -> 14219 -> 14209 -> absent: operations 42be9498-e97f-4ddc-8588-0a2543e27233, e2c2ac74-27dc-492e-b4f1-0e06570faf74, b11adc25-34a2-4d9e-8907-ebe8e577bd64, and ae6424a1-ecba-4967-b24f-2b22cb944df8 covered 1, 5, 10, and All across ID and exact-name routes. |
BOX-002, BOX-003 bulk controls | CONFIRMED | Deposit-equipment operation 66369079-2b78-47c1-a4fb-18b88788d3b6 removed all seven equipped items, and deposit-inventory operation 50c772f8-4c9a-4978-a354-73f1009a4d1b left no live inventory entries with deposit actions. The original inventory quantities and all seven equipment slots were subsequently restored exactly through Draynor bank. |
BOX-005 close | DISPROVEN | High-level close operation e1077bc5-ec89-45ff-9ff9-ffef396319e6 dispatched raw op 1 against the static group 192, child 1 widget, but the interface remained open. Live discovery found the actionable Close owner at the same packed ID with dynamic index 11; exact native operation 346abec4-7b13-4649-9e2e-5148aa9def64 removed the Close owner and interface. DepositBoxActions.close() now selects that visible indexed action owner before dispatch; focused validation passes, but rebuild/reload confirmation remains pending. |
BOX-006 closed interface | CONFIRMED | After observed closure, deposit operation ca973b24-270f-4a44-a70b-d3f1e891948f failed terminally as DEPOSIT_BOX_NOT_OPEN without changing inventory. Deliberate hidden-child injection and an interface rebuild during an action remain pending. |
2026-08-02: Microbot parity audit (read-only comparison plus scoped repairs)
This audit compares every interaction family in the matrix with the known
functional Microbot helpers. A Microbot match is an implementation reference,
not live acceptance. MATCH means the data path is materially equivalent;
DRIFT means the n3 path is unsafe or structurally different; PENDING means
the implementation may be valid but still needs a live postcondition.
| Surface | Microbot reference and known data | n3 result / required follow-up |
|---|---|---|
| Tabs | Rs2Tab.switchTo uses client script 915, observes TOPLEVEL_PANEL, and waits; InterfaceTab includes Account Management. | PARTIAL: n3 retains widget/native tab dispatch and now exposes Account Management. Fixed-layout core tabs are live-confirmed; resizable, chat-channel, and script-vs-widget parity remain pending. |
| Generic widgets | WidgetInvokeHandler resolves group/child plus dynamic param0, then emits listener-owned CC_OP. | MATCH/PENDING: n3 widget dispatch uses each live widget's runtime index as the dynamic child parameter and selects native listener dispatch when an onOp owner exists; control-specific live evidence remains pending. |
| Keyboard/chatbox | Rs2Keyboard.typeString emits KEY_TYPED to direct canvas listeners and submits through an Enter key sequence. | MATCH/PARTIAL: direct listener delivery typed 14, and the explicit KEY_PRESSED(VK_ENTER), KEY_TYPED('\n'), KEY_RELEASED(VK_ENTER) sequence submitted the live Chatbox MES_TEXT prompt. The prompt closed and the exact bank/inventory deltas followed. GE MES_TEXT2 remains pending. |
| Dialogue | Rs2Dialogue uses SPACE for continue and digit/on-key listeners for options; uses current InterfaceID.DIALOG_* trees. | REPAIRED/PENDING: n3 now uses the sdk.query.Dialogue live recursive continue/option discovery for open-state and indexed selection; keyboard/live continuation postconditions still require client verification. |
| Bank Withdraw-X / Make-X | Rs2Bank.handleAmount and Rs2Widget.handleProcessingInterface wait for visible prompt, then keyboard-type and Enter; quantity is not client-side varbit mutation. | MATCH/PARTIAL: rev240 Withdraw-X is live-confirmed through visible-prompt discovery, direct typing, explicit Enter submission, prompt closure, and exact 28 -> 14 bank plus 0 -> 14 inventory deltas. Make-X still needs its own live fixture and postcondition. |
| Inventory source selection | Rs2Inventory.invokeMenu switches to Inventory and dynamically selects normal, bank, deposit-box, GE, shop, or trade containers. | REPAIRED/PENDING: normal inventory refreshes on every query, use-item routes gate Inventory, and GE/deposit/shop/trade have dedicated container queries; remaining work is live container/postcondition evidence. |
| Deposit box | Microbot uses parent group 192, item container 192:24, and text/action-resolved deposit controls; rev239 maps deposit inventory 192:31 and equipment 192:30. | REPAIRED/PENDING: n3 constants and item search were corrected to BankDepositbox.INVENTORY, DEPOSIT_INV, and DEPOSIT_WORN; close and quantity actions still need live confirmation. |
| NPC/object/player | Microbot dynamically resolves visible menu actions and branches to WIDGET_TARGET_ON_* when a widget is selected; player identifiers use the live player id. | REPAIRED/PENDING: n3 player dispatch matches and NPC/object/ground routes now branch on the live selected widget; item-on-target and instanced-region postconditions still require live evidence. |
| Ground items | Rs2GroundItem resolves actual ground-item actions and uses WIDGET_TARGET_ON_GROUND_ITEM for selected widgets; instance entries carry worldViewId. | DRIFT: n3 ground path hardcodes Take/op 3 and raw packets omit world-view context. Non-Take, selected-widget, and instanced-region cases are unconfirmed. |
| Combat | Microbot uses VarPlayerID.SA_ENERGY=300, SA_ATTACK=301, and WidgetInfo.MINIMAP_SPEC_ORB. | REPAIRED/PENDING: n3 now reads varplayers and targets the special orb; live energy/toggle postconditions remain pending. Attack-style child mappings were repaired earlier but need reload confirmation. |
| Prayer | Rs2PrayerEnum pairs InterfaceID.Prayerbook.PRAYER*, prayer index, and active varbit; invoke uses CC_OP identifier 1. | MATCH/PENDING: n3 mapping is structurally aligned; only Thick Skin has live evidence so far. Quick-prayer setup/bit masks remain pending. |
| Magic | Rs2Magic selects the spell, waits for widget-selected state, then targets NPC/player/object/item. | MATCH/PENDING: n3 WIDGET_TARGET selection and Magic tab gate match the route; target-consumption waits and all spellbooks remain pending. |
| Shop | Microbot uses SHOP_ITEM_CONTAINER and Buy identifiers 2/3/4/5 with slot+1. | PENDING: n3 labels match, but generic widget index versus slot+1 needs live proof. |
| GE/trade | Microbot switches to GE inventory container for sell; GE input uses Chatbox MES_TEXT2; trade inventory is group 336. | REPAIRED/PENDING: n3 GE sell now queries GrandExchangeInventory, trade uses the group-336 container, and GE quantity input uses keyboard boundary code; live input/offer postconditions remain pending. |
| World hopping | Microbot guards combat/bank/dialogue/already-hopping state and waits for target world/login. | REPAIRED/PENDING: n3 now rejects an active hop and open bank/shop/trade/dialogue before dispatch; landing/login postcondition still requires polling or live verification. |
| Walker/transports | Microbot walker waits for ARRIVED, with lock/retry/transport state; scene interaction includes reachability. | PENDING: n3 navigation intentionally returns dispatch-only and must be polled; transport and instance/world-view context need separate evidence. |
| Widget freshness | Microbot recursively searches current visible roots/dynamic/static children per call. | REPAIRED/PENDING: normal inventory now refreshes visible children on every query and dialogue/production paths use live recursive discovery; rapid live rebuild cases still need client evidence. |
The audit produced scoped source repairs in this refresh for special-attack varplayer/orb ownership, required Inventory gating for use-item and trade-offer Agent Server routes, rev239 deposit-box inventory/deposit-button ownership, GE sell-container selection, production quantity-owner discovery, and selected widget targeting for NPCs, objects, and ground items. Bank Withdraw-X now converges through the visible prompt and direct keyboard submission without synthetic resume packets or client-varbit mutation. Production amount still needs its own live fixture. World hopping, tab-script parity, and dynamic widget addressing also remain runtime boundaries; they are not treated as confirmed by compilation or dispatch.
Evidence required for every action case
Every action row must retain:
- RuneLite version, client revision, n3 mapping label, world, account/test profile, view mode, and relevant plugin configuration.
- The pre-action domain state.
- A widget description when a widget is involved:
packed ID, group, child, runtime index, parent ID, visibility, text, name,
item ID/quantity, actions,
hasListener,hasOnOpListener, and selected dispatch mode. - The requested semantic action and the actual one-based operation index.
- Native
MenuOptionClickedevidence and packet-trace evidence when emitted. - The operation record through a terminal state when Agent Server performs the write.
- The domain postcondition, such as interface visibility, selected tab, inventory/equipment delta, varbit change, dialogue transition, animation, arrival, or offer state.
- A screenshot before and after when the control or state is primarily visual.
For listener-owned controls, confirm the native CC_OP path and listener effect.
For server-owned controls, confirm the raw widget packet and resulting server
state. Record ACTIONS_NULL, ambiguity, hidden widgets, missing dynamic
children, and duplicate semantic owners as findings rather than substituting a
guessed operation.
Required environment axes
Repeat cases that address top-level or side-panel widgets across:
| Axis | Required variants |
|---|---|
| View mode | Fixed, resizable classic, resizable modern/bottom-line |
| Client state | Logged in, loading transition where relevant, logged out where relevant |
| Headless UI suppression | Off; on for packet/native/client-thread paths that are documented as supported |
| Native menu resolver | Cold cache, warm cache after restart, stale-cache rejection on a controlled revision fixture |
| Widget ownership | Named action on the matched widget, named action on an ancestor/descendant owner, listener-only actionless control |
| Pacing | Ready, deliberately paced, and previous operation unresolved |
| Agent Server | Read-only discovery; session/lease/idempotency for writes; terminal operation polling |
A. Dispatch and opcode contracts
These cases certify the shared transport used by every higher-level workflow. Higher-level cases do not replace them.
| ID | Family | Required cases | Required postcondition |
|---|---|---|---|
| OP-001 | Mouse click | Valid canvas click; invalid/unavailable canvas; click preceding raw widget op; click preceding native widget op | One mouse event per requested click; downstream action is not duplicated |
| OP-002 | Raw widget option | IF_BUTTON operations 1 through 10 against controls that expose each available slot | Correct packed ID, runtime child/index, item ID, operation number, and resulting interface/domain change |
| OP-003 | Widget option X | IF_BUTTONX with a real quantity/input flow | Requested amount is submitted once and the item/interface state changes |
| OP-004 | Widget sub-operation | IF_SUBOP on an item/control with a live sub-op table; missing sub-op table | Correct sub-op is selected; missing table fails with ACTIONS_NULL |
| OP-005 | Native widget operation | Listener-backed CC_OP, including action owned by a parent or dynamic child | MenuOptionClicked records CC_OP; listener-owned postcondition occurs; no raw duplicate |
| OP-006 | Widget close | A normal close action and a close control requiring MenuAction.WIDGET_CLOSE | Target interface disappears without closing an unrelated interface |
| OP-007 | Widget target on widget | IF_BUTTONT/selected widget on another widget, including item-on-item and spell-on-item | Selection is consumed and target state changes |
| OP-008 | Inventory/item action | OPHELDD/inventory operations for action slots 1 through 10 where live items expose them | Correct slot, item ID, action index, and inventory/equipment state |
| OP-009 | NPC action | OPNPC1 through OPNPC5, using named-action resolution and an explicit-index case | Correct NPC index and expected dialogue/combat/transport state |
| OP-010 | Object action | OPLOC1 through OPLOC5, including an object with transformed composition | Correct object ID/location and expected interface, animation, or movement state |
| OP-011 | Ground-item action | OPOBJ1 through OPOBJ5, including Take and an explicit-index case | Correct item ID/tile and inventory or ground-item delta |
| OP-012 | Player action | OPPLAYER1 through OPPLAYER8, covering trade/follow and one higher option slot when available | Correct player index and social/trade state |
| OP-013 | Selected widget on NPC | OPNPCT using an inventory item and a spell/widget selection | Selection is consumed and NPC interaction occurs |
| OP-014 | Selected widget on object | OPLOCT using an inventory item and a spell/widget selection | Selection is consumed and object interaction occurs |
| OP-015 | Selected widget on ground item | OPOBJT | Selection is consumed and ground-item interaction occurs |
| OP-016 | Selected widget on player | OPPLAYERT | Selection is consumed and player interaction occurs |
| OP-017 | Walk | MOVE_GAMECLICK, short reachable tile, blocked tile, plane mismatch, and Walker-issued movement | Destination/progress changes; blocked or invalid targets fail closed |
| OP-018 | Dialogue continue | RESUME_PAUSEBUTTON and a listener-backed visible Continue control | Exactly one dialogue advance |
| OP-019 | Dialogue input | RESUME_COUNTDIALOG, RESUME_NAMEDIALOG, RESUME_STRINGDIALOG, and RESUME_OBJDIALOG | Submitted value is reflected by the next interface/domain state |
| OP-020 | Heading | SET_HEADING | Must remain explicitly unsupported and fail closed until an artifact-proven mapping exists |
For action-index families, test every supported index with a real live target. Testing only option one does not certify the other packet fields or byte transforms.
B. Shared widget dispatch
| ID | Behavior | Cases |
|---|---|---|
| WD-001 | Semantic action resolution | Exact match, normalized case/tags/spacing, multiple requested fallbacks, no match, duplicate match |
| WD-002 | Action-owner resolution | Action on matched widget, parent, child, nested dynamic child, multiple possible owners |
| WD-003 | Dispatch selection | Raw packet without onOp; native CC_OP with onOp; listener-only actionless widget |
| WD-004 | Dynamic addressing | Same packed ID with multiple runtime indexes; omitted index; stale index after interface rebuild |
| WD-005 | Item-backed widgets | Correct item ID and quantity; empty slot; noted/variant item; widget rebuilt after state change |
| WD-006 | Pacing and ordering | Pacer check, mouse click, widget/native action, trace record; failure at each boundary |
| WD-007 | Explicit raw op escape hatch | Valid op, op zero, out-of-range op, hidden widget, null widget |
| WD-008 | Selected widget state | Select, target, deselect, stale selection, selection consumed by another action |
C. Tabs and top-level interfaces
Tab.values() currently defines 13 tabs. Test every constant, not one tab per
layout:
COMBAT, SKILLS, QUESTS, INVENTORY, EQUIPMENT, PRAYER, MAGIC,
FRIENDS_CHAT, FRIENDS, LOGOUT, SETTINGS, EMOTES, and MUSIC.
| ID | Cases | Postcondition |
|---|---|---|
| TAB-001 | Every tab in fixed mode | The intended tab content becomes visible and TabActions.isOpen agrees |
| TAB-002 | Every tab in resizable classic | Same |
| TAB-003 | Every tab in resizable modern/bottom-line | Same |
| TAB-004 | Already-open tab | Returns confirmed without a duplicate transition |
| TAB-005 | Parent/child action ownership | Native action is sent to the unique live owner |
| TAB-006 | Unavailable tab | Fails closed without clicking the adjacent stone |
| TAB-007 | Logout tab variants | Correct logout/world-switcher control is selected in each layout |
D. Inventory and equipment
| ID | Cases |
|---|---|
| INV-001 | Inventory container and all 28 dynamic slot indexes in every view mode |
| INV-002 | Named item action resolution for Use, Eat, Drink, Wear, Wield, Equip, Drop, Destroy, and representative custom actions |
| INV-003 | Duplicate item stacks, noted items, charged/degraded variants, and exact item-ID selection |
| INV-004 | Drop ordering: row-major, reverse row-major, column-major, reverse column-major |
| INV-005 | Drag/move from every row and column boundary, including empty destination and occupied destination |
| INV-006 | Item-on-item, item-on-NPC, item-on-object, item-on-ground-item, item-on-player, and widget-on-widget |
| INV-007 | Selected spell on inventory item and selection cleanup |
| EQP-001 | Read every equipment slot and backing widget |
| EQP-002 | Equip via each live inventory action label used by supported items |
| EQP-003 | Unequip every occupied slot through Remove |
| EQP-004 | Equipment-side inventory shown by another interface, including Tutorial Island |
Per-slot bank worn-equipment writes remain out of the public write API until independent confirmation of their controls and actions.
E. Bank
Test ordinary banks, bank booths/chests, NPC bankers, and layout changes caused by bank settings.
| ID | Cases | Postcondition |
|---|---|---|
| BANK-001 | Open nearest object and NPC variants; already open; unreachable target; ambiguous target | Bank universe is visible |
| BANK-002 | Close through the live close owner and WIDGET_CLOSE path | Bank universe is hidden |
| BANK-003 | Every BankWidget clickable control: close, deposit inventory, deposit worn, worn-items panel, settings, group storage, tutorial, incinerator | Intended sub-interface or item delta |
| BANK-004 | Read-only BankWidget descriptors: universe, item grid, bank-side inventory, search background, tab container, scrollbar, equipment container | Descriptor resolves but action is rejected |
| BANK-005 | Bank item grid indexes across tabs, scrolling, search, placeholders, and duplicate item variants | Correct item widget is selected |
| BANK-006 | Withdraw 1, 5, 10, X, All; item and noted modes | Exact inventory/bank quantity delta |
| BANK-007 | Withdraw-X followed by count-dialog resume | Requested amount varbit and inventory delta agree |
| BANK-008 | Ensure withdraw item/noted mode when already selected and when switching | Mode state changes once |
| BANK-009 | Ensure default and custom withdraw quantity | Selected quantity state agrees |
| BANK-010 | Deposit inventory and deposit worn controls | Inventory/equipment empties as expected |
| BANK-011 | Bank-side inventory item actions Deposit-1, 5, 10, X, All | Exact inventory/bank delta |
| BANK-012 | Worn-items panel read model and deposit-all-worn action | Backing widgets resolve; equipment delta is observed |
| BANK-013 | Tab selection, search open/close, scrollbar, settings panel, placeholders, rearrange mode | Read APIs match visible state |
| BANK-014 | Bank PIN presence | Automation pauses; no bank control is guessed through the keypad |
F. Deposit box
The current implementation uses group 192, close child 1, deposit-inventory
Observe each one rather than inferring it.
| ID | Cases |
|---|---|
| BOX-001 | Open-state detection and item-container enumeration |
| BOX-002 | Deposit inventory |
| BOX-003 | Deposit equipment |
| BOX-004 | Deposit item quantities 1, 5, 10, and All |
| BOX-005 | Close |
| BOX-006 | Missing/hidden child and interface rebuild |
G. Dialogue, chatbox input, and blocking screens
| ID | Cases |
|---|---|
| DLG-001 | NPC dialogue group 231, name child 4, text child 6 |
| DLG-002 | Player dialogue group 217, text child 6 |
| DLG-003 | Options group 219, dynamic options under child 1; first, middle, and last option |
| DLG-004 | Option selection by index, exact/normalized text, predicate, and Quest Helper marker |
| DLG-005 | Continue by visible named action and resume-pause packet fallback |
| DLG-006 | Amount, object ID, free text, and name entry |
| DLG-007 | Stale option list after one selection; no repeated submit on unchanged state |
| DLG-008 | Welcome-screen Play control and confirmed transition to logged-in state |
| DLG-009 | Death dialogue continue and gravestone/reclaim follow-up |
| DLG-010 | Fixed/resizable mode recognition and mode switch controls |
| DLG-011 | Chatbox search/message layers used by Inventory Setups; coexistence with World Map search |
H. Production
Run each case on a standard Make-X interface and the legacy Smithing interface.
| ID | Cases |
|---|---|
| PROD-001 | Enumerate every visible product with packed ID, runtime index, item ID, text/name, and action owner |
| PROD-002 | Choose first, middle, and last product by index |
| PROD-003 | Choose by exact and normalized item name; ambiguous and absent names |
| PROD-004 | Smithing product children, including dagger and products at both ends of the live child range |
| PROD-005 | Quantities ONE, FIVE, TEN, ALL, and X |
| PROD-006 | Custom amount after selecting X |
| PROD-007 | Selected-product heuristic compared with the visible highlight and actual produced item |
| PROD-008 | Selected-quantity heuristic compared with the visible highlight and produced count |
| PROD-009 | Interface rebuild after ingredient change, level restriction, or product completion |
Every product child index used by current supported recipes requires at least an observation case. Every quantity button requires an action case.
I. Grand Exchange
| ID | Cases |
|---|---|
| GE-001 | Open nearest booth/clerk and already-open detection |
| GE-002 | Close using the unique visible Close owner; dynamic index retained in evidence |
| GE-003 | All eight slots: empty, buy, sell, completed, cancelled, and partially filled reads |
| GE-004 | Buy child and sell child for every slot |
| GE-005 | Select an item from search, set quantity, set price, confirm offer |
| GE-006 | Select a sell item from GE inventory, including duplicate/variant item handling |
| GE-007 | Cancel each slot and confirm terminal slot state |
| GE-008 | Collect to inventory and collect to bank where available |
| GE-009 | Collect-all visible-owner resolution |
| GE-010 | Back navigation, input dialogs, insufficient coins/items, full inventory, and offer limit |
| GE-011 | Interface rebuild between pipeline steps; stale widget rejection |
Do not spend coins or create/cancel an offer without the exact item, quantity, and price in the authorized test fixture.
J. Shop and trade
| ID | Cases |
|---|---|
| SHOP-001 | Shop open/closed detection and stock enumeration |
| SHOP-002 | Buy 1, 5, 10, and 50 by ID and exact name |
| SHOP-003 | Stock zero, insufficient coins, full inventory, duplicate/variant item |
| SHOP-004 | Player inventory inside shop: Sell 1, 5, 10, 50, and custom live actions |
| TRADE-001 | First-screen open detection, partner-name title, own/their item containers |
| TRADE-002 | Offer 1, 5, 10, X, and All; amount input and exact item delta |
| TRADE-003 | First-screen accept and decline |
| TRADE-004 | Second-screen partner/items validation |
| TRADE-005 | Second-screen accept and decline |
| TRADE-006 | Acceptance-state text, changed-offer reset, partner departure, and interface closure |
| TRADE-007 | Mule TradeAutomator end-to-end with the intended partner and no third-party match |
Trade and shop mutations require an isolated fixture and authorization.
K. Prayer and combat interfaces
| ID | Cases |
|---|---|
| PRAY-001 | Every RuneLite Prayer widget: visibility, required level, enable, disable, and active varbit |
| PRAY-002 | setOnly transition among melee, ranged, magic, overhead, and utility prayer groups |
| PRAY-003 | Disable all |
| PRAY-004 | Quick-prayer orb enable/disable and varbit agreement |
| PRAY-005 | Open quick-prayer setup through the live Setup/Quick-prayers owner |
| PRAY-006 | Every quick-prayer child index and bit-mask mapping |
| PRAY-007 | Insufficient prayer points, unavailable level, conflicting prayers, interface closed |
| COMBAT-001 | Special-attack control and energy/enabled varbits |
| COMBAT-002 | Every AttackStyle supported by each live weapon-style layout |
| COMBAT-003 | Auto-retaliate control and varbit |
| COMBAT-004 | Weapon swap rebuilding the combat interface |
| COMBAT-005 | Poison, venom, antifire, wilderness, and multi-combat read-state comparisons |
The current special-attack implementation resolves an orb component; verify that the observed live control is the special-attack owner before certifying it.
L. Magic
Spell currently maps 185 constants. Every constant must receive an address
and visibility observation in its intended spellbook. Shared dispatch can then
be action-tested by behavior cohort.
| ID | Cases |
|---|---|
| MAGIC-001 | Every standard spell constant in standard spellbook |
| MAGIC-002 | Every Ancient Magicks spell constant in ancient spellbook |
| MAGIC-003 | Every Lunar spell constant in lunar spellbook |
| MAGIC-004 | Every Arceuus spell constant in Arceuus spellbook |
| MAGIC-005 | All home-teleport variants, including constants that share a back-button component |
| MAGIC-006 | Untargeted cast and observed effect/cooldown |
| MAGIC-007 | Spell on inventory item |
| MAGIC-008 | Spell on NPC |
| MAGIC-009 | Spell on player |
| MAGIC-010 | Spell on game object |
| MAGIC-011 | Spell on ground item |
| MAGIC-012 | Select and deselect; stale selection after tab/interface change |
| MAGIC-013 | Autocast and defensive autocast for supported combat spells |
| MAGIC-014 | Insufficient level/runes, filtered spellbook, hidden spell, cooldown, teleblock |
| MAGIC-015 | High Alchemy owner discovery across spellbook layout/filter changes |
Each spell observation records the exact InterfaceID.MagicSpellbook component,
live action list, listener ownership, and selected dispatch mode. Shared widget
IDs between semantic spells require separate contextual cases.
M. Minigame teleports
The current destination set contains 12 entries. Test every entry:
PEST_CONTROL, LAST_MAN_STANDING, NIGHTMARE_ZONE,
BARBARIAN_ASSAULT, TITHE_FARM, BLAST_FURNACE, CASTLE_WARS,
FISHING_TRAWLER, SOUL_WARS, TROUBLE_BREWING, VOLCANIC_MINE, and
GUARDIANS_OF_THE_RIFT.
| ID | Cases |
|---|---|
| MINI-001 | Open through each production-supported entry path |
| MINI-002 | Destination dropdown open/closed state |
| MINI-003 | Every destination row: text match, packed ID, runtime index, action owner, Select dispatch |
| MINI-004 | Castle Wars special runtime index and comparison with the generic child mapping |
| MINI-005 | Selected-destination heuristic against the collapsed selector |
| MINI-006 | Final Teleport owner and dispatch |
| MINI-007 | Arrival at every destination |
| MINI-008 | Cooldown, teleblock, unavailable activity, hidden row, duplicate semantic owner |
| MINI-009 | Last-use varplayer and cooldown read-state agreement |
N. Movement interfaces and Walker transports
Destination enums are matrices, not representative samples:
| Family | Current destination count | Required coverage |
|---|---|---|
| Fairy rings | 44 | Every code: three dial varbits, clockwise/anticlockwise controls, confirm, arrival |
| Gnome gliders | 7 | Every destination row and arrival |
| Spirit trees | 11 | Every destination row/dialogue option and arrival |
| Charter ships | 9 | Every port row/dialogue option, coin/item cost, and arrival |
| Magic carpets | 7 | Every stop, dialogue/payment, and arrival |
| Minecarts | 3 | Every station and arrival |
| Bird flights | 5 | Every destination and arrival |
| Canoes | All supported stations/types | Build interface, canoe type, destination map, animation, arrival |
Also test:
| ID | Cases |
|---|---|
| MOVE-001 | Curated transport called directly through its action class |
| MOVE-002 | The same transport selected and executed by Walker |
| MOVE-003 | Every imported complex transport row in the pinned Shortest Path resource |
| MOVE-004 | Every generic NPC transport action index and named action |
| MOVE-005 | Every generic object transport action index and named action |
| MOVE-006 | Agility/grapple shortcut object action and completion |
| MOVE-007 | Item teleport: inventory action, animation, consumption/charge delta, arrival |
| MOVE-008 | Spell teleport: spellbook, rune/level checks, animation, arrival |
| MOVE-009 | Home teleport: spellbook-specific widget, cooldown, animation, arrival |
| MOVE-010 | POH and jewellery dialogue/widget chains used by imported routes |
| MOVE-011 | Source action accepted but destination not reached; timeout must not be success |
| MOVE-012 | Ambiguous NPC/object match; neither match; unreachable target; unexpected plane |
| MOVE-013 | World Map Set Target preview, Start Path, and Walk Assistant panel destination |
| MOVE-014 | Shared Walker ownership, foreign-path refusal, replacement, cancellation, and terminal cleanup |
The detailed imported-row execution record belongs in
docs/[walker-transports.md`](../walker-transports.md); this catalogue owns the requirement that every
reachable row has a live verdict.
O. Plugin-owned interface assumptions
Tutorial Island
Test the full controller through COMPLETE, but retain individual widget/action
cases so a later full run cannot hide a stage-specific guess.
| ID | Controls and transitions |
|---|---|
| TUT-001 | Historical name root 558:1; current name input/text/status/look-up/set-name children |
| TUT-002 | Familiarity Experienced player control |
| TUT-003 | Historical appearance root 679:4; body A/B; all 12 left controls; all 12 right controls; confirm |
| TUT-004 | NPC/player/options dialogue and continue handling at every instructor |
| TUT-005 | Inventory/equipment side panel during equipment instruction; bronze dagger Equip owner |
| TUT-006 | Smithing root and dagger product child |
| TUT-007 | Account-management tab and poll message |
| TUT-008 | Bank-space modal container, visible sentinel, and close child |
| TUT-009 | Settings tab, all-settings owner, search focus, searched setting toggle, close; missing optional setting fails open |
| TUT-010 | Every object/NPC action used by the tutorial and its transition varp postcondition |
| TUT-011 | Restart recovery at every controller stage and stale pending-action cleanup |
| TUT-012 | Manual one-action stepping, one-stage stepping, and resume |
Break Handler and logout
| ID | Cases |
|---|---|
| BREAK-001 | Bank PIN detection prevents unsafe interaction |
| BREAK-002 | Logout tab/control in fixed, resizable classic, and resizable modern layouts |
| BREAK-003 | World-switcher logout variants and duplicate visible candidates |
| BREAK-004 | Native CC_OP logout trace and confirmed LOGIN_SCREEN postcondition |
| BREAK-005 | Planned break, active break, reconnect/profile login, and state reset |
Other plugin-specific widgets
| ID | Owner | Cases |
|---|---|---|
| PLUG-001 | Inventory Setups | Bank item grid/title/scrollbar, bank load events, chatbox item search layers, World Map search coexistence, injected RuneLite menu entries |
| PLUG-002 | Bank Stander | Inventory vs bank menu-entry ownership, Make-X option capture, RuneLite menu injection, full bank-production loop |
| PLUG-003 | Mule | Trade partner titles on both screens, offer/accept/decline, changed-offer reset |
| PLUG-004 | Fighter | Gravestone generic interface, unique Reclaim owner, inventory/equipment postcondition |
| PLUG-005 | Guardians of the Rift | HUD parent, portal position, energy title/value, first-portal timing, barrier/altar transitions |
| PLUG-006 | Dialogue Helper | Spacebar continue and Quest Helper marked-option parsing without duplicate selection |
| PLUG-007 | Walk Assistant | Dedicated sidebar, bank/city selection, hotkeys, cancel, path replacement |
| PLUG-008 | Shortest Path UI | World Map overlays, fairy-ring log/favourites/scrollbar, menu layers, minimap variants |
| PLUG-009 | Looting bag | Items container, open, deposit by item/quantity, count and visibility reads |
| PLUG-010 | Welcome/death flow | Welcome Play, death dialogue, reclaim interface, return to normal state |
| PLUG-011 | GE Flipper | Flipping Copilot widget/NPC overlays, semantic action-owner resolution, quantity/price chatbox entry, high/low-price confirmation, Break Handler pause, and observed offer-state transitions |
P. Read-state heuristics that require comparison with the visible client
| ID | Read surface | Required comparison |
|---|---|---|
| READ-001 | Production selected product | Visible highlight, backing widget, and produced item |
| READ-002 | Production selected quantity | Visible highlight and actual produced amount |
| READ-003 | Minigame selected destination | Collapsed selector, selected row, and actual teleport |
| READ-004 | Bank withdraw/requested quantity/placeholder/rearrange mode | Visible controls and subsequent withdrawal |
| READ-005 | Camera zoom and viewport projection | Client rendering at several zooms, pitches, yaws, resizes, and planes |
| READ-006 | Combat/prayer/magic selected state | Visible control plus corresponding varbit/varplayer |
| READ-007 | GE/shop/trade state | Visible slot/item/text state plus domain action result |
| READ-008 | Guardians of the Rift HUD | Visible HUD values plus relevant varbits/events |
| READ-009 | World Map state | Visible map bounds, surface, overview, and selected destination |
| READ-010 | Dialogue option indexes | Visible order, stripped text, color/Quest Helper marker |
Q. Utility, world switching, and sailing
| ID | Cases |
|---|---|
| UTIL-001 | Run orb in every view mode; disabled-to-enabled and enabled-to-disabled transitions |
| UTIL-002 | toggleRun(boolean) with requested state already satisfied and not satisfied; verify it does not invert an already-correct state |
| UTIL-003 | Bulk drop with zero, one, and several matching inventory items; pacing must prevent an unbounded same-tick burst |
| UTIL-004 | Accept Aid request remains explicitly unsupported and causes no state change until safely wired |
| UTIL-005 | Utility logout control and confirmed login-screen postcondition |
| WORLD-001 | Open in-game world hopper in every view mode |
| WORLD-002 | Load world list and compare every exposed world property with the visible list |
| WORLD-003 | Hop to normal, members, skill-total, PvP/high-risk, and unavailable/full worlds using controlled fixtures |
| WORLD-004 | Confirmation/warning dialogue during hop; loading transition; final world ID |
| WORLD-005 | Lobby world list open/close and lobby hop where the current login mode supports it |
| WORLD-006 | Stale world list, same-world request, restricted world, and failed hop recovery |
| SAIL-001 | Every SailingInteraction.Direction request and observed direction |
| SAIL-002 | Increase and decrease speed through all supported speed states |
| SAIL-003 | Set and unset sails, with movement/navigating state comparison |
| SAIL-004 | Pacing, non-sailing context, missing control/mapping, and repeated request |
| SAIL-005 | SET_HEADING remains fail-closed while higher-level sailing controls are tested through their actual supported path |
R. Passive live-state surfaces adjacent to interactions
These APIs do not dispatch a widget or packet, but their results gate production actions and require live comparison:
| ID | Surface | Cases |
|---|---|---|
| PASS-001 | NPC/object/player/ground-item queries | Scene add/remove, transformed object, duplicate name/ID, plane and reachability |
| PASS-002 | Graphics objects | Spawn, movement/lifetime, ID filtering, removal |
| PASS-003 | Projectiles | Spawn, source/target, remaining cycles, ID filtering, removal |
| PASS-004 | Collision/reachability | Doors, walls, diagonal movement, instanced regions, plane changes, visited-tile bounds |
| PASS-005 | Skills/quest/progress | Base/boosted/drained levels, XP transition, quest state transition, absent diary mapping |
| PASS-006 | Rune pouch and spell requirements | Ordinary/divine pouch, rune slots/quantities, combination runes, inventory+pouch totals |
| PASS-007 | Navigation state | Goal, path, progress, stall, reached distance, cancellation, foreign active path |
| PASS-008 | Recent events and varbit changes | Event ordering, bounded retention, client tick/timestamp, restart reset |
S. Failure and recovery cases
Every domain above must exercise applicable failures:
- target absent, hidden, off-screen, unreachable, or rebuilt;
- multiple widgets with the same packed ID or semantic action;
- action array null, blank, stale, or missing the requested action;
- listener present on a different widget than the visible label;
- invalid or stale dynamic index;
- pacer refusal;
- client not logged in, local player absent, loading, or revision unhealthy;
- lease contention, expired session, repeated idempotency key, and operation timeout;
- dispatch accepted without a domain postcondition;
- client restart after dispatch;
- inventory full, insufficient item/coins/runes/level, cooldown, teleblock, or quest restriction;
- manual user action racing the automation;
- plugin stopped or break activated while an operation is pending.
The expected result is fail-closed behavior, a specific structured
InteractionStatus, no duplicate action, and no unrelated state mutation.
Execution order
- Certify
OP-*andWD-*shared dispatch contracts on the active revision. - Certify tabs, inventory/equipment, dialogue, and blocking screens.
- Certify bank and deposit-box controls.
- Certify production, prayer/combat, and magic cohorts.
- Certify GE, shop, and trade using isolated fixtures.
- Certify minigames and every transport destination/row.
- Run plugin-owned end-to-end workflows.
- Repeat the revision-sensitive smoke subset after every RuneLite revision:
raw widget op, native listener
CC_OP,WIDGET_CLOSE, inventory item action, NPC/object/player/ground-item option, each selected-widget target family, walk, dialogue input, one tab per layout, bank withdraw/deposit, production option/quantity, spell cast, minigame selection, and one complex Walker transport.
Completion rule
The live-interaction surface is complete only when:
- every row has a current-revision verdict;
- every enum-backed matrix has a verdict for every current constant;
- every imported transport row has a verdict or a documented unreachable prerequisite;
- every
CONFIRMEDaction includes dispatch evidence and an observed postcondition; - every
DISPROVENcase links to the owning production call site and a repair issue/change; - no result treats
DISPATCHEDas success.
Production-owner traceability
This table is the completeness backstop for the production action surface. Add a row here when a new action owner is introduced.
| Production owner | Catalogue coverage |
|---|---|
WidgetActions | OP-002 through OP-007, WD-* |
InventoryActions, InventoryDropActions | INV-*, UTIL-003 |
EquipmentActions | EQP-* |
UseItemActions | OP-007, OP-013 through OP-016, INV-006 |
NPCActions | OP-009, PASS-001 |
ObjectActions | OP-010, PASS-001 |
TileItemActions | OP-011, PASS-001 |
PlayerActions | OP-012, PASS-001 |
BankActions, BankInventoryActions, BankWornEquipmentActions | BANK-* |
DepositBoxActions | BOX-* |
DialogActions | DLG-*, OP-018, OP-019 |
BlockingEventActions | DLG-008 through DLG-010 |
GrandExchangeActions | GE-* |
ShopActions | SHOP-* |
TradeActions | TRADE-* |
PrayerActions | PRAY-* |
CombatActions | COMBAT-* |
MagicActions | MAGIC-* |
TabActions | TAB-* |
ProductionActions | PROD-* |
MinigameTeleportActions | MINI-* |
FairyRingActions, GnomeGliderActions, SpiritTreeActions, CharterShipActions, TransportActions | MOVE-* and the destination matrix |
NavigationActions | OP-017, MOVE-013, MOVE-014, PASS-007 |
LootingBagActions | PLUG-009 |
UtilityEventActions | UTIL-* |
WorldActions | WORLD-* |
SailingActions | SAIL-*, OP-020 |
GraphicsObjectActions, ProjectileActions, ReachabilityActions | PASS-002 through PASS-004 |
RuneLiteTutorialIslandRuntime, TutorialWidget | TUT-* |
BreakHandlerPlugin | BREAK-* |
| Inventory Setups, Bank Stander, Bank Stander Plus, Mule, Fighter, Guardians of the Rift, Dialogue Helper, Walk Assistant, Shortest Path, GE Flipper | PLUG-* |
GE Flipper live acceptance
GE Flipper has static source and regression-test coverage. Live acceptance on the current RuneLite and Flipping Copilot builds remains pending. Use an authorized low-value offer and retain evidence for the Copilot overlay, resolved widget owner and action, emitted menu/widget event, and resulting GE state. Cover buy and sell setup, quantity and price entry, offer confirmation, high- and low-price warnings, collection, abort/modify, Break Handler pause, shutdown, and restart. A dispatched interaction or mouse packet does not prove that the GE advanced.
Bank Stander Plus live acceptance
Bank Stander Plus remains statically validated only. Before promoting any recipe or location to LIVE_VERIFIED, retain current-artifact evidence for the dispatched action and its domain postcondition. Cover stationary item/item, production interface, range/fire, furnace, anvil, Magic, permanent/existing/new campfire, and Varrock west/Grand Exchange/Falador east line-Firemaking flows. Also cover automatic and explicit routing, break/logout recovery, manual-stop cleanup, and every target mode.
GE acceptance is a separate asset-changing fixture. It requires exact user-authorized item, quantity, price, and spend bounds and must prove unique slot adoption, partial and full fill, separate-tick cancellation/collection/reprice, returned bank supplies, and unchanged unrelated offers. Until that evidence exists, automated procurement must remain fail-closed.
Superseding tab-prerequisite contract (2026-08-29)
| Surface | Status | Superseding evidence requirement |
|---|---|---|
| Inventory, Equipment, Prayer, Magic, Combat, and Magic-minigame requested actions | STATIC-VERIFIED / LIVE-PENDING | Shared actions now return targeted WIDGET_HIDDEN without selecting a tab or queuing the dependent action. Agent Server dispatches each requested route exactly once. Existing live rows above remain historical evidence of the former implicit-gating behavior. Rebuild and reload the client, verify the selected tab is unchanged on failure, then explicitly open the tab and prove the requested domain postcondition. |