Repository navigation
Description
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)
- 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.
- 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.
- 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
msample commentedon Nov 6, 2026
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_hostsentry that lets the box reach it. Fix 3 is unchanged. A non-redistributable package such asclaude-codestill builds locally, in a build box.