Description
Any @run.cli.entrypoint function with a parameter whose name starts with a reserved prefix (run, executor, plugins) cannot be configured from the CLI — the invocation crashes before the task argument parser runs:
ValueError: Run overwrites must start with 'run.'. Got runtime=120
Affected names include runtime, run_id, runs_per_epoch, executors, plugins_dir etc — all normal parameter names.
Steps to reproduce
# app.py
import nemo_run as run
@run.cli.entrypoint(skip_confirmation=True)
def train(runtime: int = 60, lr: float = 0.1):
print(runtime, lr)
if __name__ == "__main__":
run.cli.main(train)
$ python app.py runtime=120 lr=0.2
ValueError: Run overwrites must start with 'run.'. Got runtime=120
Unit-level: _parse_prefixed_args(["runtime=3600"], "run") raises.
Expected behavior
runtime is a task parameter, the run should behave like any other name (max_runtime=120 works today). Only run=…, run.…, run[…] (and executor/plugins equivalents) should be treated as prefixed overwrites.
Actual behavior
RunContext.cli_execute passes all task args through _parse_prefixed_args(args, "run"), which matches startswith("run") with no word boundary.
Two more issues in the same function:
_parse_prefixed_args(["run.a.run.b=1"], "run") returns a.b=1 — every run. occurrence is stripped, silently targeting the wrong parameter.
_parse_prefixed_args(["executor=k=v"], "executor") returns value k instead of k=v (value split at first =).
Environment
nemo-run main (b85eb67), Python 3.12, macOS
Description
Any
@run.cli.entrypointfunction with a parameter whose name starts with a reserved prefix (run,executor,plugins) cannot be configured from the CLI — the invocation crashes before the task argument parser runs:Affected names include
runtime,run_id,runs_per_epoch,executors,plugins_diretc — all normal parameter names.Steps to reproduce
Unit-level:
_parse_prefixed_args(["runtime=3600"], "run")raises.Expected behavior
runtimeis a task parameter, the run should behave like any other name (max_runtime=120works today). Onlyrun=…,run.…,run[…](and executor/plugins equivalents) should be treated as prefixed overwrites.Actual behavior
RunContext.cli_executepasses all task args through_parse_prefixed_args(args, "run"), which matchesstartswith("run")with no word boundary.Two more issues in the same function:
_parse_prefixed_args(["run.a.run.b=1"], "run")returnsa.b=1— everyrun.occurrence is stripped, silently targeting the wrong parameter._parse_prefixed_args(["executor=k=v"], "executor")returns valuekinstead ofk=v(value split at first=).Environment
nemo-run main (
b85eb67), Python 3.12, macOS