Get a bot out of the world when it embeds in it - #262
Conversation
A bot whose origin is inside solid cannot walkmove in any direction, so it stands still until the match ends with no hold flag set to explain it. #257 caught one on dm2: Joe Rogan for 45 s at '2556 -414 24', reading SOLID in hull 0 at origin and eye height while every bot moving normally in the same edict dumps read EMPTY at both. pointcontents reads hull 0, which is the test that separated him from the walkers, so it is the detector. Recovery follows the catchup warp's pattern: fog at both ends, setorigin, zero velocity, clear the route state. THE DESTINATION IS A NAV NODE, because navgen seats those at hull 1 standable origins, so a node is by construction a place a player fits. Nearest by DISTANCE ONLY, deliberately not Argus_NearestNode: that prefers nodes it can see, and a traceline which STARTS in solid returns fraction 1, so from in here every node on the map looks visible and it could hand back one across the level. THE FIRST CUT WAS WRONG AND THE LADDER CAUGHT IT. Contents plus a low instantaneous speed is not evidence of being stuck: dm4 teleported Romero 192 units down into the pit while he was running the walkway at 320 u/s, because a bot clips a thin edge for one tick and reads solid, and velocity at an apex means nothing. Being inside solid AND NOT HAVING MOVED is the real signature, since an embedded bot never gets out on its own. Now three seconds inside solid without displacing 32 units. VERIFIED RECOVERY, dm4: t 32.7 609 -139 -93 spd 325 EMPTY running t 33.3 574 -18 -296 spd 0 SOLID fell in, embedded t 33.8..36.1 identical position, motionless, inside solid t 36.3 unstick fires t 36.6 623 10 -296 spd 30 EMPTY out t 37.2 534 116 -296 spd 306 EMPTY running normally Three seconds instead of the rest of the match. Zero false positives across five tapes after the guard, against one in two tapes before it. Parity elsewhere. dm2 cells 102, 115, 122 against a control of 129, 71, 118; dm4 cells 72 and 74 with stalls 11 and 20 against 17. Logs a plain ARGUS <name> unstick <pos> line, beside shove and routecache adopt, because the ARGEVT verb set is closed. HONEST LIMITS. The dm2 arm logged no firings at all, so the long freezes missing there are variance and not this. The one 27.3 s dm2 freeze that did occur is the other #257 signature, a bot in open space with no goal and a stale ar_pending, which this does not touch. And pointcontents cannot see a hull 1 wedge, where the world is empty but the player box does not fit. Refs #257 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A stochastic freeze will not sit still for a single dump. --repeat N writes N dumps that far apart, and --dump N reads whichever one landed inside the window. That is what caught #257: four dumps at 45 s intervals across two dm2 runs put a dump inside three separate freezes, two of them long enough to matter. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f7dc34c7df
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| self.ar_node = world; | ||
| self.ar_pending = 0; | ||
| self.ar_mode = 0; |
There was a problem hiding this comment.
Rebuild routing from the recovery node
When an embedded bot has a normal valid item goal, this preserves ar_goal but clears both its node and pending route request. The later Argus_AI fallback treats mode 0 as direct seeking, so the rescued bot immediately beelines toward the goal through walls or hazards instead of routing from best; moreover, an existing an_busy search for this bot can subsequently install its pre-warp start node because the goal did not change. Cancel any in-flight search and re-arm routing after the teleport so recovery actually starts at the destination node.
Useful? React with 👍 / 👎.
| if which is None or which >= len(starts): | ||
| which = len(starts) - 1 | ||
| end = starts[which + 1] if which + 1 < len(starts) else len(text) | ||
| body = text[starts[which]:end] |
There was a problem hiding this comment.
Reject dump indexes outside the available range
When --dump is greater than the last index, this silently substitutes the final dump while the CLI still reports that it read the requested nonexistent index (for example, two dumps plus --dump 2 prints reading #2 but returns dump 1). Negative indexes are also accepted and can produce an empty reversed slice and a misleading no edicts dump error. Validate the requested zero-based index and fail explicitly instead of returning data from a different dump.
Useful? React with 👍 / 👎.
A bot whose origin is inside solid cannot
walkmovein any direction, so it stands still until the match ends with no hold flag set to explain it. #257 caught one on dm2: Joe Rogan for 45 s at2556 -414 24, reading SOLID in hull 0 at origin and eye height while every bot moving normally in the same edict dumps read EMPTY at both.Detection and recovery
pointcontentsreads hull 0, which is the test that separated him from the walkers, so it is the detector. Recovery follows the catchup warp's pattern: fog at both ends,setorigin, zero velocity, clear the route state.The destination is a nav node, because navgen seats those at hull 1 standable origins, so a node is by construction a place a player fits. Nearest by distance only, deliberately not
Argus_NearestNode: that prefers nodes it can see, and a traceline which starts in solid returns fraction 1, so from in here every node on the map looks visible and it could hand back one across the level.The first cut was wrong and the ladder caught it
Contents plus a low instantaneous speed is not evidence of being stuck. dm4 teleported Romero 192 units down into the pit while he was running the walkway at 320 u/s, because a bot clips a thin edge for one tick and reads solid, and velocity at an apex means nothing.
Being inside solid and not having moved is the real signature, since an embedded bot never gets out on its own. Now three seconds inside solid without displacing 32 units.
Verified recovery, dm4
Three seconds instead of the rest of the match. Zero false positives across five tapes after the guard, against one in two tapes before it.
Parity
Logs a plain
ARGUS <name> unstick <pos>line, besideshoveandroutecache adopt, because the ARGEVT verb set is closed.Honest limits
The dm2 arm logged no firings at all, so the long freezes missing there are variance and not this. The one 27.3 s dm2 freeze that did occur is the other #257 signature, a bot in open space with no goal and a stale
ar_pending, which this does not touch. Andpointcontentscannot see a hull 1 wedge, where the world is empty but the player box does not fit.Also here
--repeat Nand--dump Nforargus_edicts.py. A stochastic freeze will not sit still for a single dump; four dumps at 45 s intervals across two dm2 runs put one inside three separate freezes, which is how #257 was diagnosed at all.Refs #257
🤖 Generated with Claude Code