Skip to main content

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/actions
  • src/main/java/com/n3plugins/sdk/widgets
  • src/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/PacketUtils and src/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:

StatusMeaning
PENDINGThe case has not been executed on the target revision.
BLOCKEDA documented account, location, quest, item, or interface prerequisite is unavailable.
OBSERVEDThe live widget/menu state was captured, but the action and postcondition were not both tested.
CONFIRMEDThe expected dispatch evidence and domain postcondition were both observed.
DISPROVENCurrent live behavior contradicts the implementation assumption.
INDETERMINATEDispatch 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, world 454, initial location (3092,3243,0);
  • RuneLite revision 239, mapping label 2026-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 caseVerdictLive evidence
OP-001OBSERVEDEach 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-007DISPROVENExplicit 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-003DISPROVENNative 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-006DISPROVENOpen-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-001CONFIRMEDBank 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-openCONFIRMEDA second open request returned Bank is already open without another object action; operation ad3a5a4c-ae10-4e83-9960-613ed531ab2c.
BANK-005OBSERVEDBank 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 itemCONFIRMEDWithdrawal 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 inventoryINDETERMINATEDeposit-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-001DISPROVENFixed-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-004CONFIRMEDOpening already-selected Inventory returned CONFIRMED, Tab is already open, with postDispatchSelected=true; operation fdcb50fa-ba3b-4533-85e2-5ff1a369cc7a.
WD-006OBSERVEDDeliberately 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-001BLOCKEDThe live fixture had no inventory or equipped items. Container emptiness was observed, but slot/action behavior could not be certified.
READ-005OBSERVEDCamera read returned yaw 16205, pitch 3064, zoom 128, and viewport 512x334; visual projection comparison remains pending.
PASS-001OBSERVEDLive 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-004OBSERVEDSame-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-005OBSERVEDAll 24 live skills, including Sailing, returned real and boosted levels. No XP or quest transition was performed.
PROD-001, PROD-005OBSERVEDProduction 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-009OBSERVEDMinigame 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-005BLOCKEDNo visible Continue widget was present in the bank fixture.
PRAY-001OBSERVEDLive 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, world 308, location (3092,3243,0);
  • RuneLite revision 239, mapping label 2026-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_NPuZRc5JYJigWQgC7SuaozKQ and exclusive lease used for writes.
Catalogue caseVerdictLive evidence
OP-001 native-widget sequenceOBSERVEDA 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-003CONFIRMEDListener-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-002CONFIRMEDOpen-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-001CONFIRMEDAll 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 1CONFIRMEDBronze 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-002CONFIRMEDWith 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 inventoryCONFIRMEDDeposit-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 opDISPROVENExplicit 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 widgetCONFIRMEDClosed 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 panelCONFIRMEDListener-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, 10CONFIRMEDEarth 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 variantCONFIRMEDBanker 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-007CONFIRMEDNavigation 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 convergenceDISPROVENOperation 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, world 433, initial and restored location (3234,3219,0);
  • RuneLite revision 239, mapping label 2026-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 caseVerdictLive evidence
OP-005, WD-003, TAB-001, Agent Server terminal convergenceCONFIRMEDOpening 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 opCONFIRMEDExplicit 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-007CONFIRMEDNavigation 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-001OBSERVEDInventory 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-008OBSERVEDThe 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 continuedCONFIRMEDFresh 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 pacingCONFIRMEDA 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-003DISPROVENPre-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-001OBSERVEDCurrent 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-004OBSERVEDLine-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-005OBSERVEDAll 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-009OBSERVEDCamera 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-upDISPROVENThe 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-006OBSERVEDTyped 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-001OBSERVEDProduction, 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 continuedOBSERVEDThe 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 continuedOBSERVEDlimit=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 baselinesOBSERVEDLoadout 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 attemptDISPROVENWith 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-003CONFIRMEDFrom 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 verificationCONFIRMEDWithout 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 verificationPARTIALDirect 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 verificationCONFIRMEDOn 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-002DISPROVENFrom 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 verificationPARTIALThe 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 verificationPARTIALOn 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 verificationCONFIRMEDThe 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-002DISPROVENFrom 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 verificationPARTIALReloaded 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 NPCCONFIRMEDAfter 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 toggleCONFIRMEDFrom 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 dialogueCONFIRMEDA 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 deselectCONFIRMEDOn 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 hardeningSTATIC_ONLYShared 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 gateDISPROVENAfter 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 verificationCONFIRMEDFrom 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 quantityCONFIRMEDWith 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 findingDISPROVENRequesting 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, world 433, location (3092,3243,0);
  • RuneLite revision 240, mapping label 2026-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 caseVerdictLive evidence
