Skip to content

chore: remove run (local execution) CLI verbs across all services - #1228

Draft
ironcommit wants to merge 1 commit into
mainfrom
remove-local-run-execution/rsadler
Draft

chore: remove run (local execution) CLI verbs across all services#1228
ironcommit wants to merge 1 commit into
mainfrom
remove-local-run-execution/rsadler

Conversation

@ironcommit

@ironcommit ironcommit commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Remove the run (in-process / local execution) CLI verb from all plugin jobs and functions, leaving submit (remote platform execution) as the only execution path. This simplifies the CLI surface, removes dual-path maintenance burden, and aligns the developer experience with the platform's remote-first execution model.

Changes

Plugin framework (nemo_platform_plugin)

  • commands.py: Strip the run verb generator for both NemoJob and NemoFunction; only submit (and explain for jobs) are generated.
  • scheduler.py: Remove NemoJobScheduler.run_local() and all in-process execution machinery.
  • cli.py / cli_state.py / cli_renderer.py: Update type literals, docstrings, and renderer context to reflect submit-only surfaces. Retain is_local and verb fields for third-party renderer compatibility.
  • function.py / job.py / job_context.py / run_dependencies.py: Remove local-run wiring and related helpers.

Per-plugin updates

  • evaluator: Remove Evaluator.run() SDK method and fs_utils.py; delete resources.py (local execution resources). Update all evaluator tests.
  • anonymizer, auditor, data-designer, safe-synthesizer, optimization, automodel, unsloth, RL, agents: Remove run CLI paths, update cli.py / inputs.py, and adjust tests.
  • example-plugin: Simplify say_hello job to submit-only; update tests.

Documentation (43 .mdx files + READMEs + skill files)

  • Replace all nemo <plugin> <job> run instructions with submit equivalents.
  • Update tutorials, SDK resource pages, execution-mode guides, and troubleshooting docs.
  • Remove the safe-synthesizer host-local-development guide's local-run sections.

Deleted files

  • plugins/nemo-evaluator/src/nemo_evaluator/sdk/fs_utils.py
  • plugins/nemo-safe-synthesizer/tests/e2e/test_local_synthesis.py
  • plugins/nemo-safe-synthesizer/tests/unit/test_local_run.py

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with documentation updates

Quality Gates

  • Tests added or updated for changed behavior
  • Documentation updated for user-visible behavior

Verification

  • Pull request title follows the repository's Conventional Commit format
  • Every commit includes an appropriate Signed-off-by: trailer
  • uv run pre-commit run -a passes, or any blocked checks are identified below
  • Targeted tests pass, or tests are marked not applicable above
  • No secrets, API keys, or credentials are included

@ironcommit
ironcommit requested review from a team as code owners August 10, 2026 23:32
@github-actions github-actions Bot added the chore label Aug 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@ironcommit
ironcommit marked this pull request as draft August 10, 2026 23:40
@ironcommit ironcommit changed the title chore: remove run-local commands for all services chore!: remove run (local execution) CLI verbs across all services Aug 10, 2026
@github-actions github-actions Bot added the breaking breaking change (!-marked title) label Aug 10, 2026
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The change removes local execution from plugin CLIs, schedulers, SDK resources, and Safe Synthesizer workflows. It standardizes platform submission through submit, updates dependency errors and task execution tests, and revises examples and documentation.

Changes

Remote execution transition

