service_compute.nu — hero_compute lifecycle module #154
Labels
No labels
prio_critical
prio_low
type_bug
type_contact
type_issue
type_lead
type_question
type_story
type_task
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
lhumina_code/hero_skills#154
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Add
service_compute.nuper the tracker in #75. Module exposesinstall | start [--reset] | stop | statusfor thehero_computestack.Scope
tools/modules/services/service_compute.nunu_serviceandnu_service_useskills.service_codescalers.nu— full-featured, supports--root. Same shape as the hero_compute manager.hero_compute(canonical layout already applied; reference repo for/hero_rust_repo_create).Service-specific notes
0.1.7+; build viacargo build --release.~/hero/bin/(perscripts/buildenv.sh::BINARIES):hero_compute,hero_compute_server,hero_compute_ui,hero_compute_explorer.hero_computeis the lifecycle manager — selfstart pattern, registers and starts the other three with hero_proc. Seehero_proc_service_selfstart.--root— KVM device access, raw networking, Mycelium overlay membership. Matchservice_mycelium.nu/service_codescalers.nufor the privileged-service shape.local(default),master(explorer hub),worker(joins a master). The repo's Makefile drives this viamake start MODE=master MASTER_IP=<ip>. Surface this in the nu module'sstartflags or document it in the start-output test plan.scripts/buildenv.sh):cloud-hypervisor(VMM backend)my_hypervisor(VM frontend)mycelium(IPv6 overlay)hero_proc(process supervisor — already required by every service)hero_compute_registryfor VM images at runtime — install step does not need to clone the registry; the running stack pulls images on demand.scripts/install.shshows the full system-deps + binaries flow you'll port into the nu module — use it as the donor for theinstallsubcommand.libssl-dev,pkg-config,iproute2,busybox-static,virtiofsd,e2fsprogs. Reuseinstallers.nu::install_basewhere possible.Acceptance criteria
use services/mod.nu *makesservice_computeavailable.--rootmode):service_compute install --rootclones the repo, installs system deps + cloud-hypervisor + my_hypervisor + mycelium, runscargo build --release, copies the four binaries to~/hero/bin/.service_compute start --rootregisters with hero_proc and becomes healthy. Thehero_computemanager handles the selfstart of_server/_ui/_explorer.service_compute status --rootreports state.service_compute stop --rootcleanly unregisters.startoutput prints sockets / UI URL / a short test plan, per thenu_service_useskill.service_compute start --root --mode masterand--mode worker --master-ip <ip>mirror the Makefile.References
nu_service,nu_service_usehero_proc_service_selfstarthero_rust_repo_create(uses hero_compute as donor)Updated scope after research on the actual repo. Hero_compute is at 0.1.7+ in the canonical layout; the four binaries (
hero_computemanager +_server,_ui,_explorer) are inscripts/buildenv.sh::BINARIES.--rootconfirmed needed for KVM and Mycelium. Multi-node modes and runtime deps (cloud-hypervisor, my_hypervisor, mycelium) added. The repo'sscripts/install.shis the donor for the install flow.Implementation Spec for Issue #154
Objective
Add
tools/modules/services/service_compute.nu— a privileged Hero-service lifecycle module for thehero_computestack — exposinginstall,start [--reset],stop,status(plusreset), modeled onservice_codescalers.nuand matching the privileged-service shape ofservice_mycelium.nu. The module registers four binaries (hero_computemanager +hero_compute_server+hero_compute_ui+hero_compute_explorer) with hero_proc, mirroring what the upstream Rust manager does internally, so existingnu_service_useworkflows (service_compute start --root --reset) work end-to-end.Requirements
tools/modules/services/service_compute.nu. No edits to existing service modules.tools/modules/services/mod.nusouse services/mod.nu *exposesservice_compute.service_codescalers.nuexactly — same constants, helper layout (svx_*), and section banners — adapted to four binaries instead of three.service_mycelium.nu:--rootis the documented default;svc_require_sudois called early; binaries are copied to/root/hero/bin/; system-package and runtime-binary install steps run via^sudo.--root(-r),--update(-u)where applicable, and--reset.startadditionally accepts--mode (local|master|worker)and--master-ip <ip>matching the upstream Makefile.services/lib.nuhelpers (svc_require_sudo,svc_require_proc,svc_install,svc_install_binary,svc_drop_registration,svc_stop_service,svc_service_status,svc_start_preflight,svc_server_timing,svc_ui_timing,svc_server_health_policy,svc_ui_health_policy,svc_service_config,svc_require_binary,svc_bins_ok,svc_sock_base,svc_bin,svc_need_sudo).tools/modules/platform.nu::pkg_ensurefor Debian package install (matchesinstallers.nu::install_basestyle).service_mycelium install --rootfor the mycelium runtime dep (already in tree).service_compute.nu, named withsvx_prefix per donor convention) for runtime-only deps not already wrapped:svx_install_system_packages— apt-get installslibssl-dev,pkg-config,iproute2,busybox-static,virtiofsd,e2fsprogs,iptables,build-essential,musl-tools,qemu-utils. (Mirrors hero_computescripts/configure.sh::install_system_packages.)svx_install_cloud_hypervisor— downloadcloud-hypervisor-staticfromhttps://github.com/cloud-hypervisor/cloud-hypervisor/releases/download/v43.0/cloud-hypervisor-staticto/usr/local/bin/cloud-hypervisor, chmod +x. Skip when already at the right version.svx_install_my_hypervisor— downloadmy_hypervisor(andmy_hypervisor-init) release artifacts fromhttps://forge.ourworld.tf/geomind_code/my_hypervisor/releases/download/v0.1.2/...to/usr/local/bin/my_hypervisorand~/.my_hypervisor/bin/my_hypervisor-init, then runmy_hypervisor kernel extract-hostif no kernel is present.svx_kvm_check— verify/dev/kvmexists; print a warning (non-fatal) if not (the hero_compute manager will fail at runtime with a clearer diagnostic).startoutput must end with the standard summary block (pernu_service_use): service state, RPC sockets, UI URL (port 9001 by default), explorer URL (port 9002), worker RPC port (9003), Mycelium IPv6 (when available), and a copy/paste test plan withproc service status,proc logs tail hero_compute_server,proc job list --service hero_compute.kill_other(socket and/or port cleanup) and at least one health check, perhero_proc_service_selfstart.cargo buildmust use--release(issue mandates) and limit to the four binaries via--binflags or--workspace --release(donor uses per-bin--binviasvc_cargo_install); passrelease: truethroughsvc_install.Files to Modify/Create
tools/modules/services/service_compute.nu— NEW. Full lifecycle module, ~450-550 lines, mirroringservice_codescalers.nu.tools/modules/services/mod.nu— MODIFY. Addexport use service_compute.nuline in alphabetical/dependency order (next toservice_codescalers.nuis fine).tools/modules/services/packages.nu— OPTIONAL MODIFY. Add aservice_computeentry toservice_install_allonly if the bundle install needs it (the issue does not mandate; can be skipped — note in PR).Implementation Plan
Step 1: Add the module file with constants and helpers (header + naming + paths)
Files:
tools/modules/services/service_compute.nu(NEW)service_codescalers.nulines 1-58 in shape) describing:--root: KVM device access, raw networking, mycelium overlay membership. Document this prominently in the docstring (same callout style asservice_mycelium.nulines 1-58).local|master|worker) and the--master-ipflag.cloud-hypervisorv43.0,my_hypervisorv0.1.2,myceliumv0.7.3,hero_proc(already managed byservice_proc).hero_compute_registry) is fetched lazily by the manager — install does NOT clone it.use ../clients/proc.nu *,use ./lib.nu *,use ../platform.nu [pkg_ensure],use ./service_mycelium.nu(for the mycelium install reuse).hero_computebinary is inSVX_BINARIES(gets installed to bin dir) but is NOT a hero_proc action — same shape ashero_codescalersin the donor where the eponymous CLI binary is a binary but not an action.--instancesupport in v1 (issue does not require it). The donor's instance-aware naming helpers (svx_svc_name,svx_sock_dir) can be simplified to constants. Keep parameter slots for future symmetry but always pass0.Dependencies: none.
Step 2: Add system-dep + runtime-binary helpers
Files:
tools/modules/services/service_compute.nudef svx_install_system_packages [] { ... }:installers.nu::install_chromeshort-circuit).["build-essential" "libssl-dev" "pkg-config" "musl-tools" "iproute2" "iptables" "busybox-static" "virtiofsd" "e2fsprogs" "qemu-utils"], callpkg_ensure $pkg(orpkg_ensure_devfor-devlibs)./usr/lib/qemu/virtiofsd → /usr/local/bin/virtiofsdif needed (matches upstreamconfigure.sh::install_system_packages).def svx_install_cloud_hypervisor [] { ... }:^cloud-hypervisor --versionand skip if it already reports the pinned version.^sudo curl -sfL <url> -o /usr/local/bin/cloud-hypervisor && ^sudo chmod +x ...where url ishttps://github.com/cloud-hypervisor/cloud-hypervisor/releases/download/v43.0/cloud-hypervisor-static.def svx_install_my_hypervisor [] { ... }:my_hypervisorandmy_hypervisor-initfrom forge releases. Use the central-config URL formhttps://forge.ourworld.tf/geomind_code/my_hypervisor/releases/download/<version>/my_hypervisor-x86_64-unknown-linux-musland the-initsuffix variant. Place the main binary at/usr/local/bin/my_hypervisor, the init binary at~/.my_hypervisor/bin/my_hypervisor-init.my_hypervisor kernel list; if empty, call^sudo my_hypervisor kernel extract-hostand warn-only on failure (matches upstreamconfigure.sh::check_kernel).^my_hypervisor doctorand print a warning summary listing anyNOT FOUNDitems.def svx_kvm_check [] { ... }:/dev/kvmis missing. Do not error out — the user may be running the install on a build host with no KVM.Dependencies: Step 1.
Step 3: Add action spec builders for the three daemon binaries
Files:
tools/modules/services/service_compute.nusvx_server_action/svx_ui_actionshape: name, script (path to binary),interpreter: "exec",is_process: true,RUST_LOG: "info", kill_other (socket + port), health check, retry policy fromsvc_server_timingorsvc_ui_timing.svx_server_action [root: bool]forhero_compute_server:(svc_bin "hero_compute_server" $root).$"($sock_base)/hero_compute/rpc.sock".svc_server_timing. Health:openrpc_socketon the rpc.sock withsvc_server_health_policy.socket: [$sock_path],port: [$SVX_WORKER_RPC_PORT](server binds the worker RPC port in master/worker mode).RUST_LOG, plus pass throughHERO_COMPUTE_MODE,HERO_COMPUTE_MASTER_IP, andMYCELIUM_IP(read from$env—startsets these before registering when--mode/--master-ipare provided).svx_ui_action [root: bool]forhero_compute_ui:(svc_bin "hero_compute_ui" $root).install.sh"Open http://${ip}:9001").port: [$SVX_UI_PORT],socket: [$"($sock_base)/hero_compute/ui.sock"].http_url: $"http://localhost:($SVX_UI_PORT)/"since the UI is a dual TCP+UDS service; fall back toopenrpc_socketif no /health is reachable yet (usesvc_ui_health_policy).svc_ui_timing(3 retries, 5s stop).svx_explorer_action [root: bool]forhero_compute_explorer:(svc_bin "hero_compute_explorer" $root).port: [$SVX_EXPLORER_PORT],socket: [$"($sock_base)/hero_compute/explorer.sock"].http_url: $"http://localhost:($SVX_EXPLORER_PORT)/"withsvc_ui_health_policy.svc_ui_timing.svx_service_config []returns(svc_service_config $SVX_SERVICE_NAME $SVX_ACTIONS $SVX_DESCRIPTION).Dependencies: Step 1.
Step 4: Implement
install(clone + system deps + runtime deps + cargo build + copy)Files:
tools/modules/services/service_compute.nuexport def install [--root(-r), --update(-u), --reset, --release].if $root { svc_require_sudo }(issue mandates--root).svx_kvm_check— warning only.svx_install_system_packages(apt + virtiofsd symlink).svx_install_cloud_hypervisor(download release binary).svx_install_my_hypervisor(download + kernel extract + doctor).service_mycelium install --root=$root --update=$update --reset=$reset(delegate; reuses existing module).svc_install $SVX_SERVICE_NAME $SVX_FORGE_LOC $SVX_BINARIES $root $update $reset $release— clones viaforge_ensure_local, runscargo build --release --bin hero_compute --bin hero_compute_server --bin hero_compute_ui --bin hero_compute_explorer, copies the four binaries to~/hero/bin/(and/root/hero/bin/when--root).release: truealways, since hero_compute's Makefile builds release-only and the runtime depends on the optimized build for VM I/O throughput. We can keep the--releaseflag exposed in case a developer wants debug, defaulting totrueinstead of donor'sfalse(minor deviation — call out in### Notes).service_compute start --root— single-node local mode.service_compute start --root --mode master— explorer hub.service_compute start --root --mode worker --master-ip <ip>— worker.Dependencies: Steps 2 + 3.
Step 5: Implement
start(preflight + register + start + summary)Files:
tools/modules/services/service_compute.nuexport def start [--reset, --root(-r), --update(-u), --mode: string = "local", --master-ip: string = ""].$mode in ["local" "master" "worker"]; if$mode == "worker"then$master_ipmust be non-empty (elseerror make).startexactly with these adaptations:if $root { svc_require_sudo }(always needed for hero_compute).svc_start_preflight $SVX_SERVICE_NAME "service_compute" $reset $update $root— early-exit if running and no--reset/--update.svc_drop_registration $SVX_SERVICE_NAME $SVX_ACTIONS $root.install --root=$root --update=$update --reset=$reset --releaseto ensure binaries.svc_require_binary "hero_compute_server" $root, same for_ui,_explorer, managerhero_compute.$env.HERO_COMPUTE_MODE = $mode,$env.HERO_COMPUTE_MASTER_IP = $master_ipbefore constructing(svx_server_action ...), OR passmode/master_ipas parameters into the action builders so the env block bakes them in. (Cleaner: extend builder signatures to[root: bool, mode: string, master_ip: string].)proc action setfor each of the three actions, thenproc service set (svx_service_config), thenproc service start $SVX_SERVICE_NAME --root=$root.sleep 3sec), then run the donor's "running? / svc_status / why blocked? / failed jobs / startup log" diagnostic block — copy fromservice_codescalers.nulines 281-346 verbatim, adjusted for the action namehero_compute_server.nu_service_userequirements):svc_mycelium_address $root(already inlib.nu) for the summary.Dependencies: Steps 3 + 4.
Step 6: Implement
stopandstatusFiles:
tools/modules/services/service_compute.nuexport def stop [--root(-r)]: thin wrapper aroundsvc_stop_service $SVX_SERVICE_NAME $SVX_ACTIONS $root(mirrors donor lines 378-383).export def status [--root(-r)]:svc_service_status $SVX_SERVICE_NAME "service_compute" $root(mirrors donor lines 393-398).Dependencies: Step 1.
Step 7: (Optional) Implement
resetFiles:
tools/modules/services/service_compute.nureset(service_codescalers.nulines 418-496) verbatim, replacinghero_codescalerswithhero_computeand the binary list. Strict additive — does NOT remove cloud-hypervisor / my_hypervisor / mycelium runtime deps (they are shared).Dependencies: Step 1.
Step 8: Wire into mod.nu
Files:
tools/modules/services/mod.nuexport use service_compute.nuline afterexport use service_codescalers.nu(line 7) souse services/mod.nu *exposesservice_compute.Dependencies: Step 1.
Step 9: Smoke test (manual, by the executing agent)
Files: none (verification only)
use services/mod.nu *from a fresh nu shell — confirmservice_compute install --helplists the flags.service_compute install --rootruns end-to-end (clone, system deps, runtime binaries, cargo build, copy, mycelium install delegation).service_compute start --root→ reads the printed summary, openshttp://<host>:9001, runsproc service status hero_compute --root.service_compute start --root --mode master→ confirms explorer is reachable on:9002.service_compute stop --root→ unregistration succeeds; sockets are gone.service_compute status --root→ reports state cleanly.Dependencies: Steps 1-8.
Acceptance Criteria
use services/mod.nu *makesservice_computeavailable (Step 8).service_compute install --rootclones the repo, installs system deps + cloud-hypervisor + my_hypervisor + mycelium, runscargo build --release, copies the four binaries to~/hero/bin/(Steps 2 + 4).service_compute start --rootregisters with hero_proc and starts the manager, server, UI, and explorer (Step 5).service_compute status --rootreports state (Step 6).service_compute stop --rootcleanly unregisters (Step 6).startoutput prints sockets / UI URL / a short test plan pernu_service_use(Step 5 final summary block).start --root --mode masterand--mode worker --master-ip <ip>mirror the upstream Makefile (Step 5 mode handling).kill_other(port + socket) and at least one health check (Step 3).--rootis documented as required in the module docstring; non-rootstarteither errors (preferred) or prints a clear warning (Step 1 docstring + Step 5 preflight).Notes
--releasedefaults to true. The donor (service_codescalers.nu) defaults--releaseto false (debug for fast iteration). hero_compute's runtime is heavily I/O-bound (cloud-hypervisor + virtiofsd) and the upstream Makefile builds release-only. Default to release; keep the flag exposed for power users.--instancesupport in v1. The donor uses an instance-numbered naming scheme. hero_compute does not support multiple instances on one host (the manager owns/dev/kvmand the mycelium TUN). Skip the helper functions and the parameter; revisit only if a real multi-instance need surfaces.service_mycelium install --rootcall insideservice_compute installis the cleanest path — it already pulls/builds/installs the binaries and leavesservice_mycelium start --rootavailable to bring the daemon up. The hero_compute manager will pick up the daemon via the standard mycelium socket. Document this in the module header.installers.nu::install_baseexists but installs a wide superset (incl. LibreOffice, ONNX, Docker). For hero_compute we want a narrow KVM-focused subset — duplicate the relevantpkg_ensurecalls insvx_install_system_packagesrather than callinginstall_base. The list (~10 packages) is short enough that duplication is cheaper than refactoringinstall_baseinto smaller pieces.^sudo curl. They go to/usr/local/bin/. The donor usessvc_install_binaryfor cargo build outputs; that helper assumes the source is local and runs through invoking-user permissions. For pre-built downloads we shell out directly with^sudo curl ...and^sudo chmod +x ...— same pattern asinstallers.nu::install_chrome(lines 230-241).hero_compute_registryclone. The issue andscripts/install.shconfirm the registry is fetched lazily by the manager binary at runtime — the install step does NOT need to clone or vendor it. Document this in the module header so future maintainers do not "fix" it.hero_computeis installed but not registered as an action. It is inSVX_BINARIESbut NOT inSVX_ACTIONS. Same shape ashero_codescalers(binaryhero_codescalersin BINARIES, not in ACTIONS — only_serverand_uiare actions). The manager is a CLI entry point, not a daemon.svc_installmay rebuild more than four binaries.svc_cargo_installinvokescargo build --binper name inSVX_BINARIES. Verify the upstream workspace does not have a binary namedhero_computeoutside the main crate that would clash — if so, fall back tocargo build --workspace --releaselike the upstream Makefile and adjustsvc_cargo_installcallers, OR add a thin wrapper helper. Defer the decision to implementation time; the four---binform is preferred and should work given the upstreamBINARIES="hero_compute hero_compute_server hero_compute_ui hero_compute_explorer"declaration.service_codescalers.nu(line 7) — alphabetical-ish order is loose but adjacency to its sibling makes diff review easy.service_computein the bulk install (service_install_all). Many hosts cannot run hero_compute (no KVM). Leave it out of the bulk installer; the user explicitly opts in viaservice_compute install --root.Test Results
This PR adds a Nushell module; there is no automated test suite that exercises the install/start/stop/status/reset lifecycle without root + KVM. The verification below is what can be run statically.
Parse check
service_compute.nuparse: okservices/mod.nu *re-export parse: okHelp-surface check
service_compute install— signature loads: okservice_compute start— signature loads: okservice_compute stop— signature loads: okservice_compute status— signature loads: okservice_compute reset— signature loads: okRuntime exercising
End-to-end install / start / stop / status verification requires:
/dev/kvmavailable)--rootprivilegeshero_computeclone + my_hypervisor release downloadThese cannot be run from the development environment. Acceptance criteria 2-7 in the spec are covered by manual smoke testing on a target host (issue spec, Step 9).
CI hooks
The existing CI workflow (
.forgejo/workflows/build.yaml) only runsbash scripts/test.sh, which validatesSKILL.mdfrontmatter under$SKILLS_DIR(claude/skills). It does not parse or load anything undertools/modules/, so a syntax regression inservice_compute.nuorservices/mod.nuwould not be caught by current CI. The repo's only other test script,scripts/test_forge_identity.nu, is unrelated (coversforge_secrets_toml_getandforge_git_ensure_identity). Recommend addingnu -c 'use ./tools/modules/services/mod.nu *'as a smoke step in a follow-up so the nu module surface is gated by CI.Implementation Summary
Files
tools/modules/services/service_compute.nu— new, 766 lines. Lifecycle module for the hero_compute four-binary stack (hero_computemanager +hero_compute_server+hero_compute_ui+hero_compute_explorer). Modeled onservice_codescalers.nu, with the privileged-service shape fromservice_mycelium.nu.tools/modules/services/mod.nu— one-line addition:export use service_compute.nuplaced afterservice_codescalers.nufor diff readability.tools/modules/services/packages.nu— intentionally NOT modified. Bulk install is opt-in only; many hosts cannot run hero_compute (no KVM).What it does
service_compute install [--root] [--update] [--reset] [--debug]— installs the host system packages (libssl-dev, pkg-config, iproute2, busybox-static, virtiofsd, e2fsprogs, iptables, build-essential, musl-tools, qemu-utils), downloads cloud-hypervisor v43.0 to/usr/local/bin/, downloads my_hypervisor v0.1.2 (main + init binaries) and runskernel extract-host+doctor, delegates the mycelium runtime install toservice_mycelium install --root, then runscargo build --releasefor the four hero_compute binaries viasvc_install. All steps are idempotent.service_compute start [--root] [--reset] [--update] [--mode <local|master|worker>] [--master-ip <ip>]— preflight, drop existing registration, ensure binaries viainstall, register the three daemon actions and the service with hero_proc, start, settle, then print a summary block (mode, master_ip, state, sockets, UI URL, explorer URL, worker RPC, mycelium IPv6, copy/paste test plan). Mode/master-ip are threaded into the per-action env (HERO_COMPUTE_MODE,HERO_COMPUTE_MASTER_IP).service_compute stop [--root]— wrapssvc_stop_service.service_compute status [--root]— wrapssvc_service_status.service_compute reset [--root]— stops everything, removes the four hero_compute binaries from the bin dir; intentionally leaves cloud-hypervisor / my_hypervisor / mycelium runtime binaries in place.Action specs
Each daemon action (
hero_compute_server,hero_compute_ui,hero_compute_explorer) carries:kill_othercovering its socket and TCP port (rpc.sock + 9003 for the server, ui.sock + 9001 for the UI, explorer.sock + 9002 for the explorer)svc_server_health_policy(RPC) orsvc_ui_health_policy(HTTP)svc_server_timing/svc_ui_timingRUST_LOG=info,...,HERO_SOCKET_DIR,HERO_COMPUTE_SOCK_NAME, mode, master_ip, mycelium IPDeviations from the spec (called out for review)
--releaseflag became--debug(inverted polarity). Nushell does not allow type annotations on switch flags, so a default-true--releaseis not expressible.--debugdefaults absent (release build) and is documented ininstall's docstring.--instancesupport omitted entirely (per spec note). hero_compute owns/dev/kvmand the mycelium TUN — multiple instances on one host is not a real use case.--debugis NOT threaded throughstart → install. A debug build requires explicitservice_compute install --debugfirst, thenservice_compute start --root.Verification
nu -c 'use ./tools/modules/services/service_compute.nu; print "parse ok"'— clean.nu -c 'use ./tools/modules/services/mod.nu *; print "mod parse ok"'— clean.help service_compute install/start/stop/status/reset— all signatures render cleanly.End-to-end verification (install → start → status → stop) requires
/dev/kvm,--root, and network access to forge.ourworld.tf + github.com. That is the manual smoke-testing scope from Step 9 of the spec.Notes for the reviewer
.forgejo/workflows/build.yaml) only runsscripts/test.sh, which checks SKILL.md frontmatter — it does NOT parse-check thetools/modules/services/*.nufiles. A regression in this module would slip past CI. Worth adding anu -c 'use ./tools/modules/services/mod.nu *'smoke step in a follow-up.hero_compute_registryruntime tree is fetched lazily by the manager binary at start time —installdoes NOT clone it. This is documented in the module's header comment.Pull request opened: #169
This PR implements the changes discussed in this issue.