Revision-240 baselineCONFIRMEDThe 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-001CONFIRMEDBank 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 opCONFIRMEDRaw 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-001CONFIRMEDListener-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 sequenceCONFIRMEDOn 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-003CONFIRMEDAuto-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 withdrawalCONFIRMEDFrom 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 modeCONFIRMEDFrom 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 inputCONFIRMEDFrom 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-openCONFIRMEDDraynor 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 ownerCONFIRMEDPacked 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 controlsPARTIALSearch 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 controlsCONFIRMEDIncinerator, 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 descriptorsCONFIRMED/PARTIALUniverse 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 withdrawalsCONFIRMEDEarth 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 withdrawalsCONFIRMEDWith 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 quantityCONFIRMEDScreenshots 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 depositsCONFIRMEDDeposit-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 depositsCONFIRMEDStarting 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 panelDISPROVENNative 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 modesCONFIRMED/PARTIALTab 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 controlsBLOCKEDNo 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 boundaryCONFIRMEDWith 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 restorationCONFIRMEDThe 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 restorationCONFIRMEDBoth 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 / Collect booth 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 caseVerdictLive evidence
GE-001CONFIRMEDOpen 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-002CONFIRMEDThe 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-007CONFIRMEDAfter 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-004OBSERVEDIn 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-005CONFIRMEDAfter 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-006CONFIRMEDThe 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-007CONFIRMEDn3_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-008CONFIRMEDThe 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-009CONFIRMEDThe live collect-all owner was packed widget 30474246, index 0, and emitted a native CC_OP when it collected the completed purchase.
GE-010OBSERVEDThe 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-011BLOCKEDNo deliberate interface rebuild was injected between GE pipeline steps.

2026-08-10: revision 240 Port Sarim safe cohort

Live fixture:

  • account Mamieparle, world 382, 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 caseVerdictLive evidence
TAB-001 Account ManagementDISPROVENHigh-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-007CONFIRMEDPreview 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-003CONFIRMEDCorrectly 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-005CONFIRMEDQuick-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 prayerCONFIRMEDWith 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 repairCONFIRMEDAfter 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/closeDISPROVENBrian 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 repairCONFIRMEDAfter 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 IDCONFIRMEDWith 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 stockDISPROVENAt 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/enumerateCONFIRMEDPort 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 quantitiesCONFIRMEDMind 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 controlsCONFIRMEDDeposit-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 closeDISPROVENHigh-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 interfaceCONFIRMEDAfter 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.

SurfaceMicrobot reference and known datan3 result / required follow-up
TabsRs2Tab.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 widgetsWidgetInvokeHandler 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/chatboxRs2Keyboard.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.
DialogueRs2Dialogue 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-XRs2Bank.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 selectionRs2Inventory.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 boxMicrobot 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/playerMicrobot 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 itemsRs2GroundItem 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.
CombatMicrobot 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.
PrayerRs2PrayerEnum 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.
MagicRs2Magic 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.
ShopMicrobot 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/tradeMicrobot 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 hoppingMicrobot 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/transportsMicrobot 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 freshnessMicrobot 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:

  1. RuneLite version, client revision, n3 mapping label, world, account/test profile, view mode, and relevant plugin configuration.
  2. The pre-action domain state.
  3. 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.
  4. The requested semantic action and the actual one-based operation index.
  5. Native MenuOptionClicked evidence and packet-trace evidence when emitted.
  6. The operation record through a terminal state when Agent Server performs the write.
  7. The domain postcondition, such as interface visibility, selected tab, inventory/equipment delta, varbit change, dialogue transition, animation, arrival, or offer state.
  8. 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:

AxisRequired variants
View modeFixed, resizable classic, resizable modern/bottom-line
Client stateLogged in, loading transition where relevant, logged out where relevant
Headless UI suppressionOff; on for packet/native/client-thread paths that are documented as supported
Native menu resolverCold cache, warm cache after restart, stale-cache rejection on a controlled revision fixture
Widget ownershipNamed action on the matched widget, named action on an ancestor/descendant owner, listener-only actionless control
PacingReady, deliberately paced, and previous operation unresolved
Agent ServerRead-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.

