Nanobot

Nanobot surfaces repeated tool loops instead of spiraling silently

Nanobot proposes an apps-discovery redesign while adding a warning for repeated identical tool calls and schema-aware decoding for nested JSON arguments. The cluster turns extension discovery and execution failure into operator-visible surfaces.

← Back to homeOriginal source ↗

HKUDS/nanobot PR #5342 is the inspected primary source: “feat(webui): redesign apps discovery.” The related records below were inspected as supporting context rather than independent confirmation.

The facts

- HKUDS/nanobot PR #5342 was created 2026-08-11T17:11:51Z and was open at inspection; its title is “feat(webui): redesign apps discovery.” - HKUDS/nanobot PR #5344 was created 2026-08-11T17:29:33Z and was open at inspection; its title is “fix(agent): warn instead of silently spiraling on repeated identical tool calls.” - HKUDS/nanobot PR #5314 was created 2026-08-10T05:21:50Z and was open at inspection; its title is “fix: decode nested JSON tool arguments by schema.” - The repository reported 46859 stars, 701 open issues, default branch main, and last push 2026-08-12T00:34:17Z. - The latest tagged-release baseline checked was v0.3.0 published 2026-07-25T08:08:47Z.

What changed

HKUDS/nanobot PR #5342 reports: Summary redesign Apps around Discover, Installed, All apps, and custom MCP setup add curated Featured batches backed by the nanobot.wiki registry with a cached offline fallback improve third-party app logos and make external logo loading an explicit appearance preference Behavior Featured shows six reviewed apps at a time and rotates deterministically with “Show another” registry failures never block Apps; the bundled list remains available offline existing CLI app and MCP install/connect flows are unchanged Testing pytest tests/cli_apps/test_discovery.py tests/cli_apps/test_service.py tests/webui/test_settings_routes.py tests/webui/test_mcp_presets_api.py -q uv run --no-sync basedpyright cd webui && bun run test --run cd webui && bun run lint cd webui && bun run build Follow-up publish registry/v1/discovery.json on nanobot.wiki (not required for fallback behavior)

HKUDS/nanobot PR #5344 reports: Problem The tool-call loop has no repeat/loop detection at all. A stuck agent can burn its entire max_iterations budget calling the exact same tool with the exact same arguments over and over, with no signal to the user or the model that it's happening -- it just looks frozen from the outside until the iteration cap finally kicks in. Ran into this directly: an agent spiraled for several minutes checking the same env var through half a dozen different mechanisms (exec, grep, reading its own session log, etc.) before eventually landing on the right answer -- no single one of those calls repeated identically enough times in a row to be an obvious "stuck" signal by iteration count alone, but a simpler variant of the same problem (identical tool + identical args, repeated) is easy to construct and easy to detect. Fix Adds a lightweight, order-independent per-turn signature tracker (tool name + arguments) to AgentRunner.run(). After 3 identical tool-call rounds in a row, it injects one system-role warning into the conversation telling the model to

HKUDS/nanobot PR #5314 reports: Fixes #5311 Some OpenAI-compatible providers return a valid top-level tool argument object but encode nested object or array fields as JSON strings. This makes otherwise valid MCP tool calls fail schema validation. What changed Decode string values into objects or arrays only when the tool schema expects that container type. Handle simple oneOf/anyOf container branches. Preserve string fields, malformed JSON, and mismatched JSON values as-is. Add regression coverage for the nested object case and JSON-looking string values. Validation uv run --no-sync pytest tests/tools/test_tool_registry.py tests/tools/test_tool_validation.py tests/providers/test_provider_tool_arguments.py tests/providers/test_litellm_kwargs.py tests/agent/test_runner_tool_execution.py -q — 208 passed uv run --no-sync ruff check nanobot/ — passed uv run --no-sync basedpyright — 0 errors, 0 warnings, 0 notes uv run --no-sync pytest -q — 5725 passed, 23 skipped; two unrelated WebUI token-usage tests currently fail in tests/webui/test_settings_api.py The change is intentionally limited to schema-guided argument coercion so existing string argument behavior remains unchanged.

Why it matters

A larger app catalog increases the chance of malformed arguments and repetitive retries. Discovery is useful only if the runtime can explain which tool was chosen and halt a loop before it spends the context window. The operator test is whether visible output, retained state and authority still describe the same event after retries, background work or restart.

Current

The primary record was open when captured on 2026-08-12. The tagged-release baseline was v0.3.0 published 2026-07-25T08:08:47Z. Repository metadata, full source bodies, current pull requests and issues, releases, Google News, Hacker News, Lobsters, Metamesh and the rendered ClawCharts row were inspected. ClawCharts selected the subject; it did not prove the claim.

Evidence

The primary URL is https://github.com/HKUDS/nanobot/pull/5342. Supporting records are https://github.com/HKUDS/nanobot/pull/5344 and https://github.com/HKUDS/nanobot/pull/5314. Source bodies, timestamps and states are preserved in the daily evidence bundle. Test counts and reproductions remain attributed to their authors unless identified as independently rerun.

Source boundary

Open work is described as open, closed work as closed, and operator reports as reports. A pull request is evidence of proposed or reviewed direction, not proof of a shipped release. Search residue, package mirrors and historically published source spines were excluded.

Operator take

Expose resolved schemas and tool identities, cap identical retries, and require a changed observation or operator decision before the same call runs again. Preserve a before-state receipt, make the smallest reversible change, and verify the original failure independently.

Caveat

Public project records are mutable. Status, scope and evidence can change after publication. This brief records the inspected state and does not authorize changes to a reader’s deployment.

Source inspected; source state, environment and release boundary remain explicit.