Repository navigation
feat(compute): multi-host compute profiles (HARN-5) - #62
Merged
Merged
Conversation
[compute.hosts.<name>] tables — one per GPU box, each with the same keys as [compute.ssh] (host, remote_dir, autostart, port, remote_port) — selected by FUSIONLAB_COMPUTE_HOST (env) or [compute] host in fusionlab.toml. The single [compute.ssh] table remains the degenerate case and still wins when no host is selected; a lone profile is unambiguous; several profiles without a selector or a selector naming an unknown host fail loudly (get_provider's contract), never by silently picking a box. FUSIONLAB_SSH_* env overrides still beat the selected profile. Zero-config default behavior is unchanged. Closes #43. Co-authored-by: Tapan Ganatma Nakkina <[email protected]>
Two profiles resolve to distinct option sets; env beats the selected profile; [compute] host selects and FUSIONLAB_COMPUTE_HOST beats it; a lone profile needs no selector; unknown hosts and ambiguous selections fail loudly (also through get_provider); the legacy table still resolves alone and wins without a selector. The example-config posture test now covers every [compute.hosts.*] profile too; the five pre-HARN-5 tests are unchanged and pass, pinning the zero-config default. Co-authored-by: Tapan Ganatma Nakkina <[email protected]>
obvious-autobuild Bot
added a commit
that referenced
this pull request
Oct 12, 2026
Task-mode IA: Replay / Compare / Explore workspaces behind one hash grammar; shared shot-load state machine; anchored what-if as a Replay drawer; command palette; catalog absorbed into Compare with MJ units and catalog naming; a11y tokens; integrated main (#61 #62 #64) + post-audit fixes (CSV-export error surfacing 02c16c3, mobile compare-bar wrap 73b4048). V1-V10 sweep PASS at 73b4048; V8 capability parity PASS (72 controls, art_A29dHIEm). Co-authored-by: Tapan Ganatma Nakkina <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Exactly one GPU box is nameable: the config speaks through a single
[compute.ssh]table, so two lab machines cannot coexist in onefusionlab.toml, and the shared 8420/8420 defaults invite tunnel-port collisions between two FusionLab instances on the same laptop. (#43, HARN-5)What
[compute.hosts.<name>]profiles — one table per GPU box, each carrying the same keys as[compute.ssh](host,remote_dir,autostart,port,remote_port;portstill renames tolocal_portforSshProvider).FUSIONLAB_COMPUTE_HOST(env) wins over a[compute] host = "<name>"key in the toml; either names a profile. With no selector: a populated[compute.ssh]table still wins unchanged (the degenerate case — existing configs keep working byte-identically), a lone profile is auto-selected (unambiguous), and several profiles without a selection are a startup error, never a quiet pick.get_provider's contract — a selector naming an unknown host raisesValueErrorlisting the known hosts, atssh_options()and end-to-end throughget_provider()(asyncssh is imported at connect time, so the error surfaces even without theremoteextra).FUSIONLAB_SSH_*overrides apply on top of whichever profile is selected (documented: leave them unset when switching hosts).{}; the five pre-existing config tests are untouched and passing.fusionlab.toml.examplegains one populated profile plus a commented second box;docs/COMPUTE.mdwalks through the two-box setup; README and.env.examplepoint at the selector.Out of scope by design: the HARN-4 dispatch plumbing (async route shells, pool) is untouched — this is config resolution and provider selection only.
How to Review
fusionlab/compute/__init__.py— the entire code change: a new pure_ssh_table()(selection + loud errors) feeding the existingssh_options()env merge. No provider construction, no dispatch, no worker changes.tests/test_compute_config.py— 9 new tests; the posture test now inspects every[compute.hosts.*]profile in the shipped example. The five pre-HARN-5 tests are unchanged on purpose — they are the zero-config byte-compatibility pin.Test Evidence
make test: 444 passed, 1 skipped (435 baseline + 9 new);uv run ruff checkanduv run mypy fusionlabclean; the.githooks/pre-pushgate re-ran the full suite green on push.QA: backend-only config work — nothing rendered changes, so visual evidence does not apply; test evidence recorded via autobuild upload against the tested head SHA.
Human author: Tapan Ganatma Nakkina ([email protected])
Closes #43
🔗 Obvious Project · 🧵 Obvious Thread · 🔀 Obvious PR Artifact