An eighth of a fishing fleet stops fishing within twenty minutes, silently #247
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
A 75-bot fishing fleet — three bots on each of the 25 derived grounds — was
watched for eighteen minutes, sampled every five seconds. Nine of them
(12%) never banked once. They fill a pack, set off for the bank, fail the
leg, and the brain re-initialises the goal — nine to fourteen times each —
which walks them back to the water, where a full pack means there is nothing
to do but set off for the bank again.
The loop an operator sees is therefore: run to the spot, do nothing, go back
towards the bank, turn around, come back to the spot. Over and over. Across
the nine,
openinganddepositingwere reached zero times in eighteenminutes; they spent 10-17% of their samples
workingand the rest walking.Nothing in a log says so. The bots are walking, the brain reports its failures
at
debug, and from the chair they look like bots on their way somewhere.That silhouette has had one cause fixed already — a booth whose derived
stand could not press it, which produced the identical shuttle for the same
reason (a pack that never empties). This is a second cause with the same
appearance, and it is why the first fix looked complete: the ground it was
verified on has a 57-tile bank leg and works, while the three that fail have
the longest legs in the world.
It is whole grounds, not scattered bots
Every other ground's bots were still working at the end — the Barbarian
Village pair, for contrast, ran 70-78%
workingwith deposits landing andzero goal re-inits. The three that died
are ranked 1st, 3rd and 4th of 25 by the length of their bank leg, which
is the shape of a long-leg routing failure rather than anything about fishing:
It is a risk factor rather than a threshold — g10 at 77 tiles and g9 at 68
were fine — which is consistent with a straight-line hop that wedges on
whatever happens to be in the way rather than on distance as such.
Both directions do route:
World.Movement.route/3answers for all threepairs. For the two Falador ones it answers with what looks like the
closest-reachable fallback rather than a path — 4 steps out and 31 back
for a 71-tile trip — so the search is not completing.
Why the goal never escapes
Bot.Brainrecovers by re-initialising the goal and relocating to the banknearest the anchor, and
choosing_groundthen picks by distance among thethree nearest workable grounds. Nothing in that loop knows the last attempt
failed, so it re-picks the same unreachable ground and fails the same way. The
bot is not wedged on a tile — it is wedged in a decision.
Two things would each break the cycle on their own: a
choosing_groundthatremembers which grounds have just failed and takes the next candidate, or a
Bot.Travellong leg that does not need the hop. The first is cheap andlocal; the second is the real one.
Related
Same family as the pairing question in the reachability issue — a bank chosen
by distance that the bot cannot round-trip — but a distinct symptom worth its
own measurement: there the bot recovers after ninety seconds, here it never
does, and the fleet loses an eighth of itself inside twenty minutes with no
sign of it anywhere.
The fleet is otherwise healthy: 75% of all samples were spent
working, 14%travel_to_ground, 4%travel_to_bank, and no bot spent even two minutesfrozen on a single tile.
Fixed on
fix/long-legs-and-unreachable-banks(df2d46b), afterc01f507closed the cheap half. Asked of the world rather than of the log, the three grounds turn out to be two entirely different faults.The Falador pair are on an island. Their connected component is 2,478 tiles and no bank is on it, so the pairing was across open sea and no pathfinder was ever going to help — which is why
c01f507left them roaming: every ground they could spurn was equally unreachable.@max_searchis a budget, not a reach, and that is the other fault whole.World.Movement.route/4stops at104 * 104visited tiles, justified as the client's 104-tile scene — and a breadth-first sweep visiting N tiles reachessqrt(N), so the real reach is 52. Both halves of that reasoning are true and the conclusion is wrong. Worse than refusing, it falls back to the closest tile to the target it happened to see, which is greedy. Simulating the obvious fix — re-issue to the true destination and walk however far you get:Empty, because from there every reachable tile was further from the bank by straight line than the one the body stood on. Progressive re-routing does not converge; it parks one request in.
What landed
Bot.Route— A* over the collision map. Chebyshev is the exact remaining step count on this grid rather than merely admissible, so it is very directed: 18,336 visits against a plain sweep's 62,498 for the same 267-step path, 23,593 against 81,069 for the 384. An ordinary leg is 1–3k visits and 2ms. Three answers::unreachable(a fact about the world),:too_far(a fact about the budget),{:ok, path}.Bot.Travelcharts once per leg and walkswaypoints/2, cut every forty steps of route rather than of map — that is what keeps each click inside one engine request. The blind straight-line hop is gone; it was clicking at the water. The leg's timeout is now sized by the walk (@max_steps + steps / 2) instead of a constant. Only:unreachablegives up, and immediately;:off_planewalks uncharted on purpose, because a destination up a staircase is a leg onlyBot.Obstacle'sclimb/2can finish and that is reached through the stuck ladder.Bot.Sitesnow pairs a site with a bank it can walk to. It had half the rule already —enclosure/1fills from each bank, so a bank in a pocket only pairs inside it — but the mirror image was open: a bank in the open world pairs with anything in range, island included. Drops 148 tree sites, 8 rock sites and 2 fishing grounds of ~700. Derivation 606ms → ~5.7s, concurrent, once at boot.An unrelated hole this turned up
Moving the search origin from the cluster anchor to
standable/1's tile added a site, which is the opposite of what a stricter rule should do.site/2asked the enclosureMapSet.member?of the anchor — and a tree is a solid loc, so its tile is in no flood fill anywhere. Every enclosed bank had been excluding every gather site unconditionally for the table's whole life.fishing_ground/3passed the stand and was always right, which is why the Fishing Guild case the rule was written for worked and nobody looked.The witness was already in the suite: a test asserting arctic pine derives no site "because Neitiznot's bank is shut in". It is not — the pines walk to it in 26 steps, and
World.Movement.route/4finds the same leg in 29.The sitting
Six fishers, three grounds, fourteen minutes. Deposits:
catherby1 5, catherby2 4, lumbridge1 4, lumbridge2 1, desert1 2, desert2 3.spurned=0andfails=0for every bot for the whole run, nobody shuttling. The comparison is this issue's own measurement: on these grounds, nine bots banked nothing in eighteen minutes and reachedopeningzero times between them.desert1walks its 383-step leg northward first, up to the Lumbridge bridge before turning south for Al Kharid — the charted route rather than the straight line the hop drew, which is the visible difference between the two.Left open
Bot.Routeincluded, so a site behind one is now dropped rather than paired-and-wedged-at. Nothing is lost to it yet (the same door stops the walk), but a door-aware planner would recover them, and it is the same boundary index the Wilderness-wall gates want.@max_bank_rangeis 90 in chebyshev and the two desert grounds pass it at 267 and 384 steps — four minutes of walking for 28 fish. They work; whether they should be offered is a separate question. The Lumbridge one is only long because the Lumbridge bank is plane 2 andsame_plane_bank/2never looks a storey up.Bot.Route.reachable?/3is the questionrecover/2andnearest_bank/1never asked.