Layer / File(s) Summary
Submission-only CLI and scheduler flow
packages/nemo_platform_plugin/..., packages/nmp_customization_common/..., plugins/*/src/...
Generated CLIs now expose submit and, for jobs, explain. Local run commands and scheduler execution support were removed.
SDK job APIs and task execution
plugins/nemo-auditor/..., plugins/nemo-evaluator/..., packages/nemo_platform_plugin/...
Auditor and evaluator resources now use submission and job lifecycle APIs. Direct task tests use run_task, JobContext, and persisted results. LocalRunError was renamed to RunDependencyError.
Plugin workflows and platform inputs
plugins/nemo-anonymizer/..., plugins/nemo-data-designer/..., plugins/nemo-safe-synthesizer/...
Workflows now require platform jobs, remote-compatible inputs, platform secrets or filesets, and downloaded artifacts where applicable. Host-local commands and tests were removed.
Examples and documentation
docs/..., plugins/*/README.md, plugins/*/SKILL.md
Examples now submit jobs, wait for completion where required, and retrieve results or artifacts through platform APIs.

Suggested labels: breaking

Suggested reviewers: ngoncharenko, arpitsardhana, gabwow

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 21.85% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: removing local execution CLI verbs across services.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch remove-local-run-execution/rsadler

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 20

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
docs/evaluator/metrics/model-configuration.mdx (1)

188-224: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Add RunConfigOnlineModel and prompt_template to the inline Model example.

A model target requires both values. Without them, the durable job fails validation.

🤖 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 `@docs/evaluator/metrics/model-configuration.mdx` around lines 188 - 224,
Update the inline Model example to include the required RunConfigOnlineModel
configuration and prompt_template value, ensuring the submit call passes the
online run config and the Model includes its prompt template. Keep the existing
endpoint resolution and job flow unchanged.
plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/SKILL.md (1)

74-84: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Remove local paths from the source example.

Line 80 says that data.source accepts a local path. Line 42 states that submission accepts only HTTP(S) URLs or fileset references. Remove “local path” from the comment.

🤖 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
`@plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/SKILL.md`
around lines 74 - 84, Update the data.source comment in the anonymizer preview
submit example to remove the local-path option, leaving only HTTP(S) URLs and
fileset references as supported sources.
docs/evaluator/tutorials/run-llm-judge-evaluation.mdx (1)

306-321: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Delete quick_test_job during cleanup.

This flow creates quick_test_job, but Lines 652-656 delete only job_v1 and job_v2. The remaining job can prevent workspace deletion at Lines 669-670.

🤖 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 `@docs/evaluator/tutorials/run-llm-judge-evaluation.mdx` around lines 306 -
321, Update the cleanup section to also delete quick_test_job, alongside job_v1
and job_v2, before workspace deletion. Ensure the quick_test_job returned by
evaluator.submit is cleaned up after its result is retrieved.
plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/run.md (1)

11-16: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Verify platform readiness before dependent operations.

Follow SETUP.md, check an existing instance, and fail on /health/ready before model-fileset setup or job submission. curl -s does not enforce readiness. The diagnose workflow checks availability after setup.

  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/run.md#L11-L16: add an enforced readiness check before setup_model_filesets.py.
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/diagnose.md#L44-L50: move the Files API readiness check before model-fileset setup.

As per coding guidelines: “Before operations requiring a running NeMo Platform, follow SETUP.md and verify service readiness.”

🤖 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
`@plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/run.md`
around lines 11 - 16, Ensure both workflow sites verify NeMo Platform readiness
before dependent operations: in
plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/run.md
lines 11-16, follow SETUP.md, check an existing instance, and replace the
non-enforcing curl health check with an enforced /health/ready check before
setup_model_filesets.py; in
plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/diagnose.md
lines 44-50, move the Files API readiness check before model-fileset setup while
preserving failure on an unavailable or unready service.

Source: Coding guidelines

🧹 Nitpick comments (2)
plugins/nemo-evaluator/tests/test_inline_bundle_execution.py (1)

55-63: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Extract this fixture; it is duplicated across three test modules.

_job_context here is byte-identical in behavior to _make_job_context in plugins/nemo-evaluator/tests/test_evaluate_job.py (Lines 103-112), and test_agent_evaluate.py defines a third copy. Move it to a shared conftest.py fixture.

🤖 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 `@plugins/nemo-evaluator/tests/test_inline_bundle_execution.py` around lines 55
- 63, Extract the duplicated _job_context setup into a shared pytest fixture in
conftest.py, consolidating it with _make_job_context from test_evaluate_job.py
and the equivalent helper in test_agent_evaluate.py. Update all three test
modules to use the shared fixture and remove their local helper definitions
while preserving the existing JobContext, StoragePaths, directory creation, and
LocalJobResults behavior.
plugins/nemo-safe-synthesizer/tests/unit/test_cli.py (1)

8-13: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Invoke run-local directly in this test.

A hidden registered command passes this help-only check. Invoke ["run-local"] and assert a nonzero exit code with No such command.

🤖 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 `@plugins/nemo-safe-synthesizer/tests/unit/test_cli.py` around lines 8 - 13,
Update test_cli_exposes_runtime_but_not_removed_local_command to invoke the CLI
with ["run-local"] instead of only requesting help, then assert a nonzero exit
code and that the output contains "No such command".
🤖 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 `@docs/anonymizer/cli.mdx`:
- Around line 14-17: Complete the remote-only documentation migration: in
docs/anonymizer/cli.mdx lines 14-17 keep one row each for preview submit and run
submit, removing local behavior; update lines 39-42 and 60-71 to describe and
source only the remote preview path; update lines 98-114 to keep run submit
remote-only; remove duplicate command requirements in lines 139-152. In
docs/anonymizer/tutorials/preview.mdx lines 179-184, update the preview field
reference to remove local-path support and align with the remote-only execution
path.

In `@docs/data-designer/cli.mdx`:
- Around line 41-42: Remove the obsolete local execution entries for preview
submit and create submit from the CLI documentation, including the corresponding
local sections around the referenced rows. Retain only the rows describing
submission through NeMo Services, so each command has a single service-based
execution model.

In `@docs/data-designer/tutorials/seeding.mdx`:
- Around line 259-265: Update docs/data-designer/tutorials/seeding.mdx at lines
259-265 by deleting the duplicate submit command block, removing “locally” from
the labels at lines 256 and 262, and removing the local-execution claim at line
247. In docs/data-designer/tutorials/basics.mdx at line 205, rename “Local CLI
Execution” to “CLI Submission,” remove the “run locally through the CLI” option
at line 194, and remove “local” from line 285.

In `@docs/evaluator/metrics/llm-as-a-judge.mdx`:
- Line 21: Update the execution-mode table around the “Platform job” row so it
no longer duplicates the durable-job mode on the adjacent row. Either
consolidate the entries into one platform-job mode or restore the intended
standalone SDK mode, while keeping each mode’s description and example accurate.

In `@docs/evaluator/metrics/remote.mdx`:
- Around line 24-25: Remove the duplicate execution-mode row from the execution
modes table, keeping a single entry for durable platform jobs with the existing
evaluator.submit(metric=metric, dataset=dataset) example.

In `@docs/evaluator/tutorials/run-llm-judge-evaluation.mdx`:
- Line 63: Update the tutorial’s remaining local-execution guidance around the
resource description, local execution section, and testing recommendation to
describe submitted evaluator jobs only. Remove references to running metrics
locally and direct users toward the durable submit flow via
evaluator.submit(...), while preserving the surrounding evaluation instructions.

In `@docs/safe-synthesizer/about/host-local-development.mdx`:
- Around line 53-57: Rename the “Related Topics” section to “Next Steps” in the
host-local-development documentation. Replace the source-tree Plugin README
reference with its published canonical Fern documentation URL, or remove that
bullet if no canonical page exists; keep the existing published links unchanged.
- Around line 8-12: Update the host-local development page before the
introductory content and Runtime Commands heading to list prerequisites covering
platform access, plugin installation, and required runtime setup. Keep the
existing explanation and command documentation unchanged after the new
prerequisites section.

In `@docs/safe-synthesizer/getting-started.mdx`:
- Around line 23-48: Update the “Submit Jobs” section to use the documentation’s
paired Python/CLI tab format. Keep the existing Python SDK example, and add a
CLI tab showing the supported runtime setup and inspection flow while clearly
stating that remote-only CLI submission is unavailable; if a CLI submit command
exists, document that command instead.

In `@docs/studio/data-designer-build.mdx`:
- Line 156: Update the “Preview logs” description to state that sampled output
is streamed while the submitted preview executes, rather than implying streaming
ends when submission is accepted.

In `@packages/nemo_platform_plugin/src/nemo_platform_plugin/docs/ARCHITECTURE.md`:
- Around line 100-105: Remove stale local-execution and generated `run`
documentation across the submission-only flow: in
packages/nemo_platform_plugin/src/nemo_platform_plugin/docs/ARCHITECTURE.md:100-105
update the CLI surface to document only `submit` and `explain`; in
docs/evaluator/metrics/rag.mdx:61-68 and its referenced areas near lines 82,
124, and 914 remove local `run` references; in
docs/evaluator/metrics/remote.mdx:254-257 and referenced areas near lines 241
and 260 remove local `run` and local secret-resolution wording; in
docs/evaluator/metrics/results.mdx:34-42 rename “Get Results from a Local Run”;
and in packages/nemo_platform_plugin/src/nemo_platform_plugin/function.py:9-11
remove local-CLI references from the `run()` and `run_signature()` docstrings.

In `@packages/nemo_platform_plugin/tests/test_commands.py`:
- Around line 255-260: Update the test setup around the runner invocation to
import os and clear relevant NMP_* environment variables before executing the
command, ensuring _resolve_submit_auth_headers cannot read ambient
authentication configuration and the exact kwargs["headers"] assertion remains
deterministic.

In `@plugins/nemo-anonymizer/openapi/openapi.yaml`:
- Line 1288: Regenerate the remote-only OpenAPI contract and SDK so the source
schema accepts only URLs or filesets, and model_configs is required in
AnonymizerRequest and PreviewRequest. Update the corresponding OpenAPI data
models to match the submitted-execution contract before running the repository’s
specification and SDK generation workflow.

In
`@plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/references/model-configs.md`:
- Line 52: Remove or revise the “Local default-everything preview” entry in the
model configuration documentation so it no longer claims that preview submit or
run submit work without model_configs. Keep the documented requirement that both
commands require model_configs, and update any remaining wording in that entry
to describe only supported local behavior.

In
`@plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/SKILL.md`:
- Around line 21-22: Update the CLI usage guidance for anonymizer.preview and
anonymizer.run to require following SETUP.md, setting
NMP_BASE_URL=http://localhost:8080, checking for an existing instance, and
verifying /health/ready before submitting either command.
- Line 37: Update the iteration guidance in SKILL.md so it instructs users to
run “nemo anonymizer preview submit” first, followed by the full-job command
“nemo anonymizer run submit”; remove the duplicated preview command.

In
`@plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/workflows/autopilot.md`:
- Around line 22-23: Update the Build and Preview workflow steps to require
local platform readiness before submission: set
NMP_BASE_URL=http://localhost:8080, follow SETUP.md, and verify that
/health/ready succeeds before running nemo anonymizer preview submit. Do not
allow preview submission based only on /openapi.json.

In
`@plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/workflows/interactive.md`:
- Around line 10-11: Update the workflow setup before the plugin-service probe
and every subsequent nemo command: set NMP_BASE_URL to http://localhost:8080 and
verify that /health/ready returns successfully. Stop and instruct the user to
resolve service readiness if the check fails, then retain the existing
openapi.json mounting check and input-source flow.

In `@plugins/nemo-auditor/README.md`:
- Around line 47-54: Align the CLI documentation in the README with the
registered command described in the auditor skill. Verify whether `nemo auditor
audit submit` is supported; if registered, document its usage in the README and
update the statement that no plugin-specific CLI command exists, otherwise
remove the command references from `SKILL.md`.

In
`@plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/tasks/safe_synthesizer/__main__.py`:
- Around line 396-400: Update main to normalize a None argv to sys.argv[1:]
before the rejection check, then preserve the existing SystemExit behavior for
any supplied arguments and call run_from_env only when the normalized list is
empty.

---

Outside diff comments:
In `@docs/evaluator/metrics/model-configuration.mdx`:
- Around line 188-224: Update the inline Model example to include the required
RunConfigOnlineModel configuration and prompt_template value, ensuring the
submit call passes the online run config and the Model includes its prompt
template. Keep the existing endpoint resolution and job flow unchanged.

In `@docs/evaluator/tutorials/run-llm-judge-evaluation.mdx`:
- Around line 306-321: Update the cleanup section to also delete quick_test_job,
alongside job_v1 and job_v2, before workspace deletion. Ensure the
quick_test_job returned by evaluator.submit is cleaned up after its result is
retrieved.

In
`@plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/SKILL.md`:
- Around line 74-84: Update the data.source comment in the anonymizer preview
submit example to remove the local-path option, leaving only HTTP(S) URLs and
fileset references as supported sources.

In
`@plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/run.md`:
- Around line 11-16: Ensure both workflow sites verify NeMo Platform readiness
before dependent operations: in
plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/run.md
lines 11-16, follow SETUP.md, check an existing instance, and replace the
non-enforcing curl health check with an enforced /health/ready check before
setup_model_filesets.py; in
plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/diagnose.md
lines 44-50, move the Files API readiness check before model-fileset setup while
preserving failure on an unavailable or unready service.

---

Nitpick comments:
In `@plugins/nemo-evaluator/tests/test_inline_bundle_execution.py`:
- Around line 55-63: Extract the duplicated _job_context setup into a shared
pytest fixture in conftest.py, consolidating it with _make_job_context from
test_evaluate_job.py and the equivalent helper in test_agent_evaluate.py. Update
all three test modules to use the shared fixture and remove their local helper
definitions while preserving the existing JobContext, StoragePaths, directory
creation, and LocalJobResults behavior.

In `@plugins/nemo-safe-synthesizer/tests/unit/test_cli.py`:
- Around line 8-13: Update
test_cli_exposes_runtime_but_not_removed_local_command to invoke the CLI with
["run-local"] instead of only requesting help, then assert a nonzero exit code
and that the output contains "No such command".
🪄 Autofix

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: CHILL

Plan: Enterprise

Run ID: 05868de5-b0a8-42e8-a4e4-66b17fdb3cdd

📥 Commits

Reviewing files that changed from the base of the PR and between b0bea3f and fadfffc.

⛔ Files ignored due to path filters (1)
  • sdk/python/nemo-platform/src/nemo_platform/cli/app.py is excluded by !sdk/**
📒 Files selected for processing (136)
  • docs/agents/optimization.mdx
  • docs/anonymizer/cli.mdx
  • docs/anonymizer/index.mdx
  • docs/anonymizer/sdk-resources.mdx
  • docs/anonymizer/tutorials/index.mdx
  • docs/anonymizer/tutorials/preview.mdx
  • docs/anonymizer/tutorials/run.mdx
  • docs/auditor/configs/index.mdx
  • docs/auditor/index.mdx
  • docs/auditor/sdk-resources.mdx
  • docs/auditor/targets/index.mdx
  • docs/auditor/targets/inference-gateway.mdx
  • docs/auditor/tutorials/index.mdx
  • docs/auditor/tutorials/run-audit-locally.mdx
  • docs/data-designer/cli.mdx
  • docs/data-designer/execution-modes.mdx
  • docs/data-designer/index.mdx
  • docs/data-designer/migration.mdx
  • docs/data-designer/sdk-resources.mdx
  • docs/data-designer/tutorials/basics.mdx
  • docs/data-designer/tutorials/index.mdx
  • docs/data-designer/tutorials/seeding.mdx
  • docs/evaluator/agent-eval/index.mdx
  • docs/evaluator/index.mdx
  • docs/evaluator/metrics/agent-configuration.mdx
  • docs/evaluator/metrics/agentic.mdx
  • docs/evaluator/metrics/index.mdx
  • docs/evaluator/metrics/llm-as-a-judge.mdx
  • docs/evaluator/metrics/manage-metrics.mdx
  • docs/evaluator/metrics/model-configuration.mdx
  • docs/evaluator/metrics/rag.mdx
  • docs/evaluator/metrics/remote.mdx
  • docs/evaluator/metrics/results.mdx
  • docs/evaluator/metrics/similarity.mdx
  • docs/evaluator/sdk-resources.mdx
  • docs/evaluator/test_doc_examples.py
  • docs/evaluator/tutorials/run-llm-judge-evaluation.mdx
  • docs/safe-synthesizer/about/host-local-development.mdx
  • docs/safe-synthesizer/about/index.mdx
  • docs/safe-synthesizer/about/jobs.mdx
  • docs/safe-synthesizer/about/reference.mdx
  • docs/safe-synthesizer/getting-started.mdx
  • docs/safe-synthesizer/tutorials/safe-synthesizer-101.mdx
  • docs/studio/data-designer-build.mdx
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/app.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/cli.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/cli_renderer.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/cli_state.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/commands.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/discovery.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/docs/ARCHITECTURE.md
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/docs/JOB.md
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/docs/QUICKSTART.md
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/function.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/job.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/job_context.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/job_results.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/run_dependencies.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/scheduler.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/tasks/dispatcher.py
  • packages/nemo_platform_plugin/tests/test_cli_hooks.py
  • packages/nemo_platform_plugin/tests/test_cli_renderer.py
  • packages/nemo_platform_plugin/tests/test_commands.py
  • packages/nemo_platform_plugin/tests/test_dispatcher.py
  • packages/nemo_platform_plugin/tests/test_job_context.py
  • packages/nemo_platform_plugin/tests/test_run_dependencies.py
  • packages/nemo_platform_plugin/tests/test_scheduler.py
  • packages/nmp_customization_common/src/nmp/customization_common/cli/overrides.py
  • packages/nmp_customization_common/src/nmp/customization_common/contributor/base.py
  • plugins/example-plugin/src/nemo_example_plugin/jobs/say_hello.py
  • plugins/example-plugin/tests/test_say_hello_job.py
  • plugins/nemo-agents/src/nemo_agents_plugin/jobs/evaluate_agent.py
  • plugins/nemo-agents/src/nemo_agents_plugin/jobs/fileset_io.py
  • plugins/nemo-agents/src/nemo_agents_plugin/skills/agents-optimize/SKILL.md
  • plugins/nemo-agents/tests/unit/test_utils.py
  • plugins/nemo-anonymizer/README.md
  • plugins/nemo-anonymizer/openapi/openapi.yaml
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/cli.py
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/functions/preview.py
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/SKILL.md
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/references/inputs.md
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/references/model-configs.md
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/references/preview-review.md
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/references/replace-strategies.md
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/references/rewrite-mode.md
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/workflows/autopilot.md
  • plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/workflows/interactive.md
  • plugins/nemo-anonymizer/tests/unit/test_cli.py
  • plugins/nemo-anonymizer/tests/unit/test_run_job.py
  • plugins/nemo-auditor/README.md
  • plugins/nemo-auditor/src/nemo_auditor/jobs/audit.py
  • plugins/nemo-auditor/src/nemo_auditor/sdk.py
  • plugins/nemo-auditor/src/nemo_auditor/skills/auditor/SKILL.md
  • plugins/nemo-auditor/tests/test_sdk_resources.py
  • plugins/nemo-automodel/src/nemo_automodel_plugin/cli/inputs.py
  • plugins/nemo-automodel/tests/test_cli.py
  • plugins/nemo-customizer/src/nemo_customizer/skills/nemo-customizer/references/troubleshooting.md
  • plugins/nemo-data-designer/README.md
  • plugins/nemo-data-designer/src/nemo_data_designer_plugin/cli/inputs.py
  • plugins/nemo-data-designer/src/nemo_data_designer_plugin/cli/main.py
  • plugins/nemo-data-designer/src/nemo_data_designer_plugin/cli/renderers.py
  • plugins/nemo-data-designer/tests/integration/test_preview_local_cli.py
  • plugins/nemo-evaluator/src/nemo_evaluator/jobs/agent_evaluate.py
  • plugins/nemo-evaluator/src/nemo_evaluator/jobs/evaluate.py
  • plugins/nemo-evaluator/src/nemo_evaluator/metric_refs.py
  • plugins/nemo-evaluator/src/nemo_evaluator/sdk/_executor.py
  • plugins/nemo-evaluator/src/nemo_evaluator/sdk/fs_utils.py
  • plugins/nemo-evaluator/src/nemo_evaluator/sdk/resources.py
  • plugins/nemo-evaluator/src/nemo_evaluator/task_refs.py
  • plugins/nemo-evaluator/tests/integration/test_agent_evaluate_job.py
  • plugins/nemo-evaluator/tests/integration/test_harbor_plugin_run.py
  • plugins/nemo-evaluator/tests/test_agent_evaluate.py
  • plugins/nemo-evaluator/tests/test_evaluate_job.py
  • plugins/nemo-evaluator/tests/test_inline_bundle_execution.py
  • plugins/nemo-evaluator/tests/test_sdk.py
  • plugins/nemo-evaluator/tests/test_skill_examples.py
  • plugins/nemo-optimization/examples/hermes-optimize/README.md
  • plugins/nemo-optimization/src/nemo_optimization/agents.py
  • plugins/nemo-optimization/tests/test_optimize_job.py
  • plugins/nemo-rl/src/nemo_rl_plugin/cli/inputs.py
  • plugins/nemo-safe-synthesizer/README.md
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/cli.py
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/SKILL.md
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/config-runs.md
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/config.md
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/diagnose.md
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/results.md
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/run.md
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/tasks/safe_synthesizer/__main__.py
  • plugins/nemo-safe-synthesizer/tests/e2e/test_local_synthesis.py
  • plugins/nemo-safe-synthesizer/tests/unit/test_cli.py
  • plugins/nemo-safe-synthesizer/tests/unit/test_local_run.py
  • plugins/nemo-safe-synthesizer/tests/unit/test_runtime.py
  • plugins/nemo-unsloth/src/nemo_unsloth_plugin/cli/inputs.py
  • plugins/nemo-unsloth/tests/test_cli.py
  • plugins/nemo-unsloth/tests/test_contributor.py
💤 Files with no reviewable changes (6)
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/config.md
  • plugins/nemo-evaluator/src/nemo_evaluator/sdk/fs_utils.py
  • plugins/nemo-evaluator/src/nemo_evaluator/sdk/resources.py
  • plugins/nemo-safe-synthesizer/tests/unit/test_local_run.py
  • plugins/nemo-safe-synthesizer/tests/e2e/test_local_synthesis.py
  • plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/skills/safe-synthesizer/workflows/results.md

Comment thread docs/anonymizer/cli.mdx
Comment on lines +14 to 17
| `nemo anonymizer preview submit` | Generated from `NemoFunction` | Local streaming preview. |
| `nemo anonymizer preview submit` | Generated from `NemoFunction` | Remote streaming preview against the plugin service. |
| `nemo anonymizer run run` | Generated from `NemoJob` | Local job execution in the CLI process. |
| `nemo anonymizer run submit` | Generated from `NemoJob` | Local job execution in the CLI process. |
| `nemo anonymizer run submit` | Generated from `NemoJob` | Submit an `anonymizer.run` job to the NeMo Platform Jobs worker. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Complete the remote-only documentation migration.

preview submit and run submit each describe both local and remote behavior. The preview tutorial also conflicts with its field reference, which still permits local paths.

  • docs/anonymizer/cli.mdx#L14-L17: Keep one row for each command. Remove stale local behavior.
  • docs/anonymizer/cli.mdx#L39-L42: Describe one preview submit execution path.
  • docs/anonymizer/cli.mdx#L60-L71: Keep the source matrix consistent with that path.
  • docs/anonymizer/cli.mdx#L98-L114: Keep run submit remote-only.
  • docs/anonymizer/cli.mdx#L139-L152: Remove duplicate command requirements.
  • docs/anonymizer/tutorials/preview.mdx#L179-L184: Update the field reference at line 82 to remove local-path support.
📍 Affects 2 files
  • docs/anonymizer/cli.mdx#L14-L17 (this comment)
  • docs/anonymizer/cli.mdx#L39-L42
  • docs/anonymizer/cli.mdx#L60-L71
  • docs/anonymizer/cli.mdx#L98-L114
  • docs/anonymizer/cli.mdx#L139-L152
  • docs/anonymizer/tutorials/preview.mdx#L179-L184
🤖 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 `@docs/anonymizer/cli.mdx` around lines 14 - 17, Complete the remote-only
documentation migration: in docs/anonymizer/cli.mdx lines 14-17 keep one row
each for preview submit and run submit, removing local behavior; update lines
39-42 and 60-71 to describe and source only the remote preview path; update
lines 98-114 to keep run submit remote-only; remove duplicate command
requirements in lines 139-152. In docs/anonymizer/tutorials/preview.mdx lines
179-184, update the preview field reference to remove local-path support and
align with the remote-only execution path.

Comment on lines +41 to +42
| `preview submit` | Local CLI process | Optional |
| `create submit` | Local CLI process | Optional |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove the obsolete local execution instructions.

preview submit and create submit appear twice with contradictory execution models. The local sections state that submit runs without NeMo Services. The later rows state that the same commands submit work to NeMo Services.

Delete or rewrite the local preview and create sections. Retain only the service submission behavior.

As per PR objectives, local run APIs and commands are removed.

Also applies to: 51-61

🤖 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 `@docs/data-designer/cli.mdx` around lines 41 - 42, Remove the obsolete local
execution entries for preview submit and create submit from the CLI
documentation, including the corresponding local sections around the referenced
rows. Retain only the rows describing submission through NeMo Services, so each
command has a single service-based execution model.

Comment on lines +259 to +265
nemo data-designer preview submit medical_notes.py --num-records 5
```

Generate a larger dataset locally:

```bash
nemo data-designer create run medical_notes.py --num-records 30
nemo data-designer create submit medical_notes.py --num-records 30

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Residual "local" prose left behind by the runsubmit rename. Both tutorials now issue submit commands under headings and lead-ins that still promise local execution, so each page contradicts itself.

  • docs/data-designer/tutorials/seeding.mdx#L259-L265: delete this block; it duplicates the "Submit to NeMo Services" commands at Lines 271-272. Also drop the "locally" labels at Lines 256 and 262 and the local-execution claim at Line 247.
  • docs/data-designer/tutorials/basics.mdx#L205-L205: rename the Line 196 heading "Local CLI Execution" to "CLI Submission", remove the "run locally through the CLI" option at Line 194, and drop "local" from Line 285.
📍 Affects 2 files
  • docs/data-designer/tutorials/seeding.mdx#L259-L265 (this comment)
  • docs/data-designer/tutorials/basics.mdx#L205-L205
🤖 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 `@docs/data-designer/tutorials/seeding.mdx` around lines 259 - 265, Update
docs/data-designer/tutorials/seeding.mdx at lines 259-265 by deleting the
duplicate submit command block, removing “locally” from the labels at lines 256
and 262, and removing the local-execution claim at line 247. In
docs/data-designer/tutorials/basics.mdx at line 205, rename “Local CLI
Execution” to “CLI Submission,” remove the “run locally through the CLI” option
at line 194, and remove “local” from line 285.

| Mode | Use Case | SDK Call |
|------|----------|----------|
| **Local execution** | Rapid prototyping, metric development, and synchronous workflows | `evaluator.run(metric=metric, dataset=dataset)` |
| **Platform job** | Durable platform execution with polling and result retrieval | `evaluator.submit(metric=metric, dataset=dataset)` |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make the execution-mode table distinct.

Line 21 duplicates the durable-job mode on line 22. Collapse the table to one platform-job mode, or restore the standalone SDK mode.

🤖 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 `@docs/evaluator/metrics/llm-as-a-judge.mdx` at line 21, Update the
execution-mode table around the “Platform job” row so it no longer duplicates
the durable-job mode on the adjacent row. Either consolidate the entries into
one platform-job mode or restore the intended standalone SDK mode, while keeping
each mode’s description and example accurate.

Comment on lines +24 to 25
| **Platform job** | Durable platform execution with polling and result retrieval | `evaluator.submit(metric=metric, dataset=dataset)` |
| **Durable remote job** | Production workloads that should run as platform jobs | `evaluator.submit(metric=metric, dataset=dataset)` |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Remove the duplicate execution mode.

Both rows describe durable platform jobs and use the same evaluator.submit(...) call. Keep one row or define different behavior.

🤖 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 `@docs/evaluator/metrics/remote.mdx` around lines 24 - 25, Remove the duplicate
execution-mode row from the execution modes table, keeping a single entry for
durable platform jobs with the existing evaluator.submit(metric=metric,
dataset=dataset) example.


- Prefer CLI surfaces. Generate YAML specs and run `nemo anonymizer ...` commands unless the user explicitly asks for Python.
- Always iterate via `nemo anonymizer preview run` or `nemo anonymizer preview submit` before running the full job. Previews are cheap and stream a small sample (default 10 records) with full detection traces.
- Always iterate via `nemo anonymizer preview submit` or `nemo anonymizer preview submit` before running the full job. Previews are cheap and stream a small sample (default 10 records) with full detection traces.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Name the full-job command.

The rule repeats nemo anonymizer preview submit. Replace the second command with nemo anonymizer run submit.

🤖 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
`@plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/SKILL.md`
at line 37, Update the iteration guidance in SKILL.md so it instructs users to
run “nemo anonymizer preview submit” first, followed by the full-job command
“nemo anonymizer run submit”; remove the duplicated preview command.

Comment on lines 22 to +23
4. **Build** — Write a YAML preview spec following the Output Template in SKILL.md. Default filename: `<text_column>_preview_spec.yaml` (e.g. `biography_preview_spec.yaml`).
5. **Preview** — Run the surface chosen in step 2:
- Local: `nemo anonymizer preview run --spec-file <path> --workspace <ws>`
- Plugin service: `nemo anonymizer preview submit --spec-file <path> --workspace <ws>`
5. **Preview** — Run `nemo anonymizer preview submit --spec-file <path> --workspace <ws>`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Verify platform readiness before submission.

Steps 4 and 5 submit work after only checking /openapi.json. Follow SETUP.md, set NMP_BASE_URL=http://localhost:8080, and require /health/ready to succeed before preview submit.

As per coding guidelines, local NeMo CLI operations must set NMP_BASE_URL and verify /health/ready.

🤖 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
`@plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/workflows/autopilot.md`
around lines 22 - 23, Update the Build and Preview workflow steps to require
local platform readiness before submission: set
NMP_BASE_URL=http://localhost:8080, follow SETUP.md, and verify that
/health/ready succeeds before running nemo anonymizer preview submit. Do not
allow preview submission based only on /openapi.json.

Source: Coding guidelines

Comment on lines +10 to +11
2. **Confirm the plugin service is mounted.** Run `curl -s http://localhost:8080/openapi.json | jq -r '.paths | keys[]' | grep '^/apis/anonymizer/'`. If nothing prints, the plugin service isn't loaded — `nemo setup` does not auto-mount it. Tell the user to run `nemo services run` (no `--services` flag) and rerun the check.
3. **Confirm input source** — Decide which supported input source you're working with: an `http(s)://` URL or a NeMo Platform fileset reference. If the user named a local file, ask whether to upload it to a fileset first (see `references/inputs.md`).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Set the platform endpoint and readiness check before CLI calls.

This workflow probes http://localhost:8080/openapi.json, but it does not set NMP_BASE_URL or check /health/ready. Later nemo commands can target a different platform or run before the local service is ready. Follow SETUP.md, set the base URL before all nemo commands, and require a successful readiness response.

Suggested setup guard
+export NMP_BASE_URL=http://localhost:8080
+curl --fail --silent "$NMP_BASE_URL/health/ready" >/dev/null
-curl -s http://localhost:8080/openapi.json | jq -r '.paths | keys[]' | grep '^/apis/anonymizer/'
+curl --fail --silent "$NMP_BASE_URL/openapi.json" | jq -r '.paths | keys[]' | grep '^/apis/anonymizer/'

As per coding guidelines, local NeMo CLI commands must set NMP_BASE_URL=http://localhost:8080 and verify /health/ready before proceeding.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
2. **Confirm the plugin service is mounted.** Run `curl -s http://localhost:8080/openapi.json | jq -r '.paths | keys[]' | grep '^/apis/anonymizer/'`. If nothing prints, the plugin service isn't loaded — `nemo setup` does not auto-mount it. Tell the user to run `nemo services run` (no `--services` flag) and rerun the check.
3. **Confirm input source** — Decide which supported input source you're working with: an `http(s)://` URL or a NeMo Platform fileset reference. If the user named a local file, ask whether to upload it to a fileset first (see `references/inputs.md`).
2. **Confirm the plugin service is mounted.** Run:
🧰 Tools
🪛 LanguageTool

[grammar] ~11-~11: Ensure spelling is correct
Context: ...cal file, ask whether to upload it to a fileset first (see references/inputs.md). 4. ...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 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
`@plugins/nemo-anonymizer/src/nemo_anonymizer_plugin/skills/anonymizer/workflows/interactive.md`
around lines 10 - 11, Update the workflow setup before the plugin-service probe
and every subsequent nemo command: set NMP_BASE_URL to http://localhost:8080 and
verify that /health/ready returns successfully. Stop and instruct the user to
resolve service readiness if the check fails, then retain the existing
openapi.json mounting check and input-source flow.

Source: Coding guidelines

Comment on lines +47 to +54
There is no plugin-specific CLI command for running an audit yet. Submit
audits through the SDK or the platform jobs service using the `auditor.audit`
job entry point.

## SDK quickstart

Every CLI verb has a matching Python SDK method on `client.auditor`, plus
`client.auditor.run(...)` for in-process execution that bypasses the jobs
service.
`client.auditor.submit(...)` for audit job submission.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep the CLI and skill instructions consistent.

This paragraph says that no plugin-specific CLI command exists. plugins/nemo-auditor/src/nemo_auditor/skills/auditor/SKILL.md documents nemo auditor audit submit on Line 81-83 and Line 103. Document the supported submit command here, or remove it from the skill if it is not registered.

🤖 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 `@plugins/nemo-auditor/README.md` around lines 47 - 54, Align the CLI
documentation in the README with the registered command described in the auditor
skill. Verify whether `nemo auditor audit submit` is supported; if registered,
document its usage in the README and update the statement that no
plugin-specific CLI command exists, otherwise remove the command references from
`SKILL.md`.

Comment on lines 396 to +400
def main(argv: list[str] | None = None) -> None:
"""Run the task entry point from either platform env vars or CLI args."""
argv = sys.argv[1:] if argv is None else argv
if not argv:
run_from_env()
return

parser = argparse.ArgumentParser(prog="python -m nemo_safe_synthesizer_plugin.tasks.safe_synthesizer")
subparsers = parser.add_subparsers(dest="command", required=True)
local_parser = subparsers.add_parser("run-local", help="Run a Safe Synthesizer job from a local spec file.")
local_parser.add_argument("--spec-file", required=True, type=Path)
local_parser.add_argument("--workspace", default="default")
local_parser.add_argument("--output-dir", required=True, type=Path)
local_parser.add_argument("--data-source", type=Path)

args = parser.parse_args(argv)
if args.command == "run-local":
run_local(
spec_file=args.spec_file,
workspace=args.workspace,
output_dir=args.output_dir,
data_source=args.data_source,
)
return

parser.error(f"unknown command: {args.command}")
"""Run the task entry point from platform environment variables."""
if argv:
raise SystemExit("This task module no longer accepts local execution commands.")
run_from_env()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Read process arguments before starting the task.

When callers invoke main() with its default value, supplied command-line arguments are ignored and run_from_env() starts. Normalize argv from sys.argv[1:] when it is None before the rejection check.

Proposed fix
+import sys
+
 def main(argv: list[str] | None = None) -> None:
     """Run the task entry point from platform environment variables."""
+    argv = sys.argv[1:] if argv is None else argv
     if argv:
         raise SystemExit("This task module no longer accepts local execution commands.")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def main(argv: list[str] | None = None) -> None:
"""Run the task entry point from either platform env vars or CLI args."""
argv = sys.argv[1:] if argv is None else argv
if not argv:
run_from_env()
return
parser = argparse.ArgumentParser(prog="python -m nemo_safe_synthesizer_plugin.tasks.safe_synthesizer")
subparsers = parser.add_subparsers(dest="command", required=True)
local_parser = subparsers.add_parser("run-local", help="Run a Safe Synthesizer job from a local spec file.")
local_parser.add_argument("--spec-file", required=True, type=Path)
local_parser.add_argument("--workspace", default="default")
local_parser.add_argument("--output-dir", required=True, type=Path)
local_parser.add_argument("--data-source", type=Path)
args = parser.parse_args(argv)
if args.command == "run-local":
run_local(
spec_file=args.spec_file,
workspace=args.workspace,
output_dir=args.output_dir,
data_source=args.data_source,
)
return
parser.error(f"unknown command: {args.command}")
"""Run the task entry point from platform environment variables."""
if argv:
raise SystemExit("This task module no longer accepts local execution commands.")
run_from_env()
import sys
def main(argv: list[str] | None = None) -> None:
"""Run the task entry point from platform environment variables."""
argv = sys.argv[1:] if argv is None else argv
if argv:
raise SystemExit("This task module no longer accepts local execution commands.")
run_from_env()
🤖 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
`@plugins/nemo-safe-synthesizer/src/nemo_safe_synthesizer_plugin/tasks/safe_synthesizer/__main__.py`
around lines 396 - 400, Update main to normalize a None argv to sys.argv[1:]
before the rejection check, then preserve the existing SystemExit behavior for
any supplied arguments and call run_from_env only when the normalized list is
empty.

@github-actions

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 31761/40402 78.6% 63.3%
Integration Tests 18321/38328 47.8% 20.3%

Signed-off-by: Ryan S <267728323+ironcommit@users.noreply.github.com>
@ironcommit
ironcommit force-pushed the remove-local-run-execution/rsadler branch from fadfffc to 68e6e54 Compare August 11, 2026 02:13

@mckornfield mckornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

questions/comments, I just stuck to NSS

```

## Run the local task directly
NeMo Safe Synthesizer no longer exposes a host-local workload command. Create synthesis jobs through the platform Jobs API or SDK so scheduling, storage, logs, and artifacts all flow through the supported job path.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for the "no longer", do we just want to burn the ships and not act like we ever supported it? this goes for all the plugins, but we'll still have the old behavior documented in the old docs versions

NeMo Safe Synthesizer has the following additional requirements:

- An NVIDIA GPU **on the host machine** with 80GB+ VRAM (check with `nvidia-smi`). This is separate from any GPU inside a NIM container; Safe Synthesizer training runs directly on the host.
- A GPU-capable Jobs backend with enough VRAM for the selected model and dataset.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should probably recommend the 80GB+ VRAM still, even if we're making this more generic to docker/k8s

"""Safe Synthesizer commands."""

@runtime_app.command("setup")
def setup_runtime_command(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this still required? I guess we're getting rid of "run", but we can still do submit with the local process? or is it docker only?

Comment thread docs/anonymizer/cli.mdx
## `nemo anonymizer preview`

Both `preview run` and `preview submit` take a spec file matching `PreviewRequest`.
Both `preview submit` and `preview submit` take a spec file matching `PreviewRequest`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

simple search/replace garbles this line

@mckornfield mckornfield changed the title chore!: remove run (local execution) CLI verbs across all services chore: remove run (local execution) CLI verbs across all services Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking breaking change (!-marked title) chore

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants