8000 VM hosts: the node-plane baseline drops a package build's fetch (claude-code from storage.googleapis.com), and activation hangs 240 s instead of failing · Issue #3058 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

VM hosts: the node-plane baseline drops a package build's fetch (claude-code from storage.googleapis.com), and activation hangs 240 s instead of failing #3058

Open

Description

@bryan-minimal

Summary

On a VM host (macOS, min 0.7.3-rc1), min session activate of a project with claude-code in its session packages hangs until FinalizeSession RPC timed out after 240s, and the daemon is slow to answer for a while after. The cause is the node-plane baseline from T103 (minimal#2690, #2723): the VM's own traffic may reach only the registry (github.com) and the cache (cache.minimal.dev), but claude-code's build fetches Anthropic's binary from storage.googleapis.com (gominimal/pkgs packages/claude-code/build.ncl, gcs_bucket = https://storage.googleapis.com/claude-code-dist-…/claude-code-releases). Every such frame is dropped, and nothing reports the drop to the client.

Evidence (minvmd log, 2026-11-05, the activation window)

dropped a node-plane frame leaving the VM toward an address no baseline entry pinned, or toward a pinned address
at a port other than TCP 443; the node plane reaches the registry and the cache at TCP 443 on the addresses its own
lookups resolved them to   destination=142.251.45.155 port=443 source=100.64.255.253 rule_matched=egress-node-plane-unpinned

14 such drops (Google addresses 34.153.x, 104.154.x, 142.250.x, 142.251.x, 74.125.x), next to the baseline's own pins: github.com (registry) and cache.minimal.dev (cache), nothing else. The client:

error: FinalizeSession RPC failed: minimald-v1-FinalizeSession RPC timed out after 240s
warning: could not remove the unfinished session ...: the daemon did not answer within 10s

Repro: min init --yes && min add --session claude-code && min session activate . -n x on a VM host.

Why the baseline misses it

T103's premise is "the node plane reaches the registry and the cache Minimal downloads from, and nothing else". That holds for cache hits. A package that is not in the cache (a fresh pkgs bump; claude-code moves almost daily, 2.1.316 → .317 → .318 on 11-02/03/05), or one whose artifact is never cached, is built in the VM, and its build's fetch inputs go to whatever host the package names. Any package built locally with a fetch outside github.com hits this, claude-code is just the one everyone uses.

What would fix it (in order of urgency)

  1. Fail fast instead of hanging. When the gate drops a node-plane frame while a session is materializing, the materialize step should fail with the host it could not reach, and the activation should say so ("package claude-code: its build fetches storage.googleapis.com, which this VM's node plane does not reach") instead of a 240 s RPC timeout.
  2. Let a build reach the hosts its own fetch inputs declare. The fetch inputs are content-addressed (url + sha256 in the build spec), so the integrity is in the hash, not the host. A third baseline entry kind, "declared fetch", pinned from the node's own lookup of exactly the hosts in the closure being materialized, for the duration of that materialization, keeps the node plane bounded and auditable (one log line per entry, as for the registry and the cache). Alternatively, route every fetch through the cache as a pull-through by url + sha256, so the node plane stays registry + cache only; that also makes daily bumps like claude-code's a cache hit for everyone after the first.
  3. Make sure fast-moving packages are cache hits. If claude-code's artifact may be cached, building each pkgs bump into cache.minimal.dev before it lands on main avoids the local build for everyone. (If its license forbids redistribution, only 2 covers it.)

Related: minimal#2690 (T103), #2723, #2820 (T108); inbox#1096 (RPCs stop answering during an activation's package work).

Activity

  1. msample commented on Nov 6, 2026

    @msample
    Member

    The owner ruling on gominimal/arch#167 (https://github.com/gominimal/arch/issues/167#issuecomment-6695894260) answers fix 2 above. A "declared fetch" entry in the node-plane baseline is ruled out (rule 1). Instead, a package build for a box runs in a build box, and the host side gives that build box its egress (rules 2 to 4). For fix 1, rule 11 says that a refused fetch fails immediately and names the host and the allow_dns_hosts entry that lets the box reach it. Fix 3 is unchanged. A non-redistributable package such as claude-code still builds locally, in a build box.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      0