Files
Viano-Core/doc/clientless/tram-rescue-routes.md
T

4.2 KiB

Explicit rescue graph (Deeprun Tram)

The user recorded tram_rescue_sw and tram_rescue_if and three bidirectional normal ground recordings:1781 SW->portal_at_2173_target,1782 IF->portal_at_2175_target, 1783 IF<->SW. Their geometry is preserved. Migration2026_10_29_06 marks the two nodes rescue and limits them to Alliance. Future nodes can be created with .clientless node add <key> rescue and connected using ordinary route recording.

Normal graph start selection, nearest location anchors, static and adaptive routing, virtual entries/exits, node bridges and free-flight candidates exclude rescue nodes and edges touching them. They remain administratively visible. Only the synchronous RAII scope in PlanRescueRoute enables them for emergency planning, while retaining area/faction/level and blocked-edge checks.

After normal replanning search radii500/1000/2000/4000 and fallback flight fail, the executor may seek an explicit rescue route. Already exhausted execution retries also reach this fallback. Initial no-progress actions on maps with a rescue network now exhaust those normal searches instead of silently completing and indefinitely cycling intents. Maps without rescue nodes keep prior initial failure behavior. No early rescue while ordinary planning succeeds.

For each allowed same-map rescue node, breadth-first search finds an escape through recorded ground edges to an ordinary node. A complete native adaptive approach to the rescue node is preferred. If no reachable approach exists, only on map369, the bot may transfer to the nearest allowed rescue root that has an actual recorded escape. Native TeleportTo + clientless ACK are used. No arbitrary nearest-node transfer, faction bypass or teleport on other maps. Actual transport passengers, taxi/free flight, combat, death or pending transfer exclude rescue.

The escape executes the authored ground splines. Group road formation and opportunistic ground-exit shortcuts do not alter this emergency path. Intent handover waits until the escape reaches an ordinary node. The executor retains the original destination, then replans it from the escape endpoint. At most two rescue starts per action: the second is reserved for a failed walking escape and may use the tram-only transfer. Blocked recordings remain excluded. Rescue does not repair core static-transport passenger persistence; it provides the requested safe exit for affected bots after a restart or navigation failure.

Tests test_rescue_graph and test_rescue_executor execute production methods with native geometry/access/transfer doubles. They cover ordinary-route exclusion, recorded-only escapes, walking before transfer, map369 restriction, scope reset, blocked edges, access denial, native ACK/state cleanup, bounded retry and original goal retention. Further existing flight-planner/area/group regressions pass. Build/runtime evidence will be appended after installation.

Final complete build passed: /tmp/vcore-rescue-route-final-build3.log. Ten targeted test results: /tmp/vcore-rescue-tests.json, per-test logs /tmp/vcore-rescue-test_*.log. Shutdown requested for installation.

Installation and native verification

SQL06 applied; exact edge/point snapshot comparison passed. Installed finalbuild3 with /tmp/vcore-rescue-route-install.log. Fresh server341932 under gdb/tmux, console/tmp/vcore-tram-rescue-start-20261029.log, ready12s, ports8085/8087 verified.

Durndan58: fallback transferIF20:38:59, recorded rescue completed20:39:09, native Ironforge exit2166 at20:39:11, resumed tavern preparation. Tinkbin33: transferIF20:39:11, escapecomplete20:39:34, original route took native tram and Stormwind exit2171 at20:42:17, resumed city/group activity. Hilddis56: transferSW20:41:38, escapecomplete20:41:48, original route took actual tram SW->IF (Arrived20:43:18), native IFexit2166 at20:43:32. Renalin76 chose a walkable rescue approach (transferred=0)20:42:42; its completion remains pending. Additional automatic rescues observed for78/80/82/88/90/94. No manual relocation, forced action or altered dayplan was used. See checkpoint live-rescue.log. This verifies three actual escapes and subsequent normal travel, rather than asserting every bot or visual behavior was accepted. Static tram passenger persistence is still a separate core limitation.