IDFamilyRequired casesRequired postcondition
OP-001Mouse clickValid canvas click; invalid/unavailable canvas; click preceding raw widget op; click preceding native widget opOne mouse event per requested click; downstream action is not duplicated
OP-002Raw widget optionIF_BUTTON operations 1 through 10 against controls that expose each available slotCorrect packed ID, runtime child/index, item ID, operation number, and resulting interface/domain change
OP-003Widget option XIF_BUTTONX with a real quantity/input flowRequested amount is submitted once and the item/interface state changes
OP-004Widget sub-operationIF_SUBOP on an item/control with a live sub-op table; missing sub-op tableCorrect sub-op is selected; missing table fails with ACTIONS_NULL
OP-005Native widget operationListener-backed CC_OP, including action owned by a parent or dynamic childMenuOptionClicked records CC_OP; listener-owned postcondition occurs; no raw duplicate
OP-006Widget closeA normal close action and a close control requiring MenuAction.WIDGET_CLOSETarget interface disappears without closing an unrelated interface
OP-007Widget target on widgetIF_BUTTONT/selected widget on another widget, including item-on-item and spell-on-itemSelection is consumed and target state changes
OP-008Inventory/item actionOPHELDD/inventory operations for action slots 1 through 10 where live items expose themCorrect slot, item ID, action index, and inventory/equipment state
OP-009NPC actionOPNPC1 through OPNPC5, using named-action resolution and an explicit-index caseCorrect NPC index and expected dialogue/combat/transport state
OP-010Object actionOPLOC1 through OPLOC5, including an object with transformed compositionCorrect object ID/location and expected interface, animation, or movement state
OP-011Ground-item actionOPOBJ1 through OPOBJ5, including Take and an explicit-index caseCorrect item ID/tile and inventory or ground-item delta
OP-012Player actionOPPLAYER1 through OPPLAYER8, covering trade/follow and one higher option slot when availableCorrect player index and social/trade state
OP-013Selected widget on NPCOPNPCT using an inventory item and a spell/widget selectionSelection is consumed and NPC interaction occurs
OP-014Selected widget on objectOPLOCT using an inventory item and a spell/widget selectionSelection is consumed and object interaction occurs
OP-015Selected widget on ground itemOPOBJTSelection is consumed and ground-item interaction occurs
OP-016Selected widget on playerOPPLAYERTSelection is consumed and player interaction occurs
OP-017WalkMOVE_GAMECLICK, short reachable tile, blocked tile, plane mismatch, and Walker-issued movementDestination/progress changes; blocked or invalid targets fail closed
OP-018Dialogue continueRESUME_PAUSEBUTTON and a listener-backed visible Continue controlExactly one dialogue advance
OP-019Dialogue inputRESUME_COUNTDIALOG, RESUME_NAMEDIALOG, RESUME_STRINGDIALOG, and RESUME_OBJDIALOGSubmitted value is reflected by the next interface/domain state
OP-020HeadingSET_HEADINGMust 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

IDBehaviorCases
WD-001Semantic action resolutionExact match, normalized case/tags/spacing, multiple requested fallbacks, no match, duplicate match
WD-002Action-owner resolutionAction on matched widget, parent, child, nested dynamic child, multiple possible owners
WD-003Dispatch selectionRaw packet without onOp; native CC_OP with onOp; listener-only actionless widget
WD-004Dynamic addressingSame packed ID with multiple runtime indexes; omitted index; stale index after interface rebuild
WD-005Item-backed widgetsCorrect item ID and quantity; empty slot; noted/variant item; widget rebuilt after state change
WD-006Pacing and orderingPacer check, mouse click, widget/native action, trace record; failure at each boundary
WD-007Explicit raw op escape hatchValid op, op zero, out-of-range op, hidden widget, null widget
WD-008Selected widget stateSelect, 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.

IDCasesPostcondition
TAB-001Every tab in fixed modeThe intended tab content becomes visible and TabActions.isOpen agrees
TAB-002Every tab in resizable classicSame
TAB-003Every tab in resizable modern/bottom-lineSame
TAB-004Already-open tabReturns confirmed without a duplicate transition
TAB-005Parent/child action ownershipNative action is sent to the unique live owner
TAB-006Unavailable tabFails closed without clicking the adjacent stone
TAB-007Logout tab variantsCorrect logout/world-switcher control is selected in each layout

D. Inventory and equipment

IDCases
INV-001Inventory container and all 28 dynamic slot indexes in every view mode
INV-002Named item action resolution for Use, Eat, Drink, Wear, Wield, Equip, Drop, Destroy, and representative custom actions
INV-003Duplicate item stacks, noted items, charged/degraded variants, and exact item-ID selection
INV-004Drop ordering: row-major, reverse row-major, column-major, reverse column-major
INV-005Drag/move from every row and column boundary, including empty destination and occupied destination
INV-006Item-on-item, item-on-NPC, item-on-object, item-on-ground-item, item-on-player, and widget-on-widget
INV-007Selected spell on inventory item and selection cleanup
EQP-001Read every equipment slot and backing widget
EQP-002Equip via each live inventory action label used by supported items
EQP-003Unequip every occupied slot through Remove
EQP-004Equipment-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.

IDCasesPostcondition
BANK-001Open nearest object and NPC variants; already open; unreachable target; ambiguous targetBank universe is visible
BANK-002Close through the live close owner and WIDGET_CLOSE pathBank universe is hidden
BANK-003Every BankWidget clickable control: close, deposit inventory, deposit worn, worn-items panel, settings, group storage, tutorial, incineratorIntended sub-interface or item delta
BANK-004Read-only BankWidget descriptors: universe, item grid, bank-side inventory, search background, tab container, scrollbar, equipment containerDescriptor resolves but action is rejected
BANK-005Bank item grid indexes across tabs, scrolling, search, placeholders, and duplicate item variantsCorrect item widget is selected
BANK-006Withdraw 1, 5, 10, X, All; item and noted modesExact inventory/bank quantity delta
BANK-007Withdraw-X followed by count-dialog resumeRequested amount varbit and inventory delta agree
BANK-008Ensure withdraw item/noted mode when already selected and when switchingMode state changes once
BANK-009Ensure default and custom withdraw quantitySelected quantity state agrees
BANK-010Deposit inventory and deposit worn controlsInventory/equipment empties as expected
BANK-011Bank-side inventory item actions Deposit-1, 5, 10, X, AllExact inventory/bank delta
BANK-012Worn-items panel read model and deposit-all-worn actionBacking widgets resolve; equipment delta is observed
BANK-013Tab selection, search open/close, scrollbar, settings panel, placeholders, rearrange modeRead APIs match visible state
BANK-014Bank PIN presenceAutomation 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.

IDCases
BOX-001Open-state detection and item-container enumeration
BOX-002Deposit inventory
BOX-003Deposit equipment
BOX-004Deposit item quantities 1, 5, 10, and All
BOX-005Close
BOX-006Missing/hidden child and interface rebuild

G. Dialogue, chatbox input, and blocking screens

IDCases
DLG-001NPC dialogue group 231, name child 4, text child 6
DLG-002Player dialogue group 217, text child 6
DLG-003Options group 219, dynamic options under child 1; first, middle, and last option
DLG-004Option selection by index, exact/normalized text, predicate, and Quest Helper marker
DLG-005Continue by visible named action and resume-pause packet fallback
DLG-006Amount, object ID, free text, and name entry
DLG-007Stale option list after one selection; no repeated submit on unchanged state
DLG-008Welcome-screen Play control and confirmed transition to logged-in state
DLG-009Death dialogue continue and gravestone/reclaim follow-up
DLG-010Fixed/resizable mode recognition and mode switch controls
DLG-011Chatbox 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.

IDCases
PROD-001Enumerate every visible product with packed ID, runtime index, item ID, text/name, and action owner
PROD-002Choose first, middle, and last product by index
PROD-003Choose by exact and normalized item name; ambiguous and absent names
PROD-004Smithing product children, including dagger and products at both ends of the live child range
PROD-005Quantities ONE, FIVE, TEN, ALL, and X
PROD-006Custom amount after selecting X
PROD-007Selected-product heuristic compared with the visible highlight and actual produced item
PROD-008Selected-quantity heuristic compared with the visible highlight and produced count
PROD-009Interface 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

