Replies: 2 comments
|
Revision 2026-07-27: aligned this RFC with the system-readiness epic #7407 and its merged report-contract work in #7544 (commit b5cf484fe). The readiness report is now the canonical per-node input. Managed inference owns report-set aggregation, recipe requirements, and desired topology; it does not define parallel OS/runtime/GPU probes. The revision also preserves three-state readiness and freshness semantics, separates public readiness qualifications from private topology artifacts, adds fail-closed admission rules, and updates the two-Station and eight-Spark examples to require both per-node platform readiness and exact topology qualification. Thanks to #7407 for establishing the consumer-neutral ownership boundary this design now builds on. |
|
Maintainer decision 2026-08-03: confirm the RFC design directions for implementation. Implementation will proceed in dependency-ordered slices under epic #8144. Repository-owned YAML is the only authoring format for managed serving configuration. The build compiles that YAML to deterministic canonical JSON. Reviewed code owns validation and allowlisted materializer and lifecycle adapters. Runtime code does not parse operator-supplied YAML. Acceptance starts implementation. It does not change the current support matrix or qualify a backend, model, platform, or agent. Resolve the remaining follow-up decisions in the first implementation slice that requires each decision. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
RFC 0001 Managed Inference Serving Specifications
Summary
NemoClaw should define managed local inference defaults in repository-owned YAML specifications.
Code should consume trusted system-readiness reports, aggregate cluster facts, enforce readiness and topology requirements, validate specifications, resolve one preset, and materialize a serving plan.
The system-readiness report defined by issue #7407 is the canonical source for per-node observations, capabilities, and platform qualifications.
The serving layer must not create a second OS, runtime, or accelerator probe contract.
The serving selection model must aggregate those per-node reports into clusters.
It must represent node count, accelerator count, accelerator placement, memory, operating system, container runtime, and qualified fabric properties.
The model must support new dimensions without adding backend-specific selection branches.
The first catalog should cover the existing managed vLLM and Ollama behavior.
It should preserve current behavior before any default changes.
Motivation
Managed local inference defaults currently use separate mechanisms.
schemas/system-readiness.schema.jsondefines the supported, consumer-neutral readiness report introduced by PR #7544.src/lib/readinessdefines its TypeScript contract, compatibility checks, and reference validation.src/lib/inference/vllm.tsdefines vLLM profiles for DGX Spark, DGX Station, and generic Linux NVIDIA GPU hosts.src/lib/inference/vllm-models.tsdefines model-specific vLLM arguments and runtime overrides.src/lib/inference/ollama-model-registry.tsselects Ollama models from available memory and a compute constraint.src/lib/inference/nim.tsclassifies NVIDIA platforms.scripts/install.shcontains separate DGX Station Express defaults and operating-system qualification branches.scripts/prepare-dgx-station-host.showns DGX Station host preparation and qualification.This structure already contains the concepts of a readiness report, host profile, model recipe, and runtime override.
Managed inference does not yet consume the readiness contract through one resolver.
The installer can therefore select a different default from direct onboarding on the same host.
The readiness epic deliberately separates ownership.
NemoClaw owns observation and readiness semantics.
Consumers own application requirements and desired topology.
This RFC follows that boundary by treating the serving catalog as a readiness consumer and keeping cluster aggregation and serving policy in the inference layer.
Distributed configurations make the current split harder to extend.
A two-node DGX Station recipe and a possible eight-node DGX Spark recipe need more than a platform name.
They need node placement, accelerator counts, topology requirements, and distributed serving parameters.
Goals
This RFC has these goals:
Non-goals
This RFC does not:
Terms
System-readiness report
A system-readiness report is the supported, versioned, read-only contract produced by NemoClaw readiness checks.
It separates observations, capabilities, readiness qualifications, findings, bounded evidence, and provenance.
Each participating node supplies one compatible report.
Selection fact
A selection fact is a typed value in the internal serving selection snapshot.
Per-node selection facts are projected from stable readiness entities.
Cluster facts are derived from the complete report set and trusted topology input.
Operator intent and workload requirements use separate namespaces.
Readiness qualification
A readiness qualification is a safe, serializable result in a system-readiness report.
It has a stable identifier, a
qualified,unqualified, orunknownstatus, and references to readiness capabilities.Platform qualifications such as DGX Station readiness belong to this layer.
Topology qualification artifact
A topology qualification artifact is a private, typed result from code that validates a bounded multi-node or security-sensitive contract.
It has a versioned output schema, physical subject identity, and output digest.
It may provide typed values or opaque secret handles to an allowlisted materializer.
A validated private two-node fabric belongs to this layer.
Serving recipe
A serving recipe is an atomic backend and model execution contract.
It includes immutable artifacts, model identity, arguments, environment, container resources, and readiness expectations.
Serving preset
A serving preset maps readiness entities, selection facts, and topology qualifications to one serving recipe.
It also declares whether selection is automatic, explicit only, or disabled.
Resolved serving plan
A resolved serving plan is the complete validated result for one install attempt.
Install, resume, status, and diagnostics consume this plan.
For a distributed recipe, the plan contains one role-specific plan per node and names the code-owned lifecycle adapter that may apply it.
Catalog
The catalog is the compiled set of selection schemas, recipes, and presets shipped with one NemoClaw revision.
Design principles
Readiness is the per-node source of truth
Managed inference must consume the supported system-readiness producer used by onboarding.
It must not reimplement OS, runtime, GPU, CDI, or platform detection.
Selection projections do not contain policy
The readiness adapter and cluster aggregator report typed values and states.
They must not choose a model or backend.
Qualifications remain code-owned
Code must own probes that enforce security or hardware boundaries.
YAML may require a readiness qualification or topology qualification by identifier.
YAML must not reproduce a complex qualification algorithm.
Unknown remains unknown
The resolver must preserve the readiness contract's
present,absent, andunknownstates.It must not convert a failed observation into
absentor a passing qualification.Recipes are complete
A recipe must describe one complete serving contract.
Changing an image, model revision, distributed strategy, or material serving argument creates a new recipe identifier.
Changing the material behavior of a referenced materializer or lifecycle adapter requires a new adapter version and recipe identifier.
Presets select recipes
A preset may bind declared recipe parameters.
It must not apply an unrestricted patch to a recipe.
Runtime input is compiled
The YAML files are the canonical source.
Production code consumes a compiled canonical JSON catalog.
Runtime code does not parse YAML from an untrusted location.
YAML selects bounded code
YAML may name an allowlisted materializer or lifecycle adapter.
Those adapters have versioned input and output schemas.
YAML must not contain executable lifecycle steps, shell fragments, or an unrestricted command template.
Selection is deterministic
The resolver uses explicit priorities.
It does not infer priority from file order or an undocumented specificity score.
Repository layout
The catalog should use this layout:
The catalog must reference the repository-level
schemas/system-readiness.schema.jsoninstead of copying it.The implementation should use this layout:
The build should write the compiled catalog to the packaged runtime artifacts.
The exact generated path is an implementation decision.
System readiness boundary
The supported system-readiness report is the only public per-node readiness contract.
This RFC builds on the ownership model and implementation stack in issue #7407.
Managed inference should call the same in-process readiness producer that onboarding uses.
It should not shell out to the public readiness CLI or maintain parallel probes.
The CLI and managed inference are separate presentations of the same checks and report.
Before using a report, the readiness adapter must:
mutated: false.present,absent, andunknown.The readiness registry should declare which stable observation, capability, and qualification identifiers may be projected into serving selection.
The catalog compiler may validate identifiers against that registry.
It must not depend on internal
HostAssessmentfields.Readiness evidence and human-readable finding summaries are diagnostic.
A preset must not match their content.
A referenced capability or qualification may affect selection because its stable identifier and state are contract fields.
The report's top-level status is not a substitute for recipe requirements.
Managed inference must apply the following fail-closed admission rules before it evaluates a recipe:
supportedwith nofatalorblockingfindingincompatibleorinconclusivefatalorblockingfindingsupportedwarningorinfofindingssupportedis necessary but not sufficient.Every recipe-specific readiness and topology requirement must also pass.
Explicit selection and operator overrides do not bypass these rules.
An
unknownrequired entity never satisfies a preset.Selection snapshot
The serving resolver builds an internal, versioned selection snapshot.
It is not a second public host-report format and is not accepted from an arbitrary file.
It contains the exact validated readiness reports, their provenance, serving-owned cluster aggregation, explicit operator intent, workload facts, and topology qualification artifacts.
The snapshot must distinguish node count from accelerator count.
A total accelerator count cannot describe accelerator placement or heterogeneous nodes.
This abbreviated example shows its provenance and cluster shape:
The complete runtime snapshot holds each validated
SystemReadinessReport.The
sourcesentries above are its serializable provenance, not replacements for those reports.The initial selection vocabulary should use these namespaces:
readiness.observationsreadiness.capabilitiesreadiness.qualificationscluster.nodeCountcluster.homogeneouscluster.nodeGroupscluster.acceleratorscluster.fabricagentworkloadtopologyQualificationsNew readiness entities require a stable identifier from the readiness contract.
New serving-owned fields require a selection-snapshot schema change and a trusted derivation source.
Neither requires backend-specific matching code.
The selection validator must enforce cross-field invariants.
At minimum:
cluster.nodeCount.cluster.accelerators.totalCountmust equal the sum of derived node-group inventories.presentonly when every required source observation is present and type-valid.cluster.homogeneous: truemeans that every node has equal values for the declared hardware and software projections.Distributed presets must constrain per-node readiness entities or derived group projections when the recipe requires the same operating system, architecture, or container runtime on every node.
Readiness entity matching
A readiness requirement declares:
An observation value may be compared only when its state is
present.An
absentrequirement matches only a checked and absent entity.An
unknownentity fails both automatic and explicit selection and appears in diagnostics.Fatal and blocking readiness findings stop the common pre-effect admission phase.
Warning and informational findings remain visible but do not independently stop admission.
Their summary text is never a selector.
Evidence details are never selectors.
Topology qualification artifacts
Topology qualification code may return typed output that a materializer needs but a generic matcher should not interpret.
The dual-Station qualification, for example, must preserve the pretrusted SSH binding, physical node and GPU identities, reciprocal rail endpoints, device names, master address, and RoCE GID index.
This artifact is distinct from the safe, serializable readiness qualifications in each node report.
A readiness qualification can establish that each node is an approved DGX Station profile.
The topology artifact establishes that these exact nodes form an approved pair.
Each topology qualification identifier maps to one code-owned output schema.
The preset matcher sees only the identifier, schema version, subject, and status.
Only an allowlisted materializer may consume typed output.
Topology qualification outputs must follow these rules:
Selection paths
The selection schema defines each matchable serving-owned path, value type, cardinality, and derivation.
The readiness registry defines each matchable readiness entity.
Presets must use an entry from one of those registries.
Every selection-fact requirement must declare
presentorabsent.Observation and capability requirements must declare
presentorabsent, while readiness qualifications declarequalifiedorunqualified.The compiler rejects a preset that asks for
unknown.Dot-separated paths do not provide general object traversal.
A collection path such as
cluster.nodeGroups.accelerators.modelis a declared projection over the node-group array.The compiler rejects a collection path with a scalar operator.
It also rejects an unregistered readiness identifier or an operator that the entity's value contract does not support.
The first schema version should support these scalar operators:
equalsoneOfatLeastatMostbetweenThe first schema version should support these collection operators:
allEqualcontainscontainsAllThe first schema version should not support regular expressions.
Operating-system release ranges should use a code-owned readiness qualification or an enumerated value set.
A value operator is valid only with a
presentrequirement.Range constraints
Preset requirements must support these numeric operators:
equalsatLeastatMostbetweenbetweenuses an inclusive lower and upper bound.Both values are required.
A recipe that has only been validated on eight nodes must use
[8, 8].It must not use
[4, 8]until the complete range has evidence.Node and accelerator constraints must remain separate.
A preset may constrain:
Serving preset schema
A preset declares match requirements, selection policy, and one recipe reference.
The readiness entity identifiers in this and the following Spark example are provisional and illustrative until issue #7408 and issue #7410 define the supported registry.
Allowed selection values are:
automaticexplicit-onlydisabledAn
explicit-onlypreset must satisfy every requirement.Explicit selection does not bypass readiness or topology requirements.
Eight-node DGX Spark example
An eight-node DGX Spark preset can use the same schema.
This example defines data shape.
It does not assert that NemoClaw supports this configuration.
The future recipe must pin or validate its own distributed strategy.
Node count does not imply a safe tensor-parallel or pipeline-parallel value.
Serving recipe schema
A recipe should use structured arguments.
The compiler converts them to an argument vector.
This example uses the immutable model revision and image digest from the in-flight dual-Station work.
It illustrates how that work slots into the catalog.
It does not make the recipe supported or runnable by itself.
Bindings
A recipe declares the bindings that it accepts.
A preset supplies values or approved fact references for those bindings.
The first version should support:
valueFromFactreferences to allowlisted fact paths.valueFromTopologyQualificationreferences to allowlisted, versioned topology artifacts.valueFromBindingreferences from structured recipe fields.The first version must not support:
If a recipe needs derived arithmetic, code should expose a named materializer operation with bounded inputs.
The RFC that adds that operation must define its validation.
valueFromTopologyQualificationmust not copy a secret into the compiled catalog or serializable plan.A secret-bearing output must resolve to an opaque handle that only the declared lifecycle adapter can consume.
Materializers and lifecycle adapters
A materializer is a pure, code-owned function.
It accepts one validated recipe, its declared bindings, the selection snapshot, and typed topology qualification outputs.
It returns a versioned resolved plan without causing side effects.
A lifecycle adapter is code-owned logic that applies one resolved plan.
It may inspect, create, reuse, stop, or roll back managed runtime resources within its declared contract.
Both use an allowlisted registry.
Each registry entry must define:
The first distributed entries should be
vllm.dual-dgx-station/v1.The materializer converts the qualified pair topology and static recipe constants into separate head and worker plans.
The lifecycle adapter owns worker-first startup, the Ray join sequence, role-specific devices and mounts, head-only API authentication, managed ownership labels, exact-pair reuse, transactional rollback, and legacy single-Station migration.
Those behaviors must stay in reviewed TypeScript.
The YAML recipe selects the adapter and supplies bounded data.
An eight-node DGX Spark implementation should use a separately reviewed adapter unless an accepted RFC establishes a shared distributed contract.
Selection
The resolver receives:
The resolver applies these rules:
mutated: false, and provenance.incompatibleorinconclusivereport or anyfatalorblockingfinding before any side effect; retainwarningandinfofindings in diagnostics.File order must not affect the result.
Display names must not affect the result.
Overrides
Existing operator overrides require a compatibility period.
The implementation should introduce
NEMOCLAW_SERVING_PRESETas the explicit preset selector.The exact CLI flag is an implementation decision.
During migration:
NEMOCLAW_PROVIDERconstrains the backend.NEMOCLAW_VLLM_MODELmaps to a compatible vLLM recipe.NEMOCLAW_MODELpreserves its documented provider-specific meaning.NEMOCLAW_VLLM_EXTRA_ARGS_JSONremains an advanced operator override.--station-deepseekmaps to the matching explicit preset.The materializer must reject known singleton argument conflicts.
It must report the preset field and operator override that conflict.
An incompatible explicit override must fail.
The resolver must not replace explicit intent with an automatic fallback.
Compilation
The build should compile the YAML catalog to canonical JSON.
The compiled envelope should contain the catalog schema version, compiler version, source revision, sorted definitions, source-file provenance, and catalog digest.
In this RFC, "catalog version" means the compiled schema version plus digest.
It is not a separately edited marketing or release number.
Compilation must:
Strict catalog fields do not change readiness compatibility.
The readiness adapter must follow the system-readiness contract and ignore unrecognized optional fields within a supported major version.
CI must reject a generated catalog that differs from the YAML source.
Tests must exercise the compiler or resolver behavior instead of asserting only YAML text.
Semantic validation
JSON Schema cannot enforce every catalog invariant.
The compiler must also perform semantic validation.
Semantic validation must include:
Pairwise proof that arbitrary predicates never overlap can become expensive.
The first implementation should combine explicit priority with maintained boundary fixtures.
Each automatic preset must include fixtures for its accepted boundary and nearest rejected boundaries.
Diagnostics
The resolver should expose a structured selection report.
The report should include:
Normal output should name the selected preset and recipe.
Debug or JSON output should include the complete report.
Diagnostics must not include secrets.
Resume and provenance
Resume state must record:
The installer revision continues to bind the implementation.
The catalog digest proves the exact data used by that implementation.
Resume must fail when the saved preset cannot be resolved under the saved revision.
It must not silently choose a new automatic default.
Resume must re-run every non-resume-safe readiness entity instead of treating a saved report as current.
It must also fail when physical pair identity or a required topology artifact no longer matches.
It must reacquire secret-bearing topology outputs through their trusted producer.
Installer boundary
The shell installer must not parse YAML.
It should forward explicit preset intent to the Node-based resolver.
Automatic selection should occur after the required readiness reports and topology inputs are available.
The installer may show a generic managed-inference disclosure before resolution.
It should show the resolved backend, model, image source, and download estimate before side effects.
The design should remove model and recipe constants from shell branches.
Shell code may retain host-preparation orchestration that must run before Node onboarding.
Host preparation boundary
A serving preset may require a readiness qualification or topology qualification.
It must not install drivers, configure Docker, establish SSH trust, or configure network rails.
Host preparation remains a separate phase.
Read-only readiness produces observations, capabilities, qualifications, findings, and evidence.
Separate topology code produces cluster facts and topology qualification artifacts.
The resolver consumes those outputs.
This boundary keeps a serving recipe from gaining host mutation authority.
Security and trust
The first implementation trusts only specifications shipped in the NemoClaw repository and release artifact.
The runtime must not:
User-authored or remote catalogs require a separate design.
That design must define signing, provenance, policy, update, revocation, and execution boundaries.
Product status
Catalog availability and product support are separate.
The catalog uses
automatic,explicit-only, anddisabledto control selection.The platform matrix remains the source of truth for support claims.
An automatic preset does not change a platform status.
An accepted RFC does not qualify hardware.
Each PR that adds an automatic preset must identify:
Existing DGX Station behavior
The first migration should represent current single-node behavior without changing it.
Current behavior includes:
--station-deepseekalternative.The initial catalog may encode the direct and Express selections as separate presets.
Maintainers should then decide whether one preset becomes the canonical automatic Station default.
The prior single-user experimental Station configuration changed several serving dimensions together.
If maintainers approve it, it should become a separate explicit-only recipe and preset.
It should not patch the released Nemotron Ultra recipe.
How the system-readiness work slots in
Issue #7407 is the canonical source-of-facts dependency for this RFC.
Its merged contract and remaining implementation stack divide responsibilities as follows:
The readiness stack remains consumer-neutral and single-node.
The serving layer owns recipe requirements, report-set aggregation, desired topology, and materialization.
This preserves the ownership boundary stated in issue #7407.
How the dual-Station work slots in
PR #7030 is the first concrete migration fixture for the distributed design.
This RFC does not decide that pull request's merge or product-support status.
It assigns the work's existing responsibilities to explicit catalog and code-owned boundaries.
/30CX-8 rail checks, SSH trust, physical pair identity, routes, neighbors, jumbo frames, and RoCE GID validationdgx-station.gb300.dual-cx8topology qualification producer and versioned outputvllm.nemotron-ultra.station-distributed.v0251YAML recipevllm.dual-dgx-station/v1materializervllm.dual-dgx-station/v1lifecycle adapterThe topology-specific preset selects this recipe only when the exact two-node qualification passes.
The recipe pins PP=2 and TP=1.
It does not derive either value from a general GPU or node count.
Ollama behavior
The first Ollama migration should preserve the current memory-aware selection.
Ollama presets may constrain:
Ollama model metadata belongs in recipes.
Host placement and automatic selection belong in presets.
Daemon installation commands remain code-owned.
Migration
Readiness alignment
Treat issue #7407 and its stable entity registry as the per-node source-of-facts dependency.
Add a serving adapter that consumes
SystemReadinessReportdirectly.Do not freeze OS, runtime, accelerator, or platform selection identifiers until issues #7408 and #7410 define their supported IDs.
Converge managed inference on the common readiness producer as part of issue #7411.
Catalog foundation
Add catalog schemas, compiler types, readiness adapters, cluster aggregation, and synthetic validation fixtures.
Do not change provider selection.
vLLM parity
Represent current vLLM models, images, and platform defaults in YAML.
Compare resolved plans with current behavior in table-driven tests.
Installer integration
Make Station Express and Spark Express select preset identifiers.
Preserve existing resume behavior and legacy environment variables.
Ollama parity
Represent the current Ollama registry and memory-aware defaults.
Keep existing validation and daemon lifecycle behavior.
Provenance and diagnostics
Persist catalog identity.
Show selection reasons in status and diagnostic output.
Default convergence
Decide whether direct and Express Station installs should use one automatic default.
Treat that decision as a separate user-visible behavior change.
Distributed presets
Add distributed presets only after their topology and lifecycle contracts are accepted and validated.
Testing
The implementation must include:
Distributed recipes also require physical evidence under the applicable repository policy.
Passing catalog tests do not replace hardware validation.
Alternatives
TypeScript-only catalog
A TypeScript catalog provides compile-time types and can call arbitrary helper functions.
It keeps product data coupled to implementation code.
It also makes external review and generation harder as the combination count grows.
This RFC prefers YAML plus a strict compiler.
Direct YAML interpretation
Runtime YAML interpretation removes a build step.
It expands the runtime parser and trust boundary.
It also makes release artifacts depend on source-file discovery.
This RFC prefers canonical YAML compiled to packaged JSON.
Separate inference host probes
Inference-specific OS, runtime, GPU, CDI, or platform probes could expose exactly the values the resolver wants.
They would duplicate the supported readiness contract and could disagree with onboarding.
This RFC consumes the readiness producer from issue #7407 and limits inference-owned probing to serving topology and materialization needs.
GPU count only
A total GPU count requires one scalar comparison.
It cannot describe node placement, heterogeneous nodes, unified memory, or required fabric properties.
This RFC models nodes, node groups, and accelerators separately.
Deep inheritance
Recipe inheritance can reduce repeated YAML.
It can also hide the final image, arguments, and security-sensitive settings.
This RFC requires complete recipes and declared bindings.
General expression language
A general expression language can represent derived settings.
It increases validation and code-execution risk.
This RFC uses bounded operators and allowlisted selection and readiness references.
Follow-up decisions
Resolve each decision in the implementation slice that requires it:
Accepted decision
Maintainers accepted these design directions on 2026-08-03:
present,absent, andunknownstates and freshness semantics are preserved.All reactions