fix: require Frontier endpoint for CLI presets#120
Conversation
Signed-off-by: Zhongxuan Wang <daniewang@nvidia.com>
WalkthroughPreset configuration now validates required environment variables before staging or example selection. Claude and Codex declare and read the shared NVIDIA Frontier endpoint variable, with CLI tests covering missing and configured endpoint cases. ChangesPreset environment validation
Estimated code review effort: 2 (Simple) | ~10 minutes Sequence Diagram(s)sequenceDiagram
participant CLI as nemo-fabric CLI
participant Preset as Preset::config
participant Environment as Process environment
participant Plan as JSON plan
CLI->>Preset: build Claude or Codex configuration
Preset->>Environment: read NVIDIA_FRONTIER_BASE_URL
Environment-->>Preset: endpoint value or missing value
Preset-->>CLI: configuration or validation error
CLI->>Plan: emit plan with model settings
Plan-->>CLI: configured base_url
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tests/e2e/test_claude.py`:
- Around line 176-183: Update test_fabric_run_preserves_legacy_model_endpoint to
stop using monkeypatch.setenv; assign NVIDIA_API_KEY through os.environ while
relying on the suite’s autouse restore_environ_fixture for cleanup.
In `@tests/e2e/test_cli_scaffold.py`:
- Around line 161-168: Extend
test_frontier_presets_require_endpoint_before_planning to parameterize the
endpoint override with both an unset value and whitespace-only values such as "
\t". Ensure each case clears or sets NVIDIA_FRONTIER_BASE_URL before calling
plan_preset, while preserving assertions for failure, empty stdout, the preset
name, and the variable name in stderr.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Enterprise
Run ID: 20135643-2081-4832-85f6-73f54996ae8c
📒 Files selected for processing (4)
crates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rstests/e2e/test_claude.pytests/e2e/test_cli_scaffold.py
📜 Review details
⏰ Context from checks skipped due to timeout. (15)
- GitHub Check: Test (Python 3.14, windows-amd64)
- GitHub Check: Pre-commit
- GitHub Check: Test (Python 3.13, windows-amd64)
- GitHub Check: Test (Python 3.14, macos-arm64)
- GitHub Check: Test (Python 3.13, macos-arm64)
- GitHub Check: Test (Python 3.12, windows-amd64)
- GitHub Check: Test (Python 3.14, linux-amd64)
- GitHub Check: Test (Python 3.12, linux-amd64)
- GitHub Check: Test (Python 3.11, windows-amd64)
- GitHub Check: Test (Python 3.12, macos-arm64)
- GitHub Check: Test (Python 3.12, linux-arm64)
- GitHub Check: Test (Python 3.11, linux-amd64)
- GitHub Check: Test (Python 3.13, linux-amd64)
- GitHub Check: Test (Python 3.11, linux-arm64)
- GitHub Check: Test (Python 3.11, macos-arm64)
🧰 Additional context used
📓 Path-based instructions (16)
**/*.{rs,py,pyi,json,yaml,yml}
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
Determine and update every affected public surface, including the CLI, PyO3 bindings, Python SDK, type stubs, schemas, and adapter contract, so they remain in parity.
Files:
tests/e2e/test_claude.pycrates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rstests/e2e/test_cli_scaffold.py
**/*
📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)
**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.
**/*: Always spellNVIDIAin all caps; do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names withNVIDIAon first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...
Files:
tests/e2e/test_claude.pycrates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rstests/e2e/test_cli_scaffold.py
**/*.{rs,py}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For native binding changes, run
cargo check -p fabric-python --locked.
**/*.{rs,py}: Usesnake_casefor functions and variables; usePascalCasefor Rust types and Python classes.
Run tests for every affected language surface; changes to the Rust core or public schemas require both Rust and Python test suites.
Keep native Python binding declarations synchronized with their Rust implementations when public contracts change.
Files:
tests/e2e/test_claude.pycrates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rstests/e2e/test_cli_scaffold.py
**/*.{py,pyi}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
If Python code or a Python-facing adapter changes, run
just test-python.
Files:
tests/e2e/test_claude.pytests/e2e/test_cli_scaffold.py
**/*.{rs,py,pyi}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
**/*.{rs,py,pyi}: If public configuration types change, confirm schema snapshot tests injust test-rustpass and review generated schema diffs.
For schema or public contract changes, run both language suites and review changes underschemas/and generated API references.
Files:
tests/e2e/test_claude.pycrates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rstests/e2e/test_cli_scaffold.py
**/*.{py,pyi,rs}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
For Python SDK or PyO3 binding changes, use
python-tests, run focused pytest tests first, thenjust test-python; rebuild withjust build-pythonwhen native code or packaging changes.
Files:
tests/e2e/test_claude.pycrates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rstests/e2e/test_cli_scaffold.py
tests/**/*.py
📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)
tests/**/*.py: Use Pytest to run Python tests.
Do not add@pytest.mark.asyncioto tests; async tests are automatically detected and run by the async runner.
Do not add-> Nonereturn type annotations to test functions.
When mocking a class, useunittest.mock.MagicMockorunittest.mock.AsyncMock, using thespecargument when necessary, rather than defining a new class.
Prefix mocked class names withmock, notfake.
Prefer pytest fixtures over helper methods.
Do not repeat fixtures; place fixtures needed by multiple test files inconftest.py.
Define fixtures using@pytest.fixture(name="<fixture_name>"[, scope="<scope>"])and a function named<fixture_name>_fixture; specifyscopeonly when it is notfunction.
Preferpytest.mark.parametrizeover separate tests for different input types.
Use@pytest.mark.usefixtureswhen a fixture is needed but its return value is unused or it does not return a value.
Use the autouserestore_environ_fixturefromtests/conftest.pyto restore environment variables; modify variables withos.environand do not usemonkeypatch.setenv.
Avoid defensive programming in tests; access expected data directly so missing data raises a clear failure, such as usingresults["data"]instead ofresults.get("data").
Files:
tests/e2e/test_claude.pytests/e2e/test_cli_scaffold.py
**/*.{rs,py,toml}
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
When editing version helpers, verify every
nemo-fabric-*workspace package through Cargo metadata and reject a static version inpython/pyproject.toml.
Files:
tests/e2e/test_claude.pycrates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rstests/e2e/test_cli_scaffold.py
**/*.{toml,rs,py}
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
Avoid blind repository-wide replacement of version-like strings; distinguish package-version references from examples and unrelated dependency versions.
Files:
tests/e2e/test_claude.pycrates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rstests/e2e/test_cli_scaffold.py
**/*.py
📄 CodeRabbit inference engine (CONTRIBUTING.md)
**/*.py: Use type annotations for public Python APIs and keep native binding declarations synchronized with their Rust implementations.
Python files must use the specified Python#SPDX header format.
Files:
tests/e2e/test_claude.pytests/e2e/test_cli_scaffold.py
**/tests/**/*.{rs,py}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
When adding functionality, include tests in the corresponding Rust crate or relevant
tests/area.
Files:
tests/e2e/test_claude.pytests/e2e/test_cli_scaffold.py
**/*.{py,toml,lock,json,md,yml,yaml}
📄 CodeRabbit inference engine (.agents/skills/contribute-adapter/SKILL.md)
Keep package wiring, descriptors, dependencies, installation, catalogs, CI enumerations, documentation, examples, fixtures, and generated artifacts consistent with the adapter implementation.
Files:
tests/e2e/test_claude.pytests/e2e/test_cli_scaffold.py
{tests/**,python/tests/**}
⚙️ CodeRabbit configuration file
{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.
Files:
tests/e2e/test_claude.pytests/e2e/test_cli_scaffold.py
**/*.rs
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
Implement new runtime or binding behavior in the shared Rust core first.
**/*.rs: Format Rust code withcargo fmt --alland ensurecargo fmt --all -- --checkpasses.
Runcargo check --workspace --lockedwhen changing the Rust core, CLI, or native Python extension.
Rust files must use the specified Rust//SPDX header format.
Files:
crates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rs
**/*.{rs,toml}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For any Rust change, run
just test-rustandcargo fmt --all -- --check.For Rust core, CLI, or shared runtime semantic changes, run Rust formatting and tests, and add Python tests when behavior is exposed through the SDK.
Files:
crates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rs
**/*.{rs,rmeta}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
If Rust code changes, run
cargo fmt --all -- --checkandjust test-rust.
Files:
crates/fabric-cli/src/examples.rscrates/fabric-cli/src/presets.rs
🪛 ast-grep (0.44.1)
tests/e2e/test_cli_scaffold.py
[error] 50-68: Command coming from incoming request
Context: subprocess.run(
[
"cargo",
"run",
"--quiet",
"-p",
"nemo-fabric-cli",
"--",
"plan",
"--preset",
preset,
],
cwd=ROOT,
env=environment,
check=False,
capture_output=True,
text=True,
timeout=SUBPROCESS_TIMEOUT_SECONDS,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').
(subprocess-from-request)
🪛 Ruff (0.15.21)
tests/e2e/test_cli_scaffold.py
[error] 51-51: subprocess call: check for execution of untrusted input
(S603)
[error] 52-62: Starting a process with a partial executable path
(S607)
🔇 Additional comments (2)
crates/fabric-cli/src/presets.rs (1)
61-61: LGTM!Also applies to: 74-94, 133-165
crates/fabric-cli/src/examples.rs (1)
64-72: LGTM!
Signed-off-by: Zhongxuan Wang <daniewang@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
crates/fabric-cli/src/presets.rs (1)
73-80: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy liftMake validated configuration construction authoritative.
stage()validates the endpoint, butPreset::config()at Line 68 remains a public, non-fallible construction path, while the Claude and Codex builders convert a missing variable toNone. A direct caller can therefore reach downstream normalization without a Frontier URL and inherit the public Catalog default. Route all configuration construction through a fallible validated path and add a regression test for direct construction.Also applies to: 200-200, 215-215
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/fabric-cli/src/presets.rs` around lines 73 - 80, Make Preset::config and the Claude/Codex configuration builders use a fallible, validated construction path that rejects a missing endpoint instead of producing None or applying the Catalog default. Update stage to reuse that authoritative configuration result after validate_config_environment, and adjust callers to propagate the error. Add a regression test covering direct configuration construction without a Frontier URL.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@crates/fabric-cli/tests/frontier_presets.rs`:
- Around line 13-16: Update both subprocess commands in the frontier preset
tests, including the command that invokes the successful endpoint case, to set a
deterministic dummy NVIDIA_API_KEY while continuing to remove
NVIDIA_FRONTIER_BASE_URL where required. Keep the assertions focused on Frontier
endpoint validation rather than inherited host environment state.
---
Outside diff comments:
In `@crates/fabric-cli/src/presets.rs`:
- Around line 73-80: Make Preset::config and the Claude/Codex configuration
builders use a fallible, validated construction path that rejects a missing
endpoint instead of producing None or applying the Catalog default. Update stage
to reuse that authoritative configuration result after
validate_config_environment, and adjust callers to propagate the error. Add a
regression test covering direct configuration construction without a Frontier
URL.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Enterprise
Run ID: c966ae29-cd94-43b9-a8f5-d156a77e6a54
📒 Files selected for processing (2)
crates/fabric-cli/src/presets.rscrates/fabric-cli/tests/frontier_presets.rs
📜 Review details
⏰ Context from checks skipped due to timeout. (12)
- GitHub Check: Pre-commit
- GitHub Check: Test (Python 3.14, macos-arm64)
- GitHub Check: Test (Python 3.12, macos-arm64)
- GitHub Check: Test (Python 3.14, windows-amd64)
- GitHub Check: Test (Python 3.11, macos-arm64)
- GitHub Check: Test (Python 3.11, windows-amd64)
- GitHub Check: Test (Python 3.13, windows-amd64)
- GitHub Check: Test (Python 3.12, windows-amd64)
- GitHub Check: Test (Python 3.13, linux-amd64)
- GitHub Check: Test (Python 3.13, macos-arm64)
- GitHub Check: Test (Python 3.12, linux-amd64)
- GitHub Check: Test (Python 3.11, linux-arm64)
🧰 Additional context used
📓 Path-based instructions (11)
**/*.rs
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
Implement new runtime or binding behavior in the shared Rust core first.
**/*.rs: Format Rust code withcargo fmt --alland ensurecargo fmt --all -- --checkpasses.
Runcargo check --workspace --lockedwhen changing the Rust core, CLI, or native Python extension.
Rust files must use the specified Rust//SPDX header format.
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/*.{rs,py,pyi,json,yaml,yml}
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
Determine and update every affected public surface, including the CLI, PyO3 bindings, Python SDK, type stubs, schemas, and adapter contract, so they remain in parity.
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/*
📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)
**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.
**/*: Always spellNVIDIAin all caps; do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names withNVIDIAon first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/*.{rs,toml}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For any Rust change, run
just test-rustandcargo fmt --all -- --check.For Rust core, CLI, or shared runtime semantic changes, run Rust formatting and tests, and add Python tests when behavior is exposed through the SDK.
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/*.{rs,py}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For native binding changes, run
cargo check -p fabric-python --locked.
**/*.{rs,py}: Usesnake_casefor functions and variables; usePascalCasefor Rust types and Python classes.
Run tests for every affected language surface; changes to the Rust core or public schemas require both Rust and Python test suites.
Keep native Python binding declarations synchronized with their Rust implementations when public contracts change.
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/*.{rs,rmeta}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
If Rust code changes, run
cargo fmt --all -- --checkandjust test-rust.
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/*.{rs,py,pyi}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
**/*.{rs,py,pyi}: If public configuration types change, confirm schema snapshot tests injust test-rustpass and review generated schema diffs.
For schema or public contract changes, run both language suites and review changes underschemas/and generated API references.
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/*.{py,pyi,rs}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
For Python SDK or PyO3 binding changes, use
python-tests, run focused pytest tests first, thenjust test-python; rebuild withjust build-pythonwhen native code or packaging changes.
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/*.{rs,py,toml}
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
When editing version helpers, verify every
nemo-fabric-*workspace package through Cargo metadata and reject a static version inpython/pyproject.toml.
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/*.{toml,rs,py}
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
Avoid blind repository-wide replacement of version-like strings; distinguish package-version references from examples and unrelated dependency versions.
Files:
crates/fabric-cli/tests/frontier_presets.rscrates/fabric-cli/src/presets.rs
**/tests/**/*.{rs,py}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
When adding functionality, include tests in the corresponding Rust crate or relevant
tests/area.
Files:
crates/fabric-cli/tests/frontier_presets.rs
🔇 Additional comments (2)
crates/fabric-cli/tests/frontier_presets.rs (1)
1-8: LGTM!crates/fabric-cli/src/presets.rs (1)
24-24: LGTM!Also applies to: 84-93, 146-153, 379-379
Signed-off-by: Zhongxuan Wang <daniewang@nvidia.com>
Overview
Prevent the
claudeandcodexCLI presets and example variants from constructing or planning a configuration unlessNVIDIA_FRONTIER_BASE_URLcontains a non-empty endpoint. These presets require NVIDIA Frontier and must not inherit a public NVIDIA Catalog default from downstream normalization.Preset::config()is now the authoritative fallible construction path, and staging and maintained examples propagate its validation error. This intentionally changes that public experimentation-CLI method from returningFabricConfigto returningResult<FabricConfig, String>; there are no core schema or Python SDK API changes. Existing CLI documentation already describes the Frontier endpoint as explicit and without a default.Details
required_envmetadata instead of adding a second configuration-environment field.NVIDIA_API_KEYas a runtime credential requirement rather than a planning requirement.hermesanddeepagentspresets unchanged.Validation
cargo fmt --all -- --checkjust --fmt --checkcargo check --workspace --lockedjust test-rustgit diff --checkcargo build -p nemo-fabric-cli --locked, followed by a compiled-binary matrix covering Claude/Codex preset and example plan/init failures and successes plus Hermes/DeepAgents Catalog defaultsuv run --no-sync python -E2E: compiled CLI plan →FabricConfig.from_mapping()→ publicFabric.run()→ Claude adapter → mock Claude CLI; child receivedhttps://frontier-e2e.invalid, and Catalog was absentuv run --no-sync pytest -q tests/adapters/test_codex_adapter.py -k 'nvidia_provider'(5 passed, 45 deselected)A full Codex child-process E2E was not run because the repository has no deterministic Codex CLI fixture. The focused adapter tests cover its NVIDIA endpoint mapping and missing-endpoint rejection.
just test-pythonwas not rerun because the final diff contains no Python, SDK, binding, or adapter changes.Where should the reviewer start?
Start with the fallible
Preset::config()path incrates/fabric-cli/src/presets.rs, then review the actual CLI boundary test incrates/fabric-cli/tests/frontier_presets.rs.Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)
Relates to feat: validate adapter model compatibility #118
I confirm this contribution is my own work, or I have the right to submit it under this project's license.
I searched existing issues and open pull requests, and this does not duplicate existing work.
Summary by CodeRabbit
Bug Fixes
Tests