IDCases
GE-001Open nearest booth/clerk and already-open detection
GE-002Close using the unique visible Close owner; dynamic index retained in evidence
GE-003All eight slots: empty, buy, sell, completed, cancelled, and partially filled reads
GE-004Buy child and sell child for every slot
GE-005Select an item from search, set quantity, set price, confirm offer
GE-006Select a sell item from GE inventory, including duplicate/variant item handling
GE-007Cancel each slot and confirm terminal slot state
GE-008Collect to inventory and collect to bank where available
GE-009Collect-all visible-owner resolution
GE-010Back navigation, input dialogs, insufficient coins/items, full inventory, and offer limit
GE-011Interface 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

IDCases
SHOP-001Shop open/closed detection and stock enumeration
SHOP-002Buy 1, 5, 10, and 50 by ID and exact name
SHOP-003Stock zero, insufficient coins, full inventory, duplicate/variant item
SHOP-004Player inventory inside shop: Sell 1, 5, 10, 50, and custom live actions
TRADE-001First-screen open detection, partner-name title, own/their item containers
TRADE-002Offer 1, 5, 10, X, and All; amount input and exact item delta
TRADE-003First-screen accept and decline
TRADE-004Second-screen partner/items validation
TRADE-005Second-screen accept and decline
TRADE-006Acceptance-state text, changed-offer reset, partner departure, and interface closure
TRADE-007Mule 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

IDCases
PRAY-001Every RuneLite Prayer widget: visibility, required level, enable, disable, and active varbit
PRAY-002setOnly transition among melee, ranged, magic, overhead, and utility prayer groups
PRAY-003Disable all
PRAY-004Quick-prayer orb enable/disable and varbit agreement
PRAY-005Open quick-prayer setup through the live Setup/Quick-prayers owner
PRAY-006Every quick-prayer child index and bit-mask mapping
PRAY-007Insufficient prayer points, unavailable level, conflicting prayers, interface closed
COMBAT-001Special-attack control and energy/enabled varbits
COMBAT-002Every AttackStyle supported by each live weapon-style layout
COMBAT-003Auto-retaliate control and varbit
COMBAT-004Weapon swap rebuilding the combat interface
COMBAT-005Poison, 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.

IDCases
MAGIC-001Every standard spell constant in standard spellbook
MAGIC-002Every Ancient Magicks spell constant in ancient spellbook
MAGIC-003Every Lunar spell constant in lunar spellbook
MAGIC-004Every Arceuus spell constant in Arceuus spellbook
MAGIC-005All home-teleport variants, including constants that share a back-button component
MAGIC-006Untargeted cast and observed effect/cooldown
MAGIC-007Spell on inventory item
MAGIC-008Spell on NPC
MAGIC-009Spell on player
MAGIC-010Spell on game object
MAGIC-011Spell on ground item
MAGIC-012Select and deselect; stale selection after tab/interface change
MAGIC-013Autocast and defensive autocast for supported combat spells
MAGIC-014Insufficient level/runes, filtered spellbook, hidden spell, cooldown, teleblock
MAGIC-015High 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.

IDCases
MINI-001Open through each production-supported entry path
MINI-002Destination dropdown open/closed state
MINI-003Every destination row: text match, packed ID, runtime index, action owner, Select dispatch
MINI-004Castle Wars special runtime index and comparison with the generic child mapping
MINI-005Selected-destination heuristic against the collapsed selector
MINI-006Final Teleport owner and dispatch
MINI-007Arrival at every destination
MINI-008Cooldown, teleblock, unavailable activity, hidden row, duplicate semantic owner
MINI-009Last-use varplayer and cooldown read-state agreement

N. Movement interfaces and Walker transports

Destination enums are matrices, not representative samples:

FamilyCurrent destination countRequired coverage
Fairy rings44Every code: three dial varbits, clockwise/anticlockwise controls, confirm, arrival
Gnome gliders7Every destination row and arrival
Spirit trees11Every destination row/dialogue option and arrival
Charter ships9Every port row/dialogue option, coin/item cost, and arrival
Magic carpets7Every stop, dialogue/payment, and arrival
Minecarts3Every station and arrival
Bird flights5Every destination and arrival
CanoesAll supported stations/typesBuild interface, canoe type, destination map, animation, arrival

Also test:

IDCases
MOVE-001Curated transport called directly through its action class
MOVE-002The same transport selected and executed by Walker
MOVE-003Every imported complex transport row in the pinned Shortest Path resource
MOVE-004Every generic NPC transport action index and named action
MOVE-005Every generic object transport action index and named action
MOVE-006Agility/grapple shortcut object action and completion
MOVE-007Item teleport: inventory action, animation, consumption/charge delta, arrival
MOVE-008Spell teleport: spellbook, rune/level checks, animation, arrival
MOVE-009Home teleport: spellbook-specific widget, cooldown, animation, arrival
MOVE-010POH and jewellery dialogue/widget chains used by imported routes
MOVE-011Source action accepted but destination not reached; timeout must not be success
MOVE-012Ambiguous NPC/object match; neither match; unreachable target; unexpected plane
MOVE-013World Map Set Target preview, Start Path, and Walk Assistant panel destination
MOVE-014Shared 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.

IDControls and transitions
TUT-001Historical name root 558:1; current name input/text/status/look-up/set-name children
TUT-002Familiarity Experienced player control
TUT-003Historical appearance root 679:4; body A/B; all 12 left controls; all 12 right controls; confirm
TUT-004NPC/player/options dialogue and continue handling at every instructor
TUT-005Inventory/equipment side panel during equipment instruction; bronze dagger Equip owner
TUT-006Smithing root and dagger product child
TUT-007Account-management tab and poll message
TUT-008Bank-space modal container, visible sentinel, and close child
TUT-009Settings tab, all-settings owner, search focus, searched setting toggle, close; missing optional setting fails open
TUT-010Every object/NPC action used by the tutorial and its transition varp postcondition
TUT-011Restart recovery at every controller stage and stale pending-action cleanup
TUT-012Manual one-action stepping, one-stage stepping, and resume

Break Handler and logout

IDCases
BREAK-001Bank PIN detection prevents unsafe interaction
BREAK-002Logout tab/control in fixed, resizable classic, and resizable modern layouts
BREAK-003World-switcher logout variants and duplicate visible candidates
BREAK-004Native CC_OP logout trace and confirmed LOGIN_SCREEN postcondition
BREAK-005Planned break, active break, reconnect/profile login, and state reset

Other plugin-specific widgets

IDOwnerCases
PLUG-001Inventory SetupsBank item grid/title/scrollbar, bank load events, chatbox item search layers, World Map search coexistence, injected RuneLite menu entries
PLUG-002Bank StanderInventory vs bank menu-entry ownership, Make-X option capture, RuneLite menu injection, full bank-production loop
PLUG-003MuleTrade partner titles on both screens, offer/accept/decline, changed-offer reset
PLUG-004FighterGravestone generic interface, unique Reclaim owner, inventory/equipment postcondition
PLUG-005Guardians of the RiftHUD parent, portal position, energy title/value, first-portal timing, barrier/altar transitions
PLUG-006Dialogue HelperSpacebar continue and Quest Helper marked-option parsing without duplicate selection
PLUG-007Walk AssistantDedicated sidebar, bank/city selection, hotkeys, cancel, path replacement
PLUG-008Shortest Path UIWorld Map overlays, fairy-ring log/favourites/scrollbar, menu layers, minimap variants
PLUG-009Looting bagItems container, open, deposit by item/quantity, count and visibility reads
PLUG-010Welcome/death flowWelcome Play, death dialogue, reclaim interface, return to normal state
PLUG-011GE FlipperFlipping 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

IDRead surfaceRequired comparison
READ-001Production selected productVisible highlight, backing widget, and produced item
READ-002Production selected quantityVisible highlight and actual produced amount
READ-003Minigame selected destinationCollapsed selector, selected row, and actual teleport
READ-004Bank withdraw/requested quantity/placeholder/rearrange modeVisible controls and subsequent withdrawal
READ-005Camera zoom and viewport projectionClient rendering at several zooms, pitches, yaws, resizes, and planes
READ-006Combat/prayer/magic selected stateVisible control plus corresponding varbit/varplayer
READ-007GE/shop/trade stateVisible slot/item/text state plus domain action result
READ-008Guardians of the Rift HUDVisible HUD values plus relevant varbits/events
READ-009World Map stateVisible map bounds, surface, overview, and selected destination
READ-010Dialogue option indexesVisible order, stripped text, color/Quest Helper marker

Q. Utility, world switching, and sailing

