Paper · 2026-07-28 · cs.RO
Embodied Agents Take Control: Minimal-Interface Zero-Shot Agents Rival Industrial-Scale Policies in Vision-and-Language Navigation
Coding-agent harnesses do zero-shot R2R-CE navigation with a monocular RGB camera, four primitives (forward, two turns, STOP) and no map, memory or trained policy. Replicated default-effort opus-5 runs average 70.7% SR (sd 3.5); fable-5 at max effort reaches 78%. An optional trained waypoint tool gives 76.7% in about half the steps of max-effort primitives. Author-reported, 100 episodes.
LLM agentTool useBenchmark validityvision-and-language-navigationzero-shot-navigationagentic-controlcoding-agent-harnessembodied-agents
arXivPDFCodeMarkdown17 min read
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Picture giving a robot a sentence such as "walk down the hall, turn left at the kitchen and stop by the sofa", and then asking it to find the route using only what its camera shows. The usual ways to build this either train a dedicated navigation model, or put a language model inside a fixed set of helper steps written by people.
This paper asks a simpler question: can a general-purpose AI coding agent run the whole loop by itself? The agent gets a camera, four moves (forward, turn left, turn right, stop) and the instruction. It decides when to look, when to move and when to stop. It has no map, no navigation memory and no planner of its own, and the program around it does not decide the order of actions.
On 100 test routes in photorealistic 3D building scans, the authors report success rates from about 68 to 78 percent. An optional tool that proposes nearby waypoints raised the success rate further and used fewer simulator steps per episode. The paper is clear about the weak spots: the agent often stops confidently in the wrong place, and its context grows so much on long routes that episodes become slow and costly.
TL;DR
- Zero-shot vision-and-language navigation on R2R-CE with three coding-agent harnesses (Claude Agent SDK, mini-swe-agent, Codex CLI), a monocular 512x512 RGB view and four discrete actions, with no navigation-specific training, map, search or memory §1 §3.1 app. A.
- Replicated default-effort opus-5 runs (Claude Agent SDK): 70.7 ± 3.5 SR; fable-5 at max effort: 78 SR §4.2 tab. 2.
- The model choice produces the widest spread (5 to 72 SR across models); harness gaps are 1.7 to 7.3 SR and treated as descriptive §4.3.
- An optional waypoint tool alongside primitives reaches 76.7 ± 0.6 SR at default effort, with about half the environment steps of max-effort primitives §4.4 tab. 5.
- All numbers are author-reported on n = 100 with mostly single runs; the code is MIT-licensed on GitHub.
Problem
Trained navigation policies need large in-domain data, and zero-shot systems usually fix the control flow in code: a planner calls a controller, or a workflow decides when to observe §1 §2.1. The authors ask whether the model can take over the interaction loop itself (when to observe, act, recover and stop), so that reasoning and action stay aligned without a handoff §1. The setting is zero-shot R2R-CE, where a text instruction must be followed to an endpoint and a STOP must be issued within 3 m of the goal app. A.
Method
Agentic embodied control. The reasoning model directly chooses every tool call. The harness only delivers the prompt, runs the tool calls, returns the results and keeps the session. Nothing navigation-specific sits between the model and the environment §3.1. Each episode starts a fresh session, and no state is carried across episodes §3.1 app. A.
Minimal interface. Two tools only §3.2 app. A:
observe()returns one 512 x 512 egocentric RGB frame with a 90° horizontal field of view. It advances nothing.step(actions)runs up to 50 primitives in order: 0 = STOP (ends the episode), 1 = forward 0.25 m, 2 = turn left 15°, 3 = turn right 15°. The result reports how many primitives ran and the remaining budget, but no image and no collision signal §3.2 app. A.
The agent gets no pose, odometry, depth, panorama, map, waypoint or privileged simulator state. The model has to infer landmarks, progress and the stopping point from its own observation history §3.2.
Briefing. One fixed system prompt, identical across harnesses, describes the robot, the tools, the task instruction, the 500-step budget and the success rule. The first user message is fixed at "Begin navigating. Call observe() first to see where you are." app. A
Harnesses §4.3 app. A:
- Claude Agent SDK (closed, v0.2.110): subscription authentication, the briefing replaces the system prompt, built-in tools disabled, only the bridge exposed through MCP, hard cap of 200 turns.
- mini-swe-agent (open, v2.4.5): a plain ReAct loop with no context management. The full history, including every image, is re-sent on every call. Model calls go through LiteLLM.
- Codex CLI (closed, v0.142.0 to 0.145.0): ChatGPT-subscription authentication and a read-only sandbox. It exposes no LLM-call cap, so it is bounded only by the action budget and the timeout.
Success and measurement. Success requires the agent to issue STOP on its own while within 3 m of the goal, measured as geodesic distance. An episode that runs out of budget without stopping scores zero. SR, SPL, NE and OSR are computed by the driver after the session ends, and the agent cannot see its own score app. A.
Episode loop (as implemented in the paper's setup).
# Minimal-interface episode [§3.1] [§3.2] [app. A]
# Input: instruction (str)
# Output: success (bool), scored after the session ends
def run_episode(instruction, agent, env):
# Fresh session, nothing carried over from other episodes [§3.1]
session = agent.new_session(briefing(instruction, budget=500))
# Hard cap of 200 model turns per episode [app. A]
for turn in range(200):
# The model chooses every call; the harness only runs it [§3.1]
call = session.next_call()
if call.tool == "observe":
# Pure read: one 512x512 RGB frame, 90 deg hfov [§3.2] [app. A]
session.reply(env.render_rgb(width=512, hfov_deg=90))
else:
# Up to 50 primitives, executed in order [§3.2] [app. A]
# 0 STOP, 1 forward 0.25 m, 2 left 15 deg, 3 right 15 deg
result = env.run_primitives(call.actions)
session.reply(result.counts_and_budget)
# Stop at the 500-step budget or when the agent issues STOP [app. A]
if env.steps_taken >= 500 or session.stopped:
break
# Success needs the agent's own STOP within 3 m of the goal [app. A]
return session.stopped and env.distance_to_goal() <= 3.0Optional waypoint interface (hybrid). The primitives stay available, and a trained waypoint module is added as three tools §4.4 app. A:
observe_waypoints()renders a 12-view RGB-D panorama, passes it to a trained candidate-waypoint predictor, and returns a four-view strip (Left, Front, Right, Back) with up to five numbered candidates, plus text listing each candidate's direction and distance.goto(k)turns toward candidate k and walks to it with forward primitives. Each goto consumes simulator steps from the shared 500-step budget, and at most 30 goto calls are allowed per episode. The 30th ends the episode.stop()ends the episode.
Moving makes the candidate numbering stale, so the agent must look again before its next goto app. A. The waypoint predictor is a trained navigation module, so these cells are not zero-shot in the strict sense app. A.
Waypoint-only arm (for the interface ablation). The waypoint tools replace the primitives. The observation becomes the four-view strip rather than a single front view, so the deltas measure the combined change app. A §4.3.
Reasoning effort. Each model runs at its vendor default effort. The effort ablation changes only the vendor-defined effort label for a fixed model and harness §4.3 app. A.
Repetitions. Each default-effort Claude SDK cell was run three times and reported as mean and sample standard deviation. Most other cells are single runs, and the paper treats differences of only a few points as descriptive §4.1.
Hyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| Benchmark | R2R-CE val-unseen, fixed 100-episode sample rand100 (episodes 0 to 99) | §4.1 app. A std_mip_r2r_minimal.yaml | Sample shared with Open-Nav, SmartWay and AgenticNav app. A |
| Simulator | Habitat-Sim 0.1.7 on Matterport3D scans, R2R-CE v1-3 episode definitions | app. A | Spawn heading and precomputed instruction-token fields differ from the release app. A |
| Success radius | 3 m geodesic, STOP issued by the agent | app. A | Scoring lives in the EmbodiedScore-envs submodule, which is empty in the cloned tree; not checked in code |
| Render resolution | 512 x 512 RGB | §3.2 app. A std_mip_r2r_minimal.yaml | |
| Horizontal FOV | 90° | app. A | |
| Camera tilt | none | std_mip_r2r_minimal.yaml | "no camera tilt" in code comment |
| Forward step | 0.25 m | §3.2 app. A | |
| Turn step | 15° left or right | §3.2 app. A | |
| Action ids | 0 STOP, 1 FORWARD, 2 LEFT, 3 RIGHT | app. A view.py | Table also lists 4 LOOK_UP and 5 LOOK_DOWN, unused here |
| Max primitives per step() call | 50 | app. A view.py | |
| Step budget | 500 simulator steps | §3.2 app. A std_mip_r2r_minimal.yaml | Shared by step() and goto() in the hybrid |
| Turn cap | 200 model calls per episode | app. A std_mip_r2r_minimal.yaml claude_sdk.py | Hard on two harnesses; Codex has no call cap app. A |
| Episode timeout | 2400 s; driver kill at +600 s | app. A std_mip_r2r_minimal.yaml | Timeouts count as failures in SR, SPL and OSR app. A |
| Claude effort (default) | Paper: no effort parameter sent, "resolves to high" | app. A cc.yaml claude_sdk.py | Code: nothing is sent; the CLI's per-model default applies. See Paper vs code |
| Claude thinking | adaptive, summarized, for Claude 4.6+ and 5 | app. A claude_sdk.py | Paper: extended reasoning on everywhere, never varied |
| GPT effort (default) | medium; low on Codex gpt-5.6 | app. A | Effort labels are vendor-defined and not comparable across vendors app. A |
| Claude effort (max) | max, for the effort ablation | tab. 3 §4.3 | Claude SDK only |
| Repetitions | 3 runs per default Claude SDK cell | §4.1 tab. 2 | Sample standard deviation |
| Waypoint candidates | up to 5 numbered circles per look | §4.3 app. A | |
| Panorama views | 12 RGB-D views | app. A panorama.py | |
| Waypoint strip tile | 384 px per tile | app. A std_mip_r2r_hybrid.yaml | |
| Waypoint moves per episode | 30 goto calls; 30th ends episode | app. A std_mip_r2r_hybrid.yaml goto.py | Move warning starts at 3 remaining panorama.py |
| Waypoint predictor | smartway_waypoint__predict (RGB-D architecture, RGB branch zeroed) | app. A std_mip_r2r_hybrid.yaml | Predictor service is not in this repository |
| Model ids | fable-5 = claude-fable-5; opus-5 = claude-opus-5; opus-4.8 = claude-opus-4-8; sonnet-5 = claude-sonnet-5 | models.yaml | GPT rows use Codex slugs, e.g. gpt-5.6-sol app. A |
| Harness versions | Claude Agent SDK v0.2.110; mini-swe-agent v2.4.5; Codex CLI v0.142.0 to 0.145.0 | app. A | Codex version moved during the campaign app. A |
Results
All results are author-reported. Setup: R2R-CE rand100 (100 episodes), model and harness as named, baseline as named. Rows marked with an asterisk are the mean of three runs tab. 1 tab. 2.
Headline comparison tab. 1. External rows come from other papers and are not directly comparable: they use different models, serving paths and sometimes the full val-unseen split.
| System | Control | Source | Visual | Navigation machinery | SR | SPL |
|---|---|---|---|---|---|---|
| Human (one tester, same board and interface) | -- | -- | -- | -- | 94 | 80.80 |
| NaVid | policy | trained | M | explicit video memory | 37 | 35.00 |
| NaVILA | policy | trained | M | VLA + RL gait | 54 | 49.00 |
| StreamVLN | policy | trained | M | slow-fast cache | 57 | 51.90 |
| Hy-Embodied-VLM (A3B) | policy | trained | M | frame-history context | 58 | 54.20 |
| RynnBrain-Nav (8B) | policy | trained | M | multi-turn dialogue memory | 59 | 49.60 |
| NavFoM | policy | trained | P | TVI tokens, budget sampling | 62 | 55.30 |
| OmniNav | policy | trained | M | flow-matching head | 70 | 66.10 |
| Qwen-RobotNav (w/o its planner) | policy | trained | P | waypoint head, task-adaptive encoding | 72 | 66.60 |
| SmartWay (GPT-5.5) | workflow | zero-shot | P+D | explicit memory, waypoint, backtracking | 44 | 35.04 |
| Vesta | workflow | trained | M | planner + external controller | 56 | 50.80 |
| InternVLA-N1 / DualVLN | workflow | trained | M | dual-system, diffusion | 64 | 58.50 |
| ABot-N1 | workflow | trained | 3-cam | dual-brain, pixel goal | 71 | 67.50 |
| AgenticNav (GPT-5.5) | agentic | zero-shot | P+D | map, explicit memory, action tools | 55 | 48.41 |
| Minimal (fable-5, mini-swe-agent) | agentic | zero-shot | M | none | 72 | 59.08 |
| Minimal (fable-5, Claude Agent SDK) | agentic | zero-shot | M | none | 68.3* | 58.02 |
| Minimal (opus-5, Claude Agent SDK) | agentic | zero-shot | M | none | 70.7* | 55.21 |
| Minimal (fable-5, Claude Agent SDK, max effort) | agentic | zero-shot | M | none | 78 | 65.27 |
Visual input: M = monocular, P = panorama, D = depth. tab. 1
Full main board tab. 2. Harness and model, then SR, SPL, NE (navigation error, m) and OSR (oracle success rate). Lower NE is better.
| Harness | Model | SR | SPL | NE | OSR |
|---|---|---|---|---|---|
| mini-swe-agent | qwen3.5-4b | 5 | 4.58 | 8.93 | 11 |
| mini-swe-agent | qwen3.5-9b | 7 | 5.36 | 8.63 | 15 |
| mini-swe-agent | qwen3.5-plus | 34 | 26.74 | 6.32 | 48 |
| mini-swe-agent | qwen3.7-plus | 42 | 32.85 | 6.81 | 55 |
| mini-swe-agent | qwen3.6-plus | 45 | 33.27 | 6.25 | 57 |
| mini-swe-agent | gpt-5.5 | 52 | 44.24 | 7.29 | 57 |
| mini-swe-agent | gpt-5.6 | 60 | 42.04 | 4.99 | 68 |
| mini-swe-agent | sonnet-5 | 53 | 38.14 | 5.52 | 61 |
| mini-swe-agent | opus-4.8 | 63 | 52.77 | 4.21 | 65 |
| mini-swe-agent | fable-5 | 72 | 59.08 | 4.48 | 77 |
| mini-swe-agent | opus-5 | 69 | 50.24 | 5.15 | 78 |
| Claude SDK | sonnet-5 | 51.3 ± 1.2* | 37.84 ± 0.89 | 5.80 ± 0.43 | 61.3 ± 1.2 |
| Claude SDK | opus-4.8 | 55.7 ± 2.3* | 47.31 ± 3.81 | 5.24 ± 0.44 | 59.3 ± 0.6 |
| Claude SDK | fable-5 | 68.3 ± 1.5* | 58.02 ± 1.50 | 5.13 ± 0.26 | 73.3 ± 1.5 |
| Claude SDK | opus-5 | 70.7 ± 3.5* | 55.21 ± 2.73 | 4.79 ± 0.43 | 78.3 ± 5.7 |
| Codex CLI | gpt-5.5 | 45 | 35.74 | 5.66 | 51 |
| Codex CLI | gpt-5.6 | 56 | 41.57 | 6.15 | 64 |
| Claude SDK | fable-5 (max effort) | 78 | 65.27 | 3.84 | 83 |
Source: tab. 2. The paper's Codex row for gpt-5.6 is served as gpt-5.6-sol on ChatGPT accounts app. A.
Reasoning effort tab. 3. Each variant is paired with its default run. Time is the per-episode mean and median in seconds.
| Model | Harness | Effort change | SR | Δ SR | Mean time (s) | Median time (s) |
|---|---|---|---|---|---|---|
| sonnet-5 | Claude SDK | default → max | 51.3 → 56 | +4.7 | 446 → 698 | 323 → 532 |
| opus-4.8 | Claude SDK | default → max | 55.7 → 56 | +0.3 | 437 → 899 | 254 → 652 |
| fable-5 | Claude SDK | default → max | 68.3 → 78 | +9.7 | 379 → 633 | 210 → 484 |
| opus-5 | Claude SDK | default → max | 70.7 → 74 | +3.3 | 332 → 553 | 228 → 429 |
| gpt-5.5 | Codex CLI | default → xhigh | 45 → 50 | +5 | -- | -- |
| gpt-5.6 | Codex CLI | default → xhigh | 56 → 62 | +6 | -- | -- |
| gpt-5.5 | mini-swe-agent | default → xhigh | 52 → 50 | -2 | -- | -- |
| gpt-5.6 | mini-swe-agent | default → xhigh | 60 → 55 | -5 | -- | -- |
The paper concludes that effort effects are model-specific rather than uniform §4.3. Full metrics appear in app. A.
Interface ablation tab. 4. Primitive versus waypoint arm, same model, harness and episodes.
| Benchmark | Model | SR primitive | SR waypoint | Δ SR | SPL primitive | SPL waypoint |
|---|---|---|---|---|---|---|
| R2R-CE | qwen3.5-4b | 5 | 43 | +38 | 4.58 | 34.18 |
| R2R-CE | qwen3.5-9b | 7 | 44 | +37 | 5.36 | 32.81 |
| R2R-CE | qwen3.5-plus | 34 | 53 | +19 | 26.74 | 44.05 |
| R2R-CE | gpt-5.5 | 45 | 67 | +22 | 35.74 | 58.85 |
| R2R-CE | gpt-5.6-sol | 56 | 73 | +17 | 41.57 | 63.98 |
| R2R-CE | sonnet-5 | 51.3* | 60 | +8.7 | 37.84 | 45.83 |
| R2R-CE | opus-4.8 | 55.7* | 65 | +9.3 | 47.31 | 54.23 |
| R2R-CE | fable-5 | 68.3* | 69 | +0.7 | 58.02 | 59.15 |
| R2R-CE | opus-5 | 70.7* | 72 | +1.3 | 55.21 | 60.52 |
| VLNVerse | sonnet-5 | 78 | 72 | -6 | 52.06 | 22.86 |
| VLNVerse | fable-5 | 84 | 80 | -4 | 62.47 | 42.57 |
On VLNVerse the collision rate rose from 6 to 35 for sonnet-5 and from 7 to 27 for fable-5 §4.3. Only the R2R-CE rows with an asterisk are replicated means; the rest are single runs.
Hybrid interface tab. 5. fable-5, Claude SDK, R2R-CE. Steps, time and calls are per-episode medians.
| Interface | Effort | SR | SPL | NE | Steps | Time (s) | Calls |
|---|---|---|---|---|---|---|---|
| primitives | default | 68.3* | 58.02 ± 1.50 | 5.13 ± 0.26 | 87 | 210 | 39 |
| waypoint | default | 69 | 59.15 | 4.30 | 38 | 91 | 15 |
| hybrid | default | 76.7* | 63.63 ± 1.67 | 3.49 ± 0.23 | 48 | 112 | 20 |
| primitives | max | 78 | 65.27 | 3.84 | 97 | 484 | 48 |
Asterisked SR values are means over three runs, and the ± values are sample standard deviations where the paper gives them tab. 5. The agent in the hybrid arm used waypoints early to cover distance and primitives near the target, with about eight waypoint moves and five to six primitive bursts per episode §4.4.
Long horizon tab. 6. Matched fable-5 Claude SDK runs at default effort, n = 100 English episodes each. Time and context are per-episode medians (seconds, and final-call input tokens).
| Interface | R2R-CE SR | R2R-CE time (s) | R2R-CE ctx | RxR-CE SR | RxR-CE time (s) | RxR-CE ctx |
|---|---|---|---|---|---|---|
| primitives | 70 | 187 | 22.4k | 26 | 527 | 49.2k |
| waypoint | 69 | 91 | 14.6k | 39 | 336 | 44.2k |
Across the R2R-CE bare cells, the final-turn context has a median of 33k tokens and a maximum of 169k. Logged episodes (4,700 in total) take a median of 206 s of wall time, and 18.6% of them exceed ten minutes §4.5.
Failure taxonomy tab. 7. The 30 failures of the strongest of three fable-5 default runs (SR 70). d_goal is the median final goal distance in metres.
| Category | n | Median d_goal (m) | Entered 3 m zone | Claimed success |
|---|---|---|---|---|
| A wrong referent / branch | 12 | 17.3 | 1 | 10 |
| B stop decision | 7 | 4.9 | 2 | 7 |
| C runaway search | 8 | 18.6 | 2 | 4 |
| D geometry / simulator | 3 | 5.5 | 0 | 2 |
Of the 30 failures, 26 end in a voluntary STOP, and 23 claim success while the final distance is 3.1 to 34.1 m. Only 5 of 30 trajectories enter the 3 m success region at any point. In at least 15 episodes the reasoning states the correct doubt and still commits to the wrong endpoint §4.6.
Other benchmarks app. B. The same frozen loop, unchanged, reaches 84 SR on VLNVerse fine-grained instructions (n = 100 subset) and 76.2% answer accuracy on the full 500-question HM-EQA set (median 185 s per question). The paper's comparison values are 63.75 for Qwen-RobotNav on VLNVerse and 76.7 for its deployed agentic system on HM-EQA. The paper calls both comparisons contextual.
Physical robot §4.7. A Unitree Go2 quadruped ran the same minimal agent in an office building across 31 exploratory episodes. The paper does not report a success rate because the robot gives no ground-truth pose or success label. Its finding is that reasoning transferred while body awareness and persistent spatial memory did not.
Paper vs code
Checked against the official repository jianzhou0420/MIP at code_commit
2ebeea8f5478b03197de35418b3aa6cf02e8acbc (MIT, copyright Jian Zhou, 2026). The
paper links this repository in its abstract block. Discrepancies and
unverified points:
- Default effort. The paper says the Claude runs send no effort parameter,
"which resolves to high" app. A. The code does send nothing when the seat
word is
default; the effort then falls to the CLI's own per-model default cc.yaml claude_sdk.py. The code's comment says the CLI's per-model table is sent asoutput_config.effort. The "high" value is therefore set by the CLI, not by this repository, and could not be confirmed here. - Thinking. The code uses adaptive thinking with summarized output for Claude 4.6+ and 5 models, and a fixed budget only when one is set explicitly claude_sdk.py. The paper says only that extended reasoning is on. Adaptive thinking means the model chooses how much it spends, so budgets cannot be compared across runs without the vendor defaults.
- Turn-budget warnings. The code can tell the agent how many tool calls
remain and warns when fewer than 20 remain, saying that ending without a STOP
scores zero view.py. Under
bare: true, which all reported minimal and hybrid configs set, the budget broadcast is off episode.py std_mip_r2r_minimal.yaml. The paper does not mention these warnings, and the agent in reported runs did not get them. The move warning in the hybrid is separate and is on panorama.py. - Simulator version. The paper names Habitat-Sim 0.1.7 app. A. The install notes for the env server specify habitat-sim 0.3.3 INSTALL.md. Results may depend on which version ran.
- Waypoint RGB branch. The paper says the predictor's RGB branch is unwired and zeroed, so prediction is depth-driven app. A. The repository sends the panorama's RGB bytes to the predictor along with depth panorama.py. The zeroing would happen in the predictor service, which is not in this repository, so it is unverified.
- Success check and scene split. The 3 m success test and the rand100 split files are in the EmbodiedScore-envs submodule. The submodule directory is empty in the cloned tree, so the success radius was checked only against the paper and the configs.
- Waypoint predictor. The predictor (
smartway_waypoint__predict) is called over HTTP athttp://127.0.0.1:9210std_mip_r2r_hybrid.yaml std_mip_r2r_hybrid.yaml, and its implementation is not in this repository. - Consistent items. The 200-turn cap, 500-step budget, 2400 s timeout, 512 px render, the 30-goto cap and the 384 px strip tiles match the paper std_mip_r2r_minimal.yaml std_mip_r2r_hybrid.yaml. The briefing rule about alternating observation and steps matches the shared fragment text standard.yaml.
Pitfalls
- Few replicated cells. Only the default-effort Claude SDK cells have three runs. The sample standard deviations there run from 1.2 to 3.5 SR points, so the paper treats differences of a few points as noise §4.1. Most conclusions in the ablations rest on single runs of 100 episodes.
- Harness comparisons are not controlled. Serving paths, defaults and versions differ, and Codex CLI changed version during the campaign §4.3 app. A. The paper calls the harness comparison descriptive and says none of its conclusions rest on the GPT runs app. A.
- Effort is not comparable across vendors. Labels such as
maxandxhighare vendor-specific app. A. Fix an explicit effort in your own runs if you need repeatability, since the default depends on the CLI. - Context grows without bound in two harnesses. mini-swe-agent and the Claude Agent SDK re-send the full history with every image on every call. The SDK's backstop is automatic compaction at about 167k tokens, which replaces images with a placeholder claude_sdk.py §4.5. Long routes therefore cost more per call as the episode goes on.
- Silent failure. The tool reports how many primitives ran, not what the robot did. A blocked move looks like a completed move, and the agent must infer the block from the next image §3.2 §4.6. The physical robot showed the same problem, where an under-rotation silently corrupts the heading §4.7.
- Waypoint cap. The 30th goto ends the episode, and then stop() can no longer be called. An agent that spends its moves scores zero app. A.
- The waypoint arm is not zero-shot. The predictor is trained, so the waypoint cells fall outside the zero-shot claim app. A. The hybrid result depends on that trained module.
- Forced versus optional waypoints. On R2R-CE, forced waypoints gained +17 to +38 SR for the Qwen and GPT rows. Sonnet-5 and opus-4.8 gained about 9 points, while fable-5 and opus-5 gained 0.7 to 1.3 tab. 4. On VLNVerse forcing cost 4 to 6 SR §4.3. The abstract's statement that forced waypoints "can hinder stronger ones" refers to those VLNVerse rows, which are single runs.
- Harness gap number. The text gives 1.7 to 7.3 SR for harness gaps §4.3. The figure caption gives 2 to 7 SR fig. 3. Use the text figure, which matches the table data.
- Naming. The paper writes gpt-5.6 in the board and gpt-5.6-sol in the interface table tab. 2 tab. 4. The Codex runs use the -sol variant app. A.
- Data and licence. The Matterport3D scenes and R2R-CE data are not in the repository. The README says the scene datasets are licensed separately by their owners README.md. Their licences apply to any reuse of the environment.
- Keep the minimal condition intact. The minimal condition gives the model no pose, odometry, depth or map §3.2. Adding any of them changes what the benchmark measures, so label such runs as different from the paper's.
Lineage
- Builds on: NavGPT, an early agentic zero-shot navigation system with a ReAct loop §2.1 §2.2; the ReAct organization of an agent as an observe-reason-act loop §2.2; coding-agent harnesses such as mini-swe-agent §2.2.
- Contrasts with: Voyager, which combines an LLM with a curriculum, skill library and verification loop §2.2; zero-shot systems that fix control flow in code (MapGPT, Open-Nav, SmartWay) §2.1.
- Compared against: AgenticNav (zero-shot agentic control with map, depth and memory tools) §2.2 tab. 1; Qwen-RobotNav (trained policy under an upper-level planner) §2.2 tab. 1; ABot-N1 and InternVLA-N1 / DualVLN (trained dual-system workflows) §2.1 tab. 1. The paper notes that trained systems in its comparison were trained on millions of samples and were evaluated on a different split §1.
- Superseded by: not stated.
Source and license
Adapted from “Embodied Agents Take Control: Minimal-Interface Zero-Shot Agents Rival Industrial-Scale Policies in Vision-and-Language Navigation” by Jian Zhou, Xunyi Zhao, Gengze Zhou, Zerui Li, Sihao Lin, Jiajun Liu, Qi Wu (arXiv:2607.26148), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/jianzhou0420/MIP at commit 2ebeea8f5478 (MIT). Any quoted code is shown under that license.