Skip to content

So i dont fuck the walker kek#8

Closed
infuse21 wants to merge 51 commits into
mainfrom
So-I-dont-Fuck-The-Walker-KEK
Closed

So i dont fuck the walker kek#8
infuse21 wants to merge 51 commits into
mainfrom
So-I-dont-Fuck-The-Walker-KEK

Conversation

@infuse21

Copy link
Copy Markdown
Owner

No description provided.

infuse21 and others added 30 commits July 18, 2026 12:39
- Defers off-path recalculation while the player is still moving, animating, interacting, settling after doors/transports, or making recent route/interim progress.
- Reworks route minimap clicks and unreachable-tile recovery to stay anchored to the planned raw path, use Euclidean minimap reach, and avoid backtracking to earlier nearby path branches.
- Adds sticky interim checkpoint tracking so recovery/continuation clicks are not spammed while valid movement is already in flight.
- Tightens door handling by deferring door probes while moving and only blacklisting wrong-traversal doors when the player started near the attempted door edge.
- Improves charter ship destination widget lookup/clicking and optional confirmation handling.
cold start - hopefuly fixed
Mid-route Stalling rs2 walker now accepts adjacent same-plane transport/objct landing
- Adds a per-loop `WalkLoopSnapshot` so route progress decisions reuse a stable player location and reachable-tile snapshot during each walker loop.
- Reworks closest-path-index and route-progress tracking to prefer reachable distance when available, fall back safely when reachability is empty, and preserve forward progress on routes that double back near earlier branches.
- Keeps primary minimap clicks, direct short-walk fallback, and unreachable recovery anchored to the raw shortest-path route before using smoothed waypoint nudges or generic fallbacks.
- Adds raw-route target selection helpers with candidate predicates so recovery and continuation clicks stay on known walkable/unloaded route tiles.
- Defers off-path recalculation while movement, interaction, animation, door/transport settling, recent clicks, route progress, or interim checkpoint progress indicate the player is still advancing.
- Adds sticky interim checkpoint tracking and early `interim-in-flight` yields before broad scans, current-tile transport checks, direct short-walk attempts, and path segment scans.
- Hints route progress after clicked-ahead checkpoints so later route anchoring does not snap back to nearby already-travelled branches.
- Improves startup behavior by skipping speculative timeout-backed obstacle scans before the first movement click, while still allowing immediate planned transport steps to dispatch.
- Suppresses active route idle nudges and stall recovery clicks when the current route segment is an explicit transport edge.
- Tightens door/gate handling so wrong-traversal blacklisting only happens when the player started near the attempted door edge.
- Accepts adjacent same-plane transport/object landings when the player settles near the expected destination instead of requiring the exact destination tile.
- Improves charter ship handling by recursively resolving destination widgets, invoking the clickable widget/action, and confirming travel prompts when needed.
- Updates `ShortestPathPlugin` route cleanup, pathfinder inventory quantity checks, WebWalk logging volume, movement docs, unit coverage, and the client-thread guardrail baseline.

•
Rs2Walker.java: immediate planned transports now suppress idle/stall recovery, so first-step teleports like Home Teleport should fire before pointless movement clicks.
•
Rs2Walker.java: active interim route clicks now yield before broad scans, reducing stop-start spam.
•
Rs2Walker.java: normal route clicks prefer raw shortest-path tiles instead of side/fallback tiles.
•
Rs2Walker.java: public walker entrypoints now reject client-thread calls before lock waits or player/tile reads.
•
Rs2WalkerUnitTest.java: added focused tests for route anchoring, raw-route click selection, interim yielding, and immediate-transport idle nudge suppression.
•
movement.md: documented the new walker gotchas

Implemented the Al Kharid toll gate fix.
What changed:
•
Added Pay-toll(10gp) transports for all four gate tiles in transports.tsv.
•
Added quest-free Open gate transports for Prince Ali Rescue completion.
•
Replaced the old quest-only tile restriction with blocked edge rules, so non-quest accounts can route through if they have 10 coins.
•
Walker now treats paid TRANSPORT rows as currency transports for item/banking checks.
•
Added special handling for Al Kharid toll gate confirmation: it uses Pay-toll(10gp) and clicks Yes, okay / Yes if prompted.

I did not add the “talk to guard” fallback yet; this handles the cleaner object interaction path first.
…48b9742c1eaa667b18052785eb6ed058 (4.16.1) and marked the sync as successful in .quest-helper-sync.

Kept the Microbot-specific integration intact: hidden always-on plugin wiring, QuestScript, config toggles, custom quest logic, resource path fixes, and the agent start hook. I also restored compatibility accessors needed by the automation runner and preserved precise farming patch coordinates where they matched older local data.
removed toll-gate helper pattern to avoid guardrail violation
Verified against the live tree on So-I-dont-Fuck-The-Walker-KEK:
- #3 (POH TSV) reclassified OPEN -> NEEDS-VERIFY: teleportation_poh.tsv
  is absent by design; POH is routed programmatically via util/poh/,
  not a TSV. teleportation_portals.tsv (101 rows) is a different
  TELEPORTATION_PORTAL type (Castle Wars/god-wars), not POH.
- chsami#27 (mushtrees) corrected 8 -> 12 of 16 pairs.
- Confirmed boat world-view DONE (WorldPointUtil.fromLocalInstance),
  closing UPSTREAM_COMPARISON.md #6; PrimitiveIntList (chsami#11) still OPEN.
- Added 2026-07-20 reconciliation note and a Facade migration section
  documenting the frozen 23-member ShortestPathPlugin coupling contract
  and the staged decouple-before-backport plan.

Docs only; no walker/engine code changed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Read-only sweep of all 26 consumer files outside the shortestpath
package. Documents the complete member surface Rs2PathApi must
reproduce:
- Pathfinder external surface: getPath, isDone (only 2).
- PathfinderConfig: refresh, setUseBankItems, isUseBankItems,
  getTransports, getAllTransports, setIgnoreTeleportAndItems,
  isTransportUsableWithLeaguesContext, isUseSpiritTrees.
- Transport: 15 getters/setters (getDestination/getDisplayInfo/getType
  dominate); TransportType: all 20 constants + isTeleport + valueOf.
- WorldPointUtil: packWorldPoint/unpackWorldPoint/undergroundAwareDistance.
- CollisionMap: only the static ignoreCollisionPacked field (Rs2Tile).

Key finding: the facade only needs to wrap mutable plugin state
(Pathfinder/PathfinderConfig/marker/future/mutex); Transport,
TransportType and WorldPointUtil are pure data / pure functions and
can stay as-is behind it.

Docs only; no walker/engine code changed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Introduce a Microbot-owned facade (util/walker/Rs2PathApi) that
delegates 1:1 to ShortestPathPlugin's mutable static surface catalogued
in Stage 1: pathfinder lifecycle (get/set pathfinder, future, executor,
mutex), config (getPathfinderConfig, setReachedDistance, override x3),
target/walker state (exit, start-point flag, lastLocation), marker
get/set, and getTransports; plus the CONFIG_GROUP and MARKER_IMAGE
constants.

Thin delegation only: no behaviour change, no state of its own. Value
types (Pathfinder, PathfinderConfig, Transport) are intentionally not
re-wrapped - they are the stable Microbot-facing path API. No consumers
migrated yet (that is Stage 3, walker last); ShortestPathPlugin members
stay public and binary-compatible until then.

Compiles clean (:client:compileJava). Walker untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Route the low-risk, single-package consumers through the facade instead
of ShortestPathPlugin directly:
- Script.exit path -> Rs2PathApi.exit
- questhelper/QuestScript -> Rs2PathApi.getMarker/exit/getPathfinder
- util/bank/Rs2Bank, util/depositbox/Rs2DepositBox,
  util/npc/Rs2NpcManager, util/skills/slayer/Rs2Slayer ->
  Rs2PathApi.getPathfinderConfig
- util/leaguetransport/Rs2LeaguesTransport: field access
  ShortestPathPlugin.pathfinderConfig -> Rs2PathApi.getPathfinderConfig()

Import-only swap where all refs were method calls; value-type imports
(Pathfinder, Transport, TransportType, PathfinderConfig) kept as-is.
MicrobotPluginChoice keeps ShortestPathPlugin.class (config registration,
not state). No residual ShortestPathPlugin refs in migrated files.
Rs2Walker deferred to last.

Compiles clean (:client:compileJava, exit 0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Route the walker subpackage helpers through the facade:
- lifecycle/Rs2WalkerLifecycleRuntime (26 refs): marker, pathfinder,
  future, executor, config, start-point, lastLocation, MARKER_IMAGE
- banking/Rs2WalkerBankingPlanner (13 refs): getPathfinderConfig, override

MARKER_IMAGE resolves to the facade's re-exported constant. Value-type
imports (Pathfinder, Transport, TransportType) kept. awaits/ and shared/
subpackages import only value types (Pathfinder/WorldPointUtil) and need
no migration. No residual ShortestPathPlugin refs; Rs2Walker.java (77
refs) remains for the final Stage 3c pass.

Compiles clean (:client:compileJava, exit 0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Route the walker itself (77 refs) through the facade. Rs2PathApi is in
the same package so no import is needed; the shortestpath.* wildcard
import stays for value types (Transport/TransportType/WorldPointUtil/etc).

- 5x ShortestPathPlugin.pathfinderConfig field reads -> getPathfinderConfig()
- all method calls -> Rs2PathApi.*
- method reference ShortestPathPlugin::getPathfinder -> Rs2PathApi::getPathfinder
- javadoc {@link ShortestPathPlugin#...} -> {@link Rs2PathApi#...}

No field assignments existed, so no missing-setter issues. Zero residual
ShortestPathPlugin refs in Rs2Walker. All consumers now go through the
facade; ShortestPathPlugin's public static surface is fully wrapped.

Verified: :client:compileJava exit 0; shortestpath unit+regression suite
green (73 tests: ShortestPathCoreTest 43, ShortestPathTier1RegressionTest
18, PathSmootherTest 6, TransportTypeTest 4, benchmark/refresh 1+1;
0 failures, 0 errors).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Record the staged-plan status: Stages 1 (catalogue), 2 (Rs2PathApi),
and 3a/3b/3c (consumer migration incl. Rs2Walker) done with commit
refs; Stage 4 (backport behind facade) is now the next step. Note that
100% of plugin-state access routes through Rs2PathApi and only plugin
identity refs (.class / getSimpleName) remain.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Live-code verification against the KEK branch found most flagged
"backport" items already implemented since the 2026-04-18 audit:
- #2 wilderness boundaries DONE (PathfinderConfig.java:41-46 match the
  upstream values; isInLevel20/30Wilderness wired; Chebyshev landed)
- #8 bidirectional BFS DONE (meet-in-the-middle, BIDIRECTIONAL_MIN_CHEBYSHEV)
- chsami#31 currency-aware transport filter DONE (PathfinderConfig.java:879-892)
- chsami#33/chsami#34 transport-index perf DONE (buildPathFirstIndex map)
- chsami#11 stale premise: Node already packed-int, not List<Integer>; the only
  List<WorldPoint> left is the getPath() facade boundary (not a
  behind-the-facade change)

Genuinely-open internal items remain: chsami#10 (reachability prune), chsami#12
(SplitFlagMap LRU eviction), chsami#30 (one-way flag), #3 (POH coverage) -
correctness/data-sensitive, want real upstream source. No upstream
remote is configured yet (still pinned to 07fca57).

Docs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Added the skretzo remote and fetched Skretzo/shortest-path. Upstream
HEAD is 122 commits + a major refactor past the pinned 07fca57
(transport/ + transport/parser packages, Destination/ItemVariations/
JewelleryBoxTier model, NodeGraph/IntDeque/IntMinHeap/PrimitiveIntList
pathfinder internals, standalone WildernessChecker, leagues/, PendingTask).

Re-checked the open items against real current source:
- #2 wilderness: byte-identical to upstream WildernessChecker -> DONE
- #3 POH: real gap - upstream ships teleportation_portals_poh.tsv
  (137 rows); Microbot routes POH programmatically. Next target:
  diff that TSV against util/poh coverage and backfill.
- chsami#10/chsami#12: no upstream counterpart (Microbot-original perf ideas)
- chsami#30 one-way: not confirmed upstream; deprioritized

Documented in UPSTREAM_COMPARISON.md "Re-baseline 2026-07-20" and
updated the facade-migration staged plan (step 5 done). The divergence
now only supports selective feature/data backports, which the facade
makes safe. Docs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffed Microbot's programmatic POH model against upstream's
teleportation_portals_poh.tsv (137 rows / 50 dests) and the game's 42
ObjectID.POH_PORTAL_MAG_* portal-chamber destinations. PohPortal covered
28; added the 12 missing ones: Barbarian Outpost, Fishing Guild, Port
Khazard, Marim, Civitas illa Fortis, Ourania, Cemetery, Dareeyak,
Trollheim, Lassar, Ice Plateau, Paddewwa (PohPortal 28 -> 40).

Each uses the authoritative arrival tile from the upstream data set and
the MAG/MARBLE/TEAK object-id families (compiler-verified to exist;
League variants omitted). They flow into the transport graph
automatically: PohPortal.findPortalsInPoh() (BY_OBJECT_ID built from
values()) -> PohPanel.portalPanel -> new PohTransport(...), so the walker
now detects and routes through these portals when built in a POH.

Verified: :client:compileJava clean; no duplicate enum constants;
shortestpath regression suite green. Tracker #3 marked DONE in
WEBWALKER_IMPROVEMENT_PLAN.md and UPSTREAM_COMPARISON.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Recorded in UPSTREAM_COMPARISON.md the file-level and content-level diff
of transport data against current upstream:
- File-level: the 4 upstream-only TSVs are handled (POH portals/boxes
  programmatically, quetzal whistle inline, home teleports partial);
  Microbot adds blocked_edges/dangerous_tiles/npcs/restrictions.
- transports.tsv content: present in both (4949 vs 5168 rows). By
  origin->dest identity, 778 upstream-only pairs vs 553 Microbot-only.
  Only 14 named; 764 anonymous route objects (mostly Climb/Ladder/
  Stairs). 713 of 737 upstream-only origins are brand-new tiles -> a
  real coverage gap, not coordinate drift.
- Flagged bulk import as risky (action-column schema mismatch +
  collision-map coverage), recommended scoped per-region sync starting
  with the 14 named routes.

Docs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace bundled collision-map.zip with the current upstream build:
2724 regions (was 2663; +61 new regions covering Varlamore/Kebos and
other recent content). Format verified compatible before swap: identical
x_y region-entry naming, identical packPosition, and identical per-tile
bit layout (FLAG_COUNT=2, same z/y/x index arithmetic) - upstream only
refactored BitSet -> long[] internally, the on-disk byte encoding is
unchanged, so Microbot's BitSet-based FlagMap decodes it correctly.

Validated: shortestpath suite green (73 tests, incl. ShortestPathCoreTest
43 + Tier1 regression 18 doing real cross-region pathfinding; 0 fail).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Import the origin->dest routes present in upstream transports.tsv but
absent locally (mostly stairs/ladders/climbs in new areas: Varlamore,
Kebos, plus building multi-floor transitions). transports.tsv 4949 ->
5717 data rows.

Conversion (scripted, validated):
- action column space-form "Open Door 9398" -> ";"-form "Open;Door;9398"
  (menuOption;menuTarget;objectId); all 768 match Microbot's parser regex.
- inserted empty Currency/isMembers columns to match the 12-col schema.
- Items: upstream named variations + '|' OR-sets translated to Microbot
  numeric id-sets (AXE/MACHETE/PICKAXE/ROPE expanded via ItemVariations
  -> ItemID values; '|' -> space OR-group; '=qty' stripped); COINS=N
  moved to the Currency column as "N Coins".
- Skills/Quests/Varbits/VarPlayers pass through (formats verified identical).
- fixed upstream data typo "Shadows of the Storm" -> "Shadow of the Storm"
  to match RuneLite's Quest enum (otherwise the quest gate silently drops).

Excluded:
- 15 upstream rows with id-less actions (bare "Climb-up Staircase",
  name-only walls/gates, 1 empty action) - unmatchable in Microbot's
  id-based format.
- 2 Garden of Tranquillity trellis rows (obj 2149, Varrock Palace) that
  Microbot intentionally omits - caught by
  testVarrockSewerPathAvoidsDisabledPalaceTrellisShortcut.

Validated: shortestpath suite green (73 tests, 0 fail) incl. real
cross-region pathfinding after the import; paired with the updated
collision map so the new-area routes have collision coverage.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Update UPSTREAM_COMPARISON.md re-baseline: 768/778 routes imported,
collision map refreshed (2663->2724 regions), exclusions and the
isMembers caveat recorded.

Docs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The legacy 2026-04-06 tables were misleading (showed many features as
missing that are now present). Verified each against the live tree:
- "Critical Bug Fixes Missing Locally" #1-6: all fixed - banner added.
- Transport System table: corrected Local column. Actually present now:
  hot air balloons, magic mushtrees, seasonal transports, teleportation
  boxes (POH mounted), POH portals, Pendant of Ates, Kharedst's Memoir/
  Book of the Dead, Great Conch (CJQ). Genuinely still missing (6):
  Cowbell Amulet, Sailors' Amulet, Laguna Aurorae spirit tree, bank-visit
  teleport discovery, per-transport-type cost tuning, currency-threshold
  cost avoidance (currency requirement filtering IS present).
- POH section: granular PohPanel sub-panels present - obsolete-toggle
  description annotated.

Docs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add the three transport data items that were genuinely missing vs
upstream (7e7e5bf94b), sourced from upstream's data files:
- Cowbell amulet (item 33104) -> teleportation_items.tsv (1 dest)
- Sailors' amulet charged (item 32399) -> teleportation_items.tsv
  (3 dests: The Pandemonium, Port Roberts, Deepfin Point)
- Laguna Aurorae spirit-tree destination -> spirit_trees.tsv, gated on
  the Pandemonium quest (resolves against RuneLite Quest.PANDEMONIUM)

Converted to Microbot's column schemas (item '=qty' stripped; members
Varlamore items marked isMembers=Y, Consumable=T, wildy 20 as upstream).

Validated: shortestpath suite green (73 tests, 0 fail; both files parse).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Docs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ecovery

The walker deviated wide, entered buildings, and backtracked near Varrock West
Bank. Root cause was in click-target selection, not pathfinding or collision data
(verified offline: the raw route is optimal and reaches the goal from every
approach).

Two defects compounded:

1. The anchored forward scan shared by every click predicate could start past the
   player's vicinity, breaking immediately on the Euclidean bound and returning
   null for ALL predicates (observed live as sel=none). Selection then fell
   through to a smoothed-waypoint Euclidean clamp, producing off-route clicks
   such as (3176,3428).

2. That clamp picks a target with no straight walkable line to it. A minimap
   click is resolved by the game's own pathing, so a no-line-of-sight target lets
   the game improvise a detour: cutting corners through open doors, looping
   around buildings, and trapping itself so it has to backtrack out.

Changes:

- Select route clicks by line-of-sight first: the furthest forward raw-path point
  the player can reach in a straight walkable line (CollisionMap.canStep line
  trace, mirroring PathSmoother.lineOfSight). Tiers: los > reach > walkable >
  offscene.
- Retry selection anchored at the player's own closest raw tile when the anchored
  scan yields nothing, so a stale smoothed->raw anchor can no longer drop clicks
  onto the off-route clamp.
- Guarantee selection never returns null while a raw route exists, so a click can
  no longer leave the planned route.
- Consolidate every click path (main loop, idle-nudge/stall recovery, interim
  continuation, outside-clip route fallback) onto the same selector. Previously
  each had its own policy, so behaviour depended on which path happened to fire.
- Gate the directional scaled-radius fallback and the wall-distance nudge on
  reachability; the nudge now prefers the neighbour reachable from and nearest to
  the player instead of an arbitrary tile from an unordered set.
- Add bidirectional rejoin for off-path recovery, preferring forward points so
  normal progress is never sacrificed.
- Tag click_candidate_found with the selection tier (sel=/fb=) for diagnosis.

Also fixes two startup/pacing issues found while investigating:

- The 2000ms wait for a non-null pathfinder expired mid PathfinderConfig.refresh()
  (measured 2.4-2.7s on a cache miss), sending the walker into recalculatePath()
  which cancelled the in-flight work and started a second refresh. Raised to 6s so
  recalculation stays a genuine failure path, and log slow refreshes at INFO.
- Shortened the active-route idle-nudge window to a few ticks. Route continuation
  is one-shot, so when it is missed that window is the visible dead stop per hop.

Measured on the reported route: the 41-tile leg now resolves to four straight
clicks (3182,3432 -> 3172,3425 -> 3172,3399 -> 3173,3399), confirmed live as
sel=los@player.

Tests: Rs2WalkerUnitTest 96, LineOfSightClickRegressionTest 3 (new),
ClientThreadGuardrailTest 1. Guardrail baseline regenerated (mostly lambda-index
churn plus the changed getPointWithWallDistance signature).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A post-transport raw scene scan was measured at 5640ms returning handled=false
(Lumbridge -> Corsair Cove, after the Port Sarim ship). The skip guard behaved
correctly there: a charter ship was a genuine upcoming nearby transport, so
"no_nearby_planned_transport" did not apply and the scan legitimately ran. The
cost is inside the scan itself.

Each raw index probes two offsets, and each probe does several client-thread
scene lookups (wall exact + adjacency fallback, game object exact + adjacency
fallback, plus composition resolution), so a ~14 index window can issue hundreds
of client-thread round trips and return nothing.

Time each handler separately (doors, door-candidate, rockfall, transports) and
log the breakdown at INFO when a scan exceeds 500ms, so the dominant call is
identified from one run instead of by guessing.

Instrumentation only; no behaviour change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Instrumentation attributed the stall precisely:

  slow raw scene scan: total=5539ms idx=12 doors=4564ms doorCand=974ms
                       rockfall=1ms transports=0ms resolved=false

handleDoors was 82% of a 5.5s scan that resolved nothing - about 380ms per raw
index. Each probe issued up to four bounded scene queries (wall exact, wall
adjacency, game object exact, game object adjacency), and a scan walks ~12 raw
indices x 2 offsets x several probes, so a single no-op scan could cost hundreds
of client-thread round trips.

Take one bounded snapshot of wall and game objects up front (radius
handlerRange+2, a superset of what the per-probe queries could reach, since
probes stay within handlerRange+1 of the player and only match objects within one
tile of a probe) and resolve probes against it in memory. Two queries per scan
instead of hundreds.

Exact-tile match is still preferred over the one-tile adjacency fallback, so
door selection is unchanged. The snapshot is scoped to one scan and cleared in a
finally block; outside a scan it is null and every other handleDoors caller keeps
the original query-per-probe path.

Guardrail baseline regenerated: the resolver entries are the same off-thread
getWorldLocation reads relocated out of handleDoors (24 added, 23 removed), plus
lambda-index renumbering in untouched methods.

Not yet validated live - the next walk past a transport should show the scan drop
well under the 500ms slow-scan threshold.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The pathfinder cold start the walker blocks on was measured at
"slow refresh transports=2639ms restr=1ms total=2640ms" — essentially all of it
is refreshTransports re-evaluating every transport on a cache miss.

The per-stage breakdown (merge/cache/filter/useTrans/similar plus per-type stats)
already existed but only at DEBUG, and nothing recorded why the cache missed.

- Log the miss reason: "key" (cache key changed — items, coins, toggles) vs
  "verify" (items identical, game state moved — skills/varbits/varplayers/quests)
  vs "no_snapshot".
- Include the inventory/equipment/bank fingerprint and the previous refresh's
  value, so an item-driven miss is visible directly. The fingerprint hashes item
  quantity, so spending coins on a charter fare or toll gate changes it and
  invalidates the key on its own — this makes that testable rather than assumed.
- Promote the existing stage breakdown to INFO when a refresh is slow enough to
  be the visible cold start.

Instrumentation only; no behaviour change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cache-miss attribution showed a miss with an identical cache key AND identical
inventory fingerprint:

  refresh_transports cache_miss reason=verify key=76240725 prevKey=76240725
                     invFp=31671802 prevInvFp=31671802 invChanged=false

The verification gate hashed Arrays.hashCode(boostedLevels) over SKILLS =
Skill.values(), i.e. all 23 skills including HITPOINTS and PRAYER. Those move
constantly from HP regen and prayer drain, so the transport cache was invalidated
during ordinary play regardless of items — forcing the full re-evaluation the
walker blocks on at route start (measured 2652ms, of which useTransport() over
5714 plain transports is 2290ms).

No transport gates on hitpoints, so hitpoints cannot change any transport's
usability and must not participate in the hash. Collect the skills some transport
actually requires (hasRequiredLevels treats level > 0 as a requirement) and hash
only those, mirroring how varbits/varplayers are already collected from the
merged transport list. The skill set is carried on the snapshot so the cache-hit
probe checks the same subset, which also removes 23 per-probe client-thread
getBoostedSkillLevel calls.

Payment-driven misses are unaffected and still correct: spending coins changes
the inventory fingerprint, which is part of the cache key, not this hash.

Tests: HP regen / prayer drain must not invalidate; a required skill (agility)
still must; out-of-range ordinals are ignored.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
infuse21 and others added 21 commits July 21, 2026 15:45
Both tests called rawPath(START, GOAL) independently. Each call reloaded all 6292
transports and ran a full Pathfinder, and Pathfinder -> CollisionMap.getCachedRegionId
calls Rs2Player.getWorldLocation(), which has no client thread under test and blocks
for its full 10s timeout before being swallowed.

Compute the route once in @BeforeClass and share it. Full unit suite drops from
~70s to 47s (1106 tests, 0 failures) and the duplicate transport load is gone.

Two client-thread timeouts remain inside the single Pathfinder run: the region id
is cached for only 5s per CollisionMap, and the timeouts themselves push the run
past that window, so it re-queries. Removing those entirely would mean not running
the real pathfinder in this test, which would cost the route coverage the greedy
LOS-chain assertion depends on.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Live log near (3150..3151, 3363): the walker used an agility shortcut, crossed to
the far side, then immediately used the opposing entry to come back and could not
recover — about 19s of a 2m26s walk.

  post-handleObject adjacent landing failed | dest=3150,3363 at=3154,3363
  post-handleObject landing unresolved      | dest=3150,3363 at=3154,3363
  post-handleObject landing unresolved      | dest=3151,3363 at=3149,3363   <- crossed
  local reachability miss / route-backed local recovery click

The two destinations are adjacent tiles: the same shortcut catalogued as two
opposing entries.

markAdjacentSamePlaneTransportHandled ran only when waitForPostHandleObjectLanding
succeeded. Adjacent same-plane transports require landing on the exact destination
tile (maxInclusive == 0) and agility shortcuts routinely land a tile off it, so the
crossing succeeded physically while the check reported failure. Nothing was
suppressed, so the inverse entry stayed immediately eligible.

Suppress both tiles whenever the player is no longer on the origin, regardless of
the landing verdict. The landing result is unchanged - it still returns false and
replans; this only stops the walker re-crossing straight back. Suppression is
already type-agnostic (adjacency and plane only), so shortcuts and doors are
covered alike.

Adds a unit test that an adjacent same-plane AGILITY_SHORTCUT yields both tiles as
suppression points, plus movement.md chsami#22.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Component attribution showed the teleport stall was self-inflicted:

  transport_handoff_enter type=TELEPORTATION_SPELL
  post_transport_segment_handler handled=true i=0 ms=16562
  refresh_transports cache_miss reason=verify ... changed=varplayers,

LAST_HOME_TELEPORT appears exactly once in the transport data - the Home Teleport
cooldown in teleportation_spells.tsv - and is one of the 8 varplayers in the
verification hash. Casting the spell writes that varplayer, so the teleport
invalidated the transport cache by being used, forcing a full ~2.9s re-evaluation
of all 12666 transports inside its own 16.5s handling window.

It is also structurally wrong independent of teleporting: COOLDOWN_MINUTES compares
against wall-clock minutes, so the raw value advances continuously and can never
match a stored one.

Hash the condition verdict (TransportVarPlayer.matches) plus the condition identity
(id, operator, threshold) rather than the raw varplayer value. The verdict flips
exactly once - when the cooldown expires and the transport genuinely becomes usable
- so an expiring cooldown still invalidates while a ticking one does not. Condition
identity is included so adding or changing a condition still invalidates.

Same rule as the skills fix: only inputs that can flip a transport's usability may
participate in the cache key.

The value provider is injectable so the behaviour is unit-testable: two different
raw values inside one cooldown window hash identically, crossing the threshold does
not, and the condition encoding is order-independent and deduplicated.

Adds movement.md chsami#23.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The visible cold start is not the teleport - it is the gap between starting a walk
and the walker doing anything at all:

  walk_start
  cache_miss reason=verify ... changed=varbits,
  slow refresh transports=2888ms
  pf_ready elapsed=2418ms
  transport_handoff_enter TELEPORTATION_SPELL   <- only now does it act

That first miss is attributed to varbits, a different cause from the varplayer
cooldown fixed in the previous commit.

TransportVarbit is structurally identical to TransportVarPlayer - same operators,
same matches() - so it gets the same treatment: hash the condition verdict plus the
condition identity rather than the raw varbit value. A varbit whose value moves
without flipping any verdict cannot change a transport's usability, so it must not
force a full re-evaluation the walker blocks on before its first action.

Whether this removes the walk-start miss depends on whether that varbit's verdict
genuinely flipped. If a miss still appears with changed=varbits it is a real
usability change, and the remaining lever is the cost of a miss (~2.3s of
useTransport over 5714 transports) rather than its frequency.

The value provider is injectable, so the test asserts the real behaviour: 7 -> 9
against "> 5" does not invalidate, 7 -> 3 does.

Extends movement.md chsami#23 to cover varbits.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A minimap click is resolved by the game's own pathing, so line of sight is
irrelevant to walking - a player clicks past a corner, through a doorway, or
around a building and the server routes them there. Clamping click targets to a
straight walkable line made the walker advance corner-to-corner, stopping at each
corner to re-aim before issuing the next click. That is a visible behavioural tell
and no human walks that way.

It also bought no correctness. The off-route click (3176,3428) that motivated the
clamp was not caused by a lack of line of sight: selection returned null on a stale
anchor, so the caller fell through to clamping a far smoothed waypoint to a
Euclidean radius, which landed off the planned route. The game then pathed to that
off-route tile its own way. Once the anchor self-heal landed, selection returns a
raw-route point by construction and the LOS tier was doing nothing but shortening
clicks.

The invariant that actually matters is that the target sits ON the raw route: then
however the server walks there, we arrive on the planned path.

- Primary selection is again the furthest forward raw-route point within minimap
  reach, with no LOS and no bounded-reachability requirement (the latter could also
  shorten clicks without protecting anything the route membership does not).
- The outside-clip route fallback drops its LOS-preferring tier too.
- Removes hasWalkableLineOfSight and isOffSceneOrUnloaded, now unused.
- Retained: the anchor self-heal (the real fix), raw-route-only selection, the
  reachability guard on the wall-distance fallback branch, and the door/gate
  pre-click guards, which are what stop a click skipping a closed door.

Replaces LineOfSightClickRegressionTest with RouteClickTargetRegressionTest, which
pins the correct invariant - the historic click is not on the raw route, and the
route offers long forward reach within minimap range so clicks are not shortened to
the nearest corner. Rewrites movement.md chsami#20 to record that LOS clamping was tried
and reverted, so it is not reintroduced.

Guardrail baseline regenerated: all 24 entries are lambda-index renumbering in
untouched methods (26 removed, 24 added), no new non-lambda violations.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ary selection

chsami#19 instructed selecting the primary click from the player's bounded reachable set
"not walkability". The primary selector now uses isKnownWalkableOrUnloaded, so the
entry contradicted the code it documents.

Scope it to what is still true and still implemented: reachability gating belongs
on click targets that are invented rather than taken from the route - the
getPointWithWallDistance nudge and the scaled-radius directional fallback - plus
the bidirectional rejoin. Records that gating primary selection was tried and
reverted, since a BFS bounded by click radius can exclude legitimate
around-a-corner points and shorten clicks for no benefit: a point taken from the
raw route is safe by construction (chsami#20).

Documentation only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Full audit of all 23 entries against the current source.

Symbol check: every symbol named in a "Where this applies" line resolves. Five
symbols (atTransportDestination, DIRECT_CLICK_MAX_DISTANCE,
clickOptimisticRecoveryTarget, isRouteActive, playerIsIdleForShortWindow) appear
only inside "Pattern to follow" blocks as illustrative pseudo-code, which is easy
to mistake for a real API when grepping.

Numeric claims are consistent with the code: chsami#21 correctly describes 2500ms as the
previous idle-nudge window and quotes the current 1200ms constant, and the walker
lock #1 refers to exists.

Two fixes:

- #5 says to suppress the inverse adjacent transport after a *successful* crossing.
  That is incomplete in isolation: a reader following only #5 reproduces the bug
  chsami#22 fixes, because adjacent transports require an exact-tile landing and a
  crossing can succeed while the landing check fails. Cross-referenced.
- Added a reading guide noting that pattern blocks may be pseudo-code, that "Where
  this applies" is the authoritative symbol list, and that chsami#19/chsami#20 deliberately
  record reverted approaches.

Documentation only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Route selection always returned the furthest candidate inside a fixed radius
(MINIMAP_REACH_EUCLIDEAN - 1), so every click covered the same tile span. The
existing randomisation nearby does not address this: nextWalkingDistance (9-12)
gates whether a waypoint is far enough to be worth clicking, and proximityWake
(2-4) gates the post-click wait, but neither varies the reach used to pick the
tile.

Jitter the reach per click via routeClickReach, applied inside
selectRouteClickTarget so every click path picks it up rather than only the main
route loop.

Varying reach is the safe axis: it changes only how far along the route the target
sits, never sideways, so the target stays on the planned route. Lateral tile
offsets are the wrong axis - they leave the route, which is what produced clicks on
the wrong side of a fence or inside a building, and route membership is what keeps
the server's own pathing on our route. Lateral randomness belongs inside the tile,
in click-point jitter.

Bounds are load-bearing. The floor (7) stays clear of INTERIM_CLOSE_TILES (5) so a
short click cannot land inside the interim-close threshold, clear the checkpoint
immediately and cause click thrash. The ceiling is the caller's reach, already tuned
to the minimap clip. A shortened reach also retries at full reach before giving up,
so it can never be the reason selection returns null and drops the click onto the
off-route wall-nudge clamp.

Adds movement.md chsami#24 and tests for the bounds, actual variation, and degenerate
reach values.

Not yet validated live.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The player-anchored retry ran at full reach, bypassing the jitter. That retry
fires on most first clicks of a route (sel=route@player), so in practice the
variation was skipped exactly where it is most visible: measured first-click
distances clustered at 9.0-10.0 rather than spreading across the 7-10 band.

Use the jittered reach there as well, keeping the full-reach fallback so a
shortened reach still cannot be the reason selection returns null.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The class javadoc still said no consumers had been switched over yet and
that this was still pending as Stage 3, but Stage 3 completed three
commits later in this same branch (eb0e274 leaf consumers, 6ee086b
walker-package helpers, e6e7f0c Rs2Walker). A reviewer opening the
facade was told the migration had not happened when it had.

Records the end state instead, plus the grep that verifies it: the only
remaining ShortestPathPlugin static references under microbot/util/ are
the delegations in this class, which is the invariant that confines an
upstream backport to this one file.

Doc only; no behaviour change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A walk to an underground goal reported UNREACHABLE while it was still
advancing. Two defects combined.

partialPath is recomputed every iteration as "path end is further than
distance from the goal". The pathfinder stopped 31 tiles short of
(3087,9720), so it was true from the first snapshot onward and the retry
budget was armed for the whole walk rather than for a stuck stretch.

The path loop also exits for good reasons. Opening a door ends the
iteration and lands in the same branch as a failure to move, so it spent
a retry. Observed: retry 1 at the end of the first segment, ~100 tiles
and 46 seconds of successful walking, then retries 2 and 3 within one
second of a single door open - the second without the player moving at
all. It gave up on the surface having never reached the ladder.

Refill the budget when route progress advanced since the last charge,
and exempt exit reasons that denote work done (door/transport/blocker
handled, movement in flight). The exemption is deliberately narrow:
not-near-path, click-failed-off-minimap and the waiting/retry states
still consume it, so a genuinely unreachable goal still terminates.

Also stop passing placeholders to recordUnreachable. pathEndpoint was
the player's location and pathSize a literal 0, so the log read as
"pathfinder returned an empty path at your feet" and endpointToTarget
became a surface-to-underground y delta (6346) instead of the real
31-tile shortfall. Underground is the same plane at y+6400, so
WorldPoint.distanceTo does not bail out across that boundary - it just
returns a meaningless number.

movement.md chsami#25 and chsami#26 record both.

Tests: :client:runUnitTests green, 1113 tests, 0 failures. Guardrail
reports 961 known violations, no regressions - baseline unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The refill condition used routeProgressAdvancedAtMs alone. That field is
also bumped by stabilizeRouteProgressIndex whenever the route is merely
REPLACED (path size or endpoints differ), and every partial retry calls
recalculatePath() - so a retry could refill the budget it had just spent.

The path stabilises once the walker is truly stuck, so it still
terminated, but only after extra iterations, and a route that flapped
between two shapes on successive recalcs could have kept refilling until
the 64-iteration tail cap.

Also require the player to be standing somewhere new since the last
retry. When a target is genuinely unreachable the player stops moving,
so movement is the signal that separates "advancing" from "stuck" -
which is what lets the budget drain and report UNREACHABLE.

Found while probing a walk whose goal (3087,9720) is blocked in the
collision map, with 0 walkable tiles within 6. The pathfinder correctly
stopped at (3056,9720), the last walkable tile before the rock face.

Tests: :client:runUnitTests green, 1113 tests, 0 failures. Guardrail 961
known violations, no regressions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A walk to (3087,9720) - inside the rock east of the Dwarven Mine, with
zero walkable tiles within 6 - spent ~80s covering 100+ tiles from
Draynor, went underground, stopped at (3056,9720) which is the last
walkable tile before the rock face, and then reported
partial-retries-exhausted. The pathfinder was right; a path request from
(3056,9720) to the goal returns size 1, meaning you cannot leave that
tile toward the target. Only the diagnosis was wrong: the failure read
as a walker fault rather than a bad destination coordinate. The intended
target was the Motherlode cave mouth at (3060,9766).

processWalk now checks the collision map for any walkable tile within
the arrival distance and returns UNREACHABLE immediately with cause
target-not-walkable, naming the nearest walkable tile so the coordinate
can be corrected.

The guard is deliberately permissive. An unmapped region reads as fully
blocked, because SplitFlagMap.get returns false for one and
CollisionMap.isBlocked negates all four directions - so a naive check
would reject every instance and every region absent from the collision
map. Adds SplitFlagMap.hasRegion and a CollisionMap delegate, and every
ambiguous case (no map, unmapped target, unmapped tile in the search
box) returns walkable and lets the pathfinder decide. Only mapped,
wholly blocked terrain is rejected.

Tests: 5 new cases against the real collision map, covering the buried
coordinate, the cave mouth and last-walkable tile still being accepted,
unmapped regions never being rejected, and a generous arrival distance
reaching real ground. Suite green, 1118 tests, 0 failures. Guardrail 961
known violations, no regressions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
handleRockfall required BOTH the player and currentTarget to be in
region 14936, so any walk leaving the Motherlode Mine bailed before
inspecting anything. Observed live at=(3751,5672) goal=(3040,9810): the
goal is region 12185, so no outbound route could mine through a rockfall
standing directly in its path. Approaching the mine from outside was
equally dead, since the player is not in 14936 yet.

Rockfalls only exist in the Motherlode Mine, so a region gate is right -
it just has to test where the rockfall could BE (the player's tile, or
the path tiles about to be inspected), never where the walk ends.
Extracted as isMotherlodeRockfallCandidate so both directions are
testable without a client.

Also defer the pickaxe check until a rockfall is actually found. It ran
before any rockfall was located and called setTarget(null), so a route
merely passing through the mine without a pickaxe was killed outright.
Now only a rockfall genuinely in the way abandons the walk.

Note this handler still only fires when a rockfall lies ON the path, and
transports.tsv contains no rockfall entries (grep -ic rockfall = 0),
while the collision map marks those tiles blocked. So the pathfinder
never routes through one and the handler stays dormant. Cataloguing MLM
rockfalls as Mine;Rockfall;26679/26680 transports - mirroring the
existing Mine;Rock slide;2634 entries - is what will actually exercise
it. That needs per-rockfall coordinates from a live session and is
tracked separately.

Tests: 3 new gate cases (leaving the mine, approaching from outside,
closed elsewhere). Suite green, 1121 tests, 0 failures. Guardrail 961
known violations, no regressions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
An obstacle that stands BETWEEN two walkable tiles - Motherlode
rockfalls, rubble, rock slides - can only be modelled as a transport if
you know both of its open ends, and the object's own position does not
give you those. /objects returns position only, so collecting them meant
reading coordinates off a screenshot.

Reports each match's surrounding tiles with live-scene walkability, plus
a "sides" object pairing opposing neighbours on each axis: the axis whose
bothWalkable is true is the transport's origin/destination pair.

Walkability is read from the live scene collision flags rather than the
bundled collision map, which is the point - the bundled map has these
obstacles baked in as permanent walls, so it cannot tell you they are
passable. Also reports selfWalkable so a cleared obstacle is
distinguishable from a standing one.

The flag array is read once per request inside a single client-thread
call. Rs2Tile.isWalkable hops the client thread per invocation, so the
obvious implementation would have cost 8 hops per object.

Tests: suite green, 1121 tests, 0 failures. Client-thread guardrail 961
known violations, no regressions. Documented in AGENT_SERVER.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The bundled collision map bakes rockfalls in as permanent walls. That is
correct for upstream, which has no automation to clear them, but it left
the mine carved into disconnected pockets: a route from the cave arrival
tile (3728,5692) to the WEST_LOWER mining area died 10 tiles short, and
walking anywhere inside the mine mostly failed.

Rs2Walker.handleRockfall already knew how to mine 26679/26680, but it
only fires when a rockfall lies ON the path - and since nothing
contradicted the collision map, the pathfinder never routed through one.
The handler was effectively dead code.

Each rockfall is now a Mine;Rockfall;<id> transport between its two open
sides, mirroring the existing Mine;Rock slide;2634 entries. 32 spawn
points, 90 rows: 19 are chokepoints where exactly one axis is open, 13
are bypassable and only add an alternative edge. Duration 10 keeps an
open corridor preferred over mining when both exist.

Positions came from the live scene via GET /objects/neighbours, unioned
across 9 samples taken minutes apart - rockfalls respawn, and a single
snapshot was already one short. All 32 appeared in every sample, so the
set looks complete, though a spot that was cleared for the whole session
would not have been seen. A missing rockfall is safe: it just stays a
wall, which is today's behaviour.

Item requirements use ';' (alternatives) rather than the ' ' separator
the existing rock slide row uses. Note this is presentational only:
Transport parses the column into Set<Set<Integer>>, but
PathfinderConfig.hasRequiredItems flattens it and calls anyMatch, so
either separator behaves as "any one pickaxe". ';' matches the data
model's intent and reads correctly.

Tests: 4 new offline cases against the real collision map and transport
data, incl. the original failure (arrival -> WEST_LOWER, previously 10
tiles short) and a full Draynor -> mining area route. Suite green, 1125
tests, 0 failures. Guardrail 961 known violations, no regressions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
hasRequiredTransportItems only admitted plain TRANSPORT entries carrying
a currency cost, so an item-gated obstacle - a machete for a jungle bush,
a pickaxe for a Motherlode rockfall, a Shantay pass - fell through every
branch to the catch-all "return true", was never reported missing by
getMissingTransports, and was never withdrawn.

That contradicted the pathfinder. PathfinderConfig.hasRequiredItems ORs
in Rs2Bank.hasItem when useBankItems is set, and refreshAvailableItemIds
includes bank contents on the same flag, so a route was planned through
the obstacle on the strength of a banked item the planner then declined
to fetch - stranding the walk at the obstacle it had just routed through.

Extracted the decision as planningCoversPlainTransport so both directions
are testable without a client.

This only widens which transports are ELIGIBLE, not how many bank trips
happen. Collection is path-scoped: getTransportsForDestination pathfinds
first and inspects only transports on the resulting route, so an item is
fetched solely when the chosen route actually needs it. The downstream
machinery already handled generic items - getMissingTransportItemIdsWith-
Quantities walks getItemIdRequirements for any transport, picks whichever
alternative has the most in bank, and uses quantity 1 for non-currency
transports - so nothing else had to change.

235 rows in transports.tsv become eligible: 90 Motherlode rockfalls (new
in this branch), 102 machete-gated jungle bush/tree/vines, 10 White Wolf
Mountain rock slides, 6 Shantay passes, and ~27 keyed doors, ladders and
slopes. Only the Motherlode case is verifiable offline; the Karamja and
desert routes are untested live.

Tests: 5 new cases over the real transport data - every item-gated plain
transport eligible, every requirement-free one still ignored, currency
transports unchanged, rockfalls covered, and null/non-plain types
rejected. Full suite green, guardrail 961 known violations, no
regressions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Region 58_88 (Motherlode Mine, x3712-3775 y5632-5695) regressed in
631884f "update collision map" (23 Jan 2026). Connectivity from the
cave arrival tile (3728,5692) collapsed from 1473 reachable tiles to
192 - 87% of the mine cut off - and every lower-floor mining spot became
unreachable:

  a585dc3 (19 Nov 2025)  walkable=1623  reachable=1473  spots OK
  631884f (23 Jan 2026)  walkable=1580  reachable=192   spots dead
  a19a334 (12 May 2026)  walkable=1606  reachable=192   spots dead
  f8b1138 (20 Jul 2026)  walkable=1606  reachable=192   spots dead

This is why the world map could once be used to walk into Motherlode and
then could not: the pathfinder had no route through the mine, so any
target inside it was unreachable regardless of how it was set.

Restores just that one 952-byte region from a585dc3. Every other
region is left on the current upstream sync - verified by comparing
decompressed entries, only 58_88 differs.

Safe despite the age: Motherlode Mine last changed in the game on
8 May 2024 (Project Rebalance, minor follow-up 15 May 2024), so the
19 Nov 2025 capture postdates the last map change by 18 months. The
January regression was a bad regeneration, not a map update.

After: walkable=1623 reachable=1473, with WEST_LOWER, WEST_MID,
SOUTH_EAST and SOUTH_WEST all reachable from the arrival tile.

The upper floor (WEST_UPPER, EAST_UPPER) stays unreachable in every
version including the good one - that needs the ladder catalogued, which
is gated behind the 100 golden nugget unlock and is tracked separately.

With the mine genuinely connected, Rs2Walker.handleRockfall works as
designed: routes now pass through the mine and it mines a rockfall that
lies on the path. That is the correct model, unlike the transport rows
reverted in 289090d - a transport relocates the player, and mining a
rockfall does not.

The archive is byte-larger-compressed differently (1197109 -> 1058342)
because it was rewritten by a different deflate implementation; entry
names, count (2724) and decompressed contents are unchanged apart from
58_88.

Verified offline by decoding the FlagMap bitset directly. NOT yet
verified in-game.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…uting"

This reverts 5c06b86, restoring the pre-flight guard.

It was reverted because it appeared to block legitimate walks into the
Motherlode Mine. That diagnosis was wrong. The walks it rejected were
targets in genuine solid rock in the Dwarven Mine (region 48_151):
(3079,9710), (3086,9719), (3087,9720), (3087,9723), (3087,9724) - all
produced by clicking the Motherlode inset on the world map, which
resolves against the host region's coordinate space and so never yields
a Motherlode tile. The guard was correct to refuse them, and naming the
nearest walkable tile was the most useful diagnostic in the whole
session.

What was actually broken was collision region 58_88, fixed in cf8cf03.

The revert reasoning also claimed the guard turns "degraded but
progressing" into hard failure. That does not hold up: walking to the
nearest tile to a rock face achieves nothing, and it costs ~30s before
failing with a less specific error.

The remaining objection - that collision data can be wrong, so "blocked"
is not proof of "impossible" - is real, and the guard already answers it
by abstaining wherever data is absent: no map, unmapped target, or any
unmapped tile in the search box all return walkable and let the
pathfinder decide. Only mapped, wholly blocked terrain is rejected.

Not yet verified: this has not been compiled or tested since the revert,
and TargetWalkabilityPreflightTest asserts against Dwarven Mine
coordinates that cf8cf03 does not touch, so it should be unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 318 files, which is 218 over the limit of 100.

To get a review, narrow the scope:
• coderabbit review --committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: eefbcac5-bd2f-4532-bd7b-bcbf9a0cc8d7

📥 Commits

Reviewing files that changed from the base of the PR and between 20e953a and c626321.

⛔ Files ignored due to path filters (6)
  • runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/blocked_edges.tsv is excluded by !**/*.tsv
  • runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/collision-map.zip is excluded by !**/*.zip
  • runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/restrictions.tsv is excluded by !**/*.tsv
  • runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/spirit_trees.tsv is excluded by !**/*.tsv
  • runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/teleportation_items.tsv is excluded by !**/*.tsv
  • runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/transports.tsv is excluded by !**/*.tsv
📒 Files selected for processing (326)
  • docs/AGENT_SERVER.md
  • docs/entity-guides/movement.md
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/Script.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/agentserver/handler/ObjectHandler.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/.quest-helper-sync
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestHelperConfig.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestHelperPlugin.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestScript.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/bank/banktab/QuestBankTab.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/bank/banktab/QuestBankTabInterface.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/bank/banktab/QuestHelperBankTagService.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/bikeshedder/BikeShedder.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/collections/ItemCollections.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/collections/KeyringCollection.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/collections/TeleportCollections.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/config/ConfigKeys.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/config/LeagueFiltering.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/domain/QuetzalDestination.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/ardougne/ArdougneEasy.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/ardougne/ArdougneElite.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/ardougne/ArdougneHard.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/ardougne/ArdougneMedium.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/desert/DesertEasy.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/desert/DesertElite.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/falador/FaladorEasy.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/falador/FaladorElite.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/fremennik/FremennikElite.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/fremennik/FremennikMedium.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/kandarin/KandarinEasy.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/kandarin/KandarinElite.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/kandarin/KandarinHard.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/kandarin/KandarinMedium.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/karamja/KaramjaElite.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/karamja/KaramjaMedium.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/kourend/KourendEasy.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/kourend/KourendMedium.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/lumbridgeanddraynor/LumbridgeEasy.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/lumbridgeanddraynor/LumbridgeElite.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/morytania/MorytaniaEasy.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/morytania/MorytaniaElite.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/morytania/MorytaniaMedium.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/varrock/VarrockMedium.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/westernprovinces/WesternMedium.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/achievementdiaries/wilderness/WildernessEasy.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/ChartingConditionalStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/ChartingHelper.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/ChartingSeaSection.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/ChartingTaskDefinition.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/ChartingTasksData.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/steps/ChartingCaveTelescopeStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/steps/ChartingCrateStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/steps/ChartingCurrentStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/steps/ChartingGenericObjectStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/steps/ChartingPuzzleWrapStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/steps/ChartingTaskNpcStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/steps/ChartingTaskObjectStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/steps/ChartingTaskStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/activities/charting/steps/ChartingWeatherStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/alfredgrimhandsbarcrawl/AlfredGrimhandsBarcrawl.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/barbariantraining/BarbarianTraining.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/daddyshome/DaddysHome.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/enchantedkey/EnchantedKey.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/enchantedkey/EnchantedKeyDigStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/lairoftarnrazorlor/TarnRoute.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/themagearenai/TheMageArenaI.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/themagearenaii/MA2Locator.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/themagearenaii/MageArenaBossStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/themagearenaii/MageArenaSolver.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/themagearenaii/MageArenaSpawnLocation.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/themagearenaii/TheMageArenaII.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/miniquests/valetotems/ValeTotems.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/farmruns/FarmingConfigChangeHandler.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/farmruns/FarmingPatch.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/farmruns/FarmingRegion.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/farmruns/FarmingUtils.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/farmruns/FarmingWorld.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/farmruns/HerbRun.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/farmruns/PatchImplementation.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/farmruns/PaymentTracker.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/farmruns/TreeRun.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/knightswaves/KnightWaves.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/mischelpers/strongholdofsecurity/StrongholdOfSecurity.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/aporcineofinterest/APorcineOfInterest.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/bearyoursoul/BearYourSoul.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/belowicemountain/BelowIceMountain.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/beneathcursedsands/BeneathCursedSands.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/biohazard/Biohazard.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/blackknightfortress/BlackKnightFortress.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/childrenofthesun/ChildrenOfTheSun.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/clientofkourend/ClientOfKourend.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/clocktower/ClockTower.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/cooksassistant/CooksAssistant.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/creatureoffenkenstrain/CreatureOfFenkenstrain.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/currentaffairs/CurrentAffairs.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/deathontheisle/DeathOnTheIsle.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/deathtothedorgeshuun/DeathToTheDorgeshuun.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/demonslayer/DemonSlayer.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/demonslayer/IncantationStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/deserttreasure/DesertTreasure.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/deserttreasureii/DesertTreasureII.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/deserttreasureii/PerseriyaSteps.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/deserttreasureii/WhispererSteps.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/deviousminds/DeviousMinds.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/doricsquest/DoricsQuest.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/dragonslayer/DragonSlayer.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/druidicritual/DruidicRitual.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/dwarfcannon/DwarfCannon.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/elementalworkshopi/ElementalWorkshopI.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/elementalworkshopii/ElementalWorkshopII.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/enakhraslament/EnakhrasLament.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/enlightenedjourney/EnlightenedJourney.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/fairytalei/FairytaleI.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/fairytaleii/FairytaleII.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/fightarena/FightArena.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/forgettabletale/ForgettableTale.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/gardenoftranquility/GardenOfTranquillity.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/gertrudescat/GertrudesCat.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/ghostsahoy/DyeShipSteps.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/goblindiplomacy/GoblinDiplomacy.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/grimtales/GrimTales.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/hauntedmine/HauntedMine.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/hazeelcult/HazeelCult.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/heroesquest/HeroesQuest.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/holygrail/HolyGrail.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/impcatcher/ImpCatcher.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/junglepotion/JunglePotion.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/landofthegoblins/LandOfTheGoblins.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/lostcity/LostCity.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/makinghistory/MakingHistory.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/merlinscrystal/MerlinsCrystal.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/misthalinmystery/MisthalinMystery.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/monkeymadnessi/MonkeyMadnessI.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/monkeymadnessii/AgilityDungeonSteps.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/monksfriend/MonksFriend.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/mountaindaughter/MountainDaughter.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/mourningsendparti/MourningsEndPartI.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/mourningsendpartii/MourningsEndPartII.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/murdermystery/MurderMystery.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/myarmsbigadventure/MyArmsBigAdventure.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/naturespirit/NatureSpirit.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/observatoryquest/ObservatoryQuest.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/observatoryquest/StarSignAnswer.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/onesmallfavour/OneSmallFavour.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/pandemonium/Pandemonium.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/piratestreasure/PiratesTreasure.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/piratestreasure/RumSmugglingStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/plaguecity/PlagueCity.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/priestinperil/PriestInPeril.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/princealirescue/PrinceAliRescue.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/pryingtimes/PryingTimes.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/ragandboneman/RagAndBoneManII.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/ratcatchers/RatCatchers.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recipefordisaster/RFDDwarf.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recipefordisaster/RFDPiratePete.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recipefordisaster/RFDSkrachUglogwee.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recruitmentdrive/DoorPuzzle.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recruitmentdrive/LadyTableStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recruitmentdrive/MissCheeversStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recruitmentdrive/MsCheevesSetup.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recruitmentdrive/MsHynnAnswerDialogQuizStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recruitmentdrive/RecruitmentDrive.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/recruitmentdrive/SirRenItchoodStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/romeoandjuliet/RomeoAndJuliet.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/runemysteries/RuneMysteries.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/scorpioncatcher/ScorpionCatcher.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/scrambled/EggSolver.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/scrambled/Scrambled.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/seaslug/SeaSlug.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/shadowofthestorm/IncantationStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/shadowofthestorm/SearchKilns.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/shadowofthestorm/ShadowOfTheStorm.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/shadowsofcustodia/ShadowsOfCustodia.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/sheepherder/SheepHerder.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/sheepshearer/SheepShearer.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/shieldofarrav/ShieldOfArravBlackArmGang.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/shilovillage/ShiloVillage.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/sinsofthefather/DoorPuzzleStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/swansong/FishMonkfish.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/taibwowannaitrio/TaiBwoWannaiTrio.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/templeofikov/TempleOfIkov.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thecurseofarrav/TheCurseOfArrav.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thedigsite/TheDigSite.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thefinaldawn/TheFinalDawn.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/theforsakentower/JugPuzzle.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thefremennikisles/TheFremennikIsles.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thefremenniktrials/TheFremennikTrials.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thegolem/TheGolem.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/theheartofdarkness/TheHeartOfDarkness.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/theidesofmilk/TheIdesOfMilk.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/theknightssword/TheKnightsSword.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thelosttribe/TheLostTribe.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thepathofglouphrie/ThePathOfGlouphrie.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thepathofglouphrie/YewnocksPuzzle.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thepathofglouphrie/sections/TheWarpedDepths.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/theredreef/TheRedReef.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/therestlessghost/TheRestlessGhost.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/theslugmenace/PuzzleStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/thetouristtrap/TheTouristTrap.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/throneofmiscellania/ThroneOfMiscellania.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/toweroflife/PuzzleSolver.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/treegnomevillage/TreeGnomeVillage.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/tribaltotem/PuzzleStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/tribaltotem/TribalTotem.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/trollstronghold/TrollStronghold.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/troubledtortugans/RepairTown.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/troubledtortugans/TroubledTortugans.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/vampyreslayer/VampyreSlayer.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/wanted/Wanted.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/watchtower/Watchtower.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/waterfallquest/WaterfallQuest.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/whatliesbelow/WhatLiesBelow.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/whileguthixsleeps/WhileGuthixSleeps.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/witchshouse/WitchsHouse.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/witchspotion/WitchsPotion.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/helpers/quests/xmarksthespot/XMarksTheSpot.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/managers/ItemAndLastUpdated.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/managers/NewVersionManager.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/managers/QuestContainerManager.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/managers/QuestManager.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/managers/QuestMenuHandler.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/overlays/QuestHelperMinimapOverlay.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/overlays/QuestHelperOverlay.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/overlays/QuestHelperWorldArrowOverlay.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/overlays/QuestHelperWorldLineOverlay.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/overlays/QuestHelperWorldOverlay.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/JGenerator.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/ManualStepSkipStore.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/PanelDetails.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/QuestHelperPanel.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/QuestOverviewPanel.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/QuestRequirementsPanel.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/QuestRewardsPanel.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/QuestStepPanel.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/TopLevelPanelDetails.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/questorders/IronmanOptimalQuestGuide.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/questorders/OptimalQuestGuide.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/questorders/ReleaseDate.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/queststepsection/AbstractQuestSection.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/queststepsection/QuestSectionSection.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/queststepsection/QuestStepPanel.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/panel/regionfiltering/RegionFilterPanel.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/playerquests/bikeshedder/BikeShedder.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/playerquests/cookshelper/CooksHelper.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/questhelpers/QuestHelper.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/questinfo/ExternalQuestResources.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/questinfo/LeagueQuestRegions.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/questinfo/LeagueRegion.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/questinfo/QuestHelperQuest.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/questinfo/QuestVarbits.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/AbstractRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/ChatMessageRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/Requirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/StepIsActiveRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/conditional/ConditionForStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/conditional/Conditions.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/conditional/ObjectCondition.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/item/ItemRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/item/ItemRequirements.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/item/KeyringRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/item/TrackedContainers.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/npc/DialogRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/npc/NoFollowerRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/npc/NpcRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/player/Boosts.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/player/FreeInventorySlotRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/player/FreePortTaskSlotsRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/player/ShipInPortRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/sailing/HasBoatResistanceRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/util/InventorySlots.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/util/ItemSlots.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/util/Port.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/var/VarbitRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/requirements/zone/ZoneRequirement.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/runeliteobjects/Cheerer.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/runeliteobjects/GlobalFakeObjects.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/runeliteobjects/extendedruneliteobjects/ExtendedRuneliteObject.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/runeliteobjects/extendedruneliteobjects/RuneliteObjectManager.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/statemanagement/AchievementDiaryStepManager.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/statemanagement/BarbarianTrainingStateTracker.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/statemanagement/PlayerStateManager.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/BoardShipStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/ConditionalStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/DetailedQuestStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/DigStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/EmoteStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/NpcEmoteStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/NpcStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/ObjectStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/PortTaskStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/PuzzleStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/PuzzleWrapperStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/QuestStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/WidgetStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/WorldEntityStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/choice/DialogChoiceStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/choice/WidgetChoiceStep.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/emote/QuestEmote.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/overlay/DirectionArrow.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/tools/DefinedPoint.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/tools/QuestPerspective.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/steps/widget/WidgetHighlight.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/util/Utils.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/shortestpath/ShortestPathPlugin.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/shortestpath/UPSTREAM_COMPARISON.md
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/shortestpath/WEBWALKER_IMPROVEMENT_PLAN.md
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/shortestpath/pathfinder/CollisionMap.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/shortestpath/pathfinder/PathfinderConfig.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/shortestpath/pathfinder/SplitFlagMap.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/bank/Rs2Bank.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/depositbox/Rs2DepositBox.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/leaguetransport/Rs2LeaguesTransport.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/npc/Rs2NpcManager.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/poh/data/PohPortal.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/skills/slayer/Rs2Slayer.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/Rs2PathApi.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/Rs2Walker.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/WebWalkLog.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/banking/Rs2WalkerBankingPlanner.java
  • runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/lifecycle/Rs2WalkerLifecycleRuntime.java
  • runelite-client/src/test/java/net/runelite/client/plugins/microbot/shortestpath/RouteClickTargetRegressionTest.java
  • runelite-client/src/test/java/net/runelite/client/plugins/microbot/shortestpath/ShortestPathCoreTest.java
  • runelite-client/src/test/java/net/runelite/client/plugins/microbot/shortestpath/pathfinder/PathfinderConfigTransportRefreshHashTest.java
  • runelite-client/src/test/java/net/runelite/client/plugins/microbot/util/walker/Rs2WalkerUnitTest.java
  • runelite-client/src/test/java/net/runelite/client/plugins/microbot/util/walker/TargetWalkabilityPreflightTest.java
  • runelite-client/src/test/java/net/runelite/client/plugins/microbot/util/walker/banking/BankedTransportItemPlanningTest.java
  • runelite-client/src/test/resources/threadsafety/client-thread-guardrail-baseline.txt

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch So-I-dont-Fuck-The-Walker-KEK

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@infuse21 infuse21 closed this Jul 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant