Nanobot
Nanobot tightens redirects, fallbacks and child-process evidence
Nanobot proposes validating Slack file downloads across redirects, applying provider fallback policy to raised errors, and flushing background child output into logs. Together they move failure handling from optimistic adapter behavior toward inspectable runtime contracts.
HKUDS/nanobot PR #5414 is the inspected primary source: “fix(slack): validate file downloads across redirects.” The related records below were inspected as supporting context rather than independent confirmation.
The facts
- HKUDS/nanobot PR #5414 was created 2026-08-17T13:52:26Z and was open at inspection; its title is “fix(slack): validate file downloads across redirects.” - HKUDS/nanobot PR #5413 was created 2026-08-17T13:52:19Z and was open at inspection; its title is “fix(providers): apply fallback policy to raised errors.” - HKUDS/nanobot PR #5412 was created 2026-08-17T13:52:13Z and was open at inspection; its title is “fix(gateway): flush background child output to logs.” - The repository reported 47105 stars, 708 open issues, default branch main, and last push 2026-08-17T19:21:02Z. - The latest tagged-release baseline checked was v0.3.0 published 2026-07-25T08:08:47Z.
What changed
HKUDS/nanobot PR #5414 reports: Summary Validate Slack file downloads across the full redirect chain and keep DNS resolution aligned with the validation result. Problem Slack private download URLs are remote input and may redirect. Without the shared URL guard, a crafted or compromised URL could redirect a download toward an internal or cloud metadata address. The download also carries a bearer token, so redirect handling must remain constrained. Change Validate every request, including redirect targets, with the shared SSRF guard. Use PinnedDNSAsyncTransport for direct requests to prevent DNS rebinding between validation and connection. Preserve environment proxy support while keeping the request hook active. Rely on HTTPX cross-origin redirect handling to avoid forwarding the bearer token to a different origin. Testing uv run --no-sync pytest nanobot/channels/slack/tests/test_slack_channel.py -q — 33 passed Covered blocked targets, unsafe redirects, safe redirects, and cross-origin authorization behavior. Ruff and targeted BasedPyright — passed Scope The change is limited to Slack attachment downloads and their tests; it adds no new configuration or shared abstraction.
HKUDS/nanobot PR #5413 reports: Summary Apply the existing fallback policy when an LLM provider raises an exception instead of returning an error response. Problem The fallback loop expected provider failures to be represented by LLMResponse(finish_reason="error"). A provider exception could escape the loop entirely, so a configured fallback was never tried. This is reachable, for example, when GitHub Copilot reports that the user is not logged in during token handling. Change Convert ordinary provider exceptions into error responses with the relevant error metadata. Preserve asyncio.CancelledError so cancellation is not treated as failover. Apply the same handling to primary and fallback providers, while avoiding duplicate failover after a stream has already emitted content. Testing uv run --no-sync pytest tests/agent/test_runner_fallback.py tests/providers/test_provider_retry.py -q — 88 passed Added coverage for authentication, transient failures, cancellation, streaming, and non-fallbackable errors. Ruff and targeted BasedPyright — passed Scope This makes raised exceptions follow the existing fallback policy. It does not change provider configuration, retry limits, or the public provider API.
HKUDS/nanobot PR #5412 reports: Summary Make early output from background gateway/API processes available in their log files promptly. Problem ManagedProcessRuntime redirects background Python process output to a file. Because the file is not a TTY, Python can block-buffer stdout, so startup messages may remain in memory. If the child hangs or exits before flushing, the log can be empty and provide no useful diagnosis. I ran into this while using nanobot: a background startup failed while its log stayed empty, making the failure difficult to investigate. Change Set PYTHONUNBUFFERED=1 for background child processes. Preserve the parent environment and leave readiness and health behavior unchanged. Testing uv run --no-sync pytest tests/gateway -q — 48 passed, 2 skipped Gateway CLI tests — 28 passed Targeted BasedPyright — passed Ruff — passed Scope This only fixes output buffering at the background process boundary. It does not add a readiness probe or change the process-management contract.
Why it matters
Redirects can cross trust boundaries, fallback can hide the real error, and buffered child output can erase the evidence. These are three versions of the same operational problem. The operator test is whether the system remains bounded and its receipts still describe the action after failure, retry or restart.
Current
The primary record was open when captured on 2026-08-18. 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/5414. Supporting records are https://github.com/HKUDS/nanobot/pull/5413 and https://github.com/HKUDS/nanobot/pull/5412. 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
Revalidate every redirect target, preserve the triggering provider error through fallback, and flush child output with ownership and shutdown receipts. 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.