IDCases
UTIL-001Run orb in every view mode; disabled-to-enabled and enabled-to-disabled transitions
UTIL-002toggleRun(boolean) with requested state already satisfied and not satisfied; verify it does not invert an already-correct state
UTIL-003Bulk drop with zero, one, and several matching inventory items; pacing must prevent an unbounded same-tick burst
UTIL-004Accept Aid request remains explicitly unsupported and causes no state change until safely wired
UTIL-005Utility logout control and confirmed login-screen postcondition
WORLD-001Open in-game world hopper in every view mode
WORLD-002Load world list and compare every exposed world property with the visible list
WORLD-003Hop to normal, members, skill-total, PvP/high-risk, and unavailable/full worlds using controlled fixtures
WORLD-004Confirmation/warning dialogue during hop; loading transition; final world ID
WORLD-005Lobby world list open/close and lobby hop where the current login mode supports it
WORLD-006Stale world list, same-world request, restricted world, and failed hop recovery
SAIL-001Every SailingInteraction.Direction request and observed direction
SAIL-002Increase and decrease speed through all supported speed states
SAIL-003Set and unset sails, with movement/navigating state comparison
SAIL-004Pacing, non-sailing context, missing control/mapping, and repeated request
SAIL-005SET_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:

IDSurfaceCases
PASS-001NPC/object/player/ground-item queriesScene add/remove, transformed object, duplicate name/ID, plane and reachability
PASS-002Graphics objectsSpawn, movement/lifetime, ID filtering, removal
PASS-003ProjectilesSpawn, source/target, remaining cycles, ID filtering, removal
PASS-004Collision/reachabilityDoors, walls, diagonal movement, instanced regions, plane changes, visited-tile bounds
PASS-005Skills/quest/progressBase/boosted/drained levels, XP transition, quest state transition, absent diary mapping
PASS-006Rune pouch and spell requirementsOrdinary/divine pouch, rune slots/quantities, combination runes, inventory+pouch totals
PASS-007Navigation stateGoal, path, progress, stall, reached distance, cancellation, foreign active path
PASS-008Recent events and varbit changesEvent 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

  1. Certify OP-* and WD-* shared dispatch contracts on the active revision.
  2. Certify tabs, inventory/equipment, dialogue, and blocking screens.
  3. Certify bank and deposit-box controls.
  4. Certify production, prayer/combat, and magic cohorts.
  5. Certify GE, shop, and trade using isolated fixtures.
  6. Certify minigames and every transport destination/row.
  7. Run plugin-owned end-to-end workflows.
  8. 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 CONFIRMED action includes dispatch evidence and an observed postcondition;
  • every DISPROVEN case links to the owning production call site and a repair issue/change;
  • no result treats DISPATCHED as 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 ownerCatalogue coverage
WidgetActionsOP-002 through OP-007, WD-*
InventoryActions, InventoryDropActionsINV-*, UTIL-003
EquipmentActionsEQP-*
UseItemActionsOP-007, OP-013 through OP-016, INV-006
NPCActionsOP-009, PASS-001
ObjectActionsOP-010, PASS-001
TileItemActionsOP-011, PASS-001
PlayerActionsOP-012, PASS-001
BankActions, BankInventoryActions, BankWornEquipmentActionsBANK-*
DepositBoxActionsBOX-*
DialogActionsDLG-*, OP-018, OP-019
BlockingEventActionsDLG-008 through DLG-010
GrandExchangeActionsGE-*
ShopActionsSHOP-*
TradeActionsTRADE-*
PrayerActionsPRAY-*
CombatActionsCOMBAT-*
MagicActionsMAGIC-*
TabActionsTAB-*
ProductionActionsPROD-*
MinigameTeleportActionsMINI-*
FairyRingActions, GnomeGliderActions, SpiritTreeActions, CharterShipActions, TransportActionsMOVE-* and the destination matrix
NavigationActionsOP-017, MOVE-013, MOVE-014, PASS-007
LootingBagActionsPLUG-009
UtilityEventActionsUTIL-*
WorldActionsWORLD-*
SailingActionsSAIL-*, OP-020
GraphicsObjectActions, ProjectileActions, ReachabilityActionsPASS-002 through PASS-004
RuneLiteTutorialIslandRuntime, TutorialWidgetTUT-*
BreakHandlerPluginBREAK-*
Inventory Setups, Bank Stander, Bank Stander Plus, Mule, Fighter, Guardians of the Rift, Dialogue Helper, Walk Assistant, Shortest Path, GE FlipperPLUG-*

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)

SurfaceStatusSuperseding evidence requirement
Inventory, Equipment, Prayer, Magic, Combat, and Magic-minigame requested actionsSTATIC-VERIFIED / LIVE-PENDINGShared 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.