Skip to content

chore: bump python default to 3.13 - #463

Merged
binaryaaron merged 7 commits into
mainfrom
binaryaaron/support-python3.12
Jun 5, 2026
Merged

chore: bump python default to 3.13#463
binaryaaron merged 7 commits into
mainfrom
binaryaaron/support-python3.12

Conversation

@binaryaaron

@binaryaaron binaryaaron commented May 4, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Make Python 3.13 the default local, CI, GPU, Docker, and Slurm runtime while keeping 3.11-3.13 support.
  • Wire the unit-test matrix to use its selected Python version and move primary coverage/GPU defaults to 3.13.
  • Add typing_extensions backports for override/TypeIs and document that shared syntax stays Python 3.11-compatible until NMP moves to 3.12.

Test plan

  • uv locking - done
  • make test-e2e on gpu: done
  • slurm run - not done yet

Summary by CodeRabbit

  • New Features

    • Added typing-extensions dependency for improved type-checking.
  • Chores

    • Bumped default Python to 3.13 across builds, Docker images, CI, and local bootstrap.
    • CI coverage upload now runs from the 3.13 matrix; GPU smoke tests run under Python 3.13.
    • Slurm tooling now defaults to and honors a configurable Python version (default 3.13).
  • Documentation

    • Updated docs to state support for Python 3.11–3.13 and clarify Python 3.14+ is unsupported.

@codecov

codecov Bot commented May 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@binaryaaron
binaryaaron marked this pull request as ready for review May 4, 2026 20:07
@binaryaaron
binaryaaron requested review from a team as code owners May 4, 2026 20:07
mckornfield
mckornfield previously approved these changes May 4, 2026
Comment thread containers/Dockerfile.cuda Outdated
Comment thread src/nemo_safe_synthesizer/configurator/parameters.py
Comment thread README.md Outdated
Comment thread docs/tutorials/differential-privacy.ipynb
Comment thread README.md Outdated
@coderabbitai

coderabbitai Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 0874a029-c3a0-44de-96c7-4f31387bd495

📥 Commits

Reviewing files that changed from the base of the PR and between c69679f and f87a662.

📒 Files selected for processing (3)
  • .github/workflows/gpu-tests.yml
  • containers/Dockerfile.cuda
  • ruff.toml
✅ Files skipped from review due to trivial changes (1)
  • ruff.toml
🚧 Files skipped from review as they are similar to previous changes (1)
  • containers/Dockerfile.cuda
📜 Recent review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Unit Tests (3.13)
  • GitHub Check: Unit Tests (3.11)
  • GitHub Check: Unit Tests (3.12)
🧰 Additional context used
📓 Path-based instructions (2)
.github/workflows/*.{yaml,yml}

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use # with dashes for section dividers in GitHub Actions workflow files

Files:

  • .github/workflows/gpu-tests.yml
.github/**

⚙️ CodeRabbit configuration file

Review GitHub configuration for branch protection expectations, CODEOWNERS alignment, least privilege permissions, pinned actions where practical, and consistency with CONTRIBUTING.md.

Files:

  • .github/workflows/gpu-tests.yml
🧠 Learnings (4)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to **/*.py : Python version support: Project supports Python 3.11, 3.12, and 3.13; Python 3.14+ is not supported
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-03T23:06:56.798Z
Learning: Applies to **/*.py : Target Python 3.11–3.13 with modern syntax (`X | Y`, `list[str]`, `Self`). Python 3.14+ is not supported
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:10:13.353Z
Learning: Require commits to be cryptographically signed (SSH or GPG) on the main branch
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:10:13.353Z
Learning: All branch names (except main) must follow the pattern: <author>/<description>, <author>/<issue-id>-<description>, <author>/<type>/<description>, or <author>/<type>/<issue-id>-<description>, where author is lowercase alphanumeric with hyphens, type is one of: feature, bugfix, hotfix, release, docs, chore, test
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:10:13.353Z
Learning: All commits merged to main must follow Conventional Commits specification: <type>(<scope>): <description>, where type is one of: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:10:13.353Z
Learning: All contributions must be signed off with 'Signed-off-by' line in commit messages to certify Developer Certificate of Origin (DCO)
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:10:13.353Z
Learning: Use mise tasks for running code quality tools (ruff format, ruff lint, ty typecheck) instead of running tools directly; run 'mise run format' to auto-fix and 'mise run check' for read-only validation
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:10:13.353Z
Learning: New features must include tests; bug fixes must include regression tests
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:10:13.353Z
Learning: All pull requests must have at least one approval from CODEOWNERS before merging
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:10:13.353Z
Learning: Pull request titles should follow Conventional Commits format since PRs are squash-merged and the title becomes the commit message
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:10:13.353Z
Learning: Review detailed style guidelines for Python, Markdown, Dockerfiles, shell scripts, testing, and docstrings in STYLE_GUIDE.md
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:11:07.614Z
Learning: Use American English spelling: 'initialize' not 'initialise', 'recognize' not 'recognise', 'color' not 'colour'
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:11:07.614Z
Learning: Use canonical dataset names consistently: 'Input' (full data), 'Training' (training split), 'Test' (holdout split), 'Synthetic' (generated records). Order as training, synthetic, test
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:11:07.614Z
Learning: Add `__init__.py` files to every directory under `src/` that contains Python files. Never add `__init__.py` to `tests/` directories
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:11:07.614Z
Learning: Use single space between sentences, never two
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T22:11:07.614Z
Learning: Ensure newline at end of file with no trailing whitespace
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to **/*.py : Python version support: Project supports Python 3.11, 3.12, and 3.13; Python 3.14+ is not supported

Applied to files:

  • .github/workflows/gpu-tests.yml
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to tests/**/*.py : Mark CUDA-dependent tests with `pytest.mark.e2e`, `pytest.mark.smoke`, or `pytest.mark.requires_gpu`.

Applied to files:

  • .github/workflows/gpu-tests.yml
📚 Learning: 2026-06-03T23:08:50.142Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: tests/TESTING.md:0-0
Timestamp: 2026-06-03T23:08:50.142Z
Learning: Run tests using `mise run test` for unit tests (excludes slow, e2e, and smoke), `mise run test:unit-slow` for slow unit tests, `mise run test:smoke` for CPU smoke tests, `mise run test:smoke:gpu` for GPU smoke tests, `mise run test:e2e` for end-to-end tests, or `mise run test:ci` for CI unit tests with coverage

Applied to files:

  • .github/workflows/gpu-tests.yml
🔇 Additional comments (1)
.github/workflows/gpu-tests.yml (1)

93-93: LGTM!

Also applies to: 103-104


Walkthrough

This PR upgrades the project baseline to Python 3.13, adds typing-extensions and @override/TypeIs annotations, and updates CI, container images, Slurm scripts, docs, and notebook metadata to reflect the new Python version policy.

Changes

Python upgrade and typing improvements

Layer / File(s) Summary
Typing dependency and @override annotations
pyproject.toml, src/nemo_safe_synthesizer/configurator/pydantic_click_options.py, src/nemo_safe_synthesizer/preflight/base.py, src/nemo_safe_synthesizer/preflight/checks/*
Adds typing-extensions>=4.15.0 as a dependency and applies @override decorators across preflight check implementations; _is_basemodel() now returns TypeIs[type[BaseModel]] for type narrowing.
Python version bootstrap
.python-version, CONTRIBUTING.md, README.md, STYLE_GUIDE.md
Updates .python-version to 3.13 for local/dev bootstrap, revises prerequisites and contribution guidance to document supported range 3.11–3.13 with 3.13 as the pinned bootstrap version, and updates style guidance wording about Python 3.14 incompatibility.
CI workflows
.github/workflows/ci-checks.yml, .github/workflows/gpu-tests.yml
Switches Codecov/artifact upload conditions in the unit-test job to run only for matrix.python-version == '3.13' and adds strategy.fail-fast: false with a python-version: ["3.13"] matrix to the gpu-smoke-test job; GPU setup step now sources python-version from the matrix.
Container images and Docker config
containers/Dockerfile.cuda, containers/Dockerfile.test_ci, containers/README.md, docs/developer-guide/docker.md
Bumps Docker base images and PYTHON_VERSION build-arg defaults from 3.11→3.13 across CUDA and test CI Dockerfiles and updates container documentation.
Slurm scripts and dynamic venv selection
script/slurm/README.md, script/slurm/env_variables.sh, script/slurm/slurm_nss_matrix.sh
Adds NSS_PYTHON_VERSION (default 3.13), uses it to select/create cached uv venvs per Python version and NSS_VERSION, and logs the chosen Python version during install.
User guides and notebook metadata
docs/user-guide/getting-started.md, docs/user-guide/troubleshooting.md, docs/tutorials/*.ipynb
Updates user docs and Jupyter notebook metadata to reflect Python 3.11–3.13 support and revises the explanation for Python 3.14 incompatibility to reference vLLM's <3.14 support and dependency wheel readiness.
Lint config comment
ruff.toml
Adds an explanatory comment before target-version documenting the Python lint floor and intent to prevent pyupgrade from introducing newer-syntax rewrites.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes


Possibly related PRs

  • NVIDIA-NeMo/Safe-Synthesizer#491: Also modifies .github/workflows/ci-checks.yml to change the conditional logic for coverage artifact/Codecov upload.
  • NVIDIA-NeMo/Safe-Synthesizer#480: Overlaps changes to src/nemo_safe_synthesizer/preflight/checks/environment.py (this PR adds @override decorators; the other PR modifies VRAM headroom logic).

Suggested reviewers

  • kendrickb-nvidia
  • mckornfield
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'chore: bump python default to 3.13' clearly and concisely summarizes the main objective of the changeset—updating the default Python version from 3.11 to 3.13 across multiple configuration files and workflows.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch binaryaaron/support-python3.12

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

@coderabbitai coderabbitai Bot added docs Documentation-only change test Test-only addition or change chore Maintenance not tied to a user-visible change refactor Internal restructuring with no behavior change labels May 28, 2026
@greptile-apps

greptile-apps Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR promotes Python 3.13 to the default runtime across local development, CI, Docker, and Slurm tooling, while maintaining declared support for 3.11–3.13. It also adds typing_extensions backports for override and TypeIs so shared package code stays Python 3.11 syntax-compatible.

  • Default Python bumped to 3.13 in .python-version, both Dockerfiles, CI matrix, and Slurm scripts; uv.lock regenerated with updated dependency pins (click 8.4.1, huggingface-hub 1.17.0, cuda-tile 1.4.0, etc.).
  • typing-extensions>=4.15.0 added as a runtime dependency; @override and TypeIs imports switched from typing to typing_extensions across the preflight and configurator modules.
  • GPU smoke-test matrix now correctly passes python-version to the setup-gpu-test-env action (previously unused); both coverage upload steps align on the 3.13 matrix leg.

Confidence Score: 5/5

Safe to merge — all runtime and CI changes are mechanically consistent, previous workflow bugs are fixed, and the typing_extensions backports are correct for the stated 3.11 minimum.

The changes are well-scoped version bumps with matching lock-file regeneration. The GPU matrix variable that was previously declared but never consumed is now wired through correctly. Both coverage upload guards were updated together. The typing_extensions imports use the right backport strategy for the 3.11 floor. The only open item is a documentation nit where the README and docker guide record the PYTHON_VERSION default as 3.13 while the Dockerfile pins 3.13.13.

containers/README.md and docs/developer-guide/docker.md — PYTHON_VERSION default listed as 3.13 but Dockerfile.cuda defaults to 3.13.13.

Important Files Changed

Filename Overview
.github/workflows/gpu-tests.yml GPU smoke test matrix updated to Python 3.13; python-version is now correctly passed to setup-gpu-test-env action — previously flagged unused-matrix issue is resolved.
.github/workflows/ci-checks.yml Both coverage artifact upload and Codecov upload now gate on matrix.python-version == '3.13', consistent with the 3.11/3.12/3.13 matrix — previously flagged version mismatch is resolved.
containers/Dockerfile.cuda Default PYTHON_VERSION bumped from 3.11.13 to 3.13.13; documentation in README.md and docker.md records this as simply '3.13', losing the patch-level pin.
containers/Dockerfile.test_ci Base image bumped from python:3.11.13-slim to python:3.13.13-slim and ARG updated to match.
pyproject.toml Added typing-extensions>=4.15.0 runtime dependency to support override/TypeIs backports on Python 3.11.
src/nemo_safe_synthesizer/preflight/base.py Adds @OverRide from typing_extensions to four _narrow() overrides — correct backport approach for Python 3.11 compatibility.
src/nemo_safe_synthesizer/configurator/pydantic_click_options.py Narrows _is_basemodel return type from bool to TypeIs[type[BaseModel]] using typing_extensions backport — correct for Python 3.11 compat.
script/slurm/slurm_nss_matrix.sh NSS_PYTHON_VERSION default added (3.13) and applied to both venv path and uv venv creation, with improved log message.
ruff.toml Added comment explaining why target-version stays py311 despite 3.13 dev default — intentional lint floor to block pyupgrade rewrites.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[".python-version\n3.13"] --> B[Local dev bootstrap]
    A --> C[CI unit-test matrix\n3.11 / 3.12 / 3.13]
    C --> D{matrix.python-version\n== '3.13'?}
    D -- Yes --> E[Upload coverage artifact\n+ Codecov report]
    D -- No --> F[Run tests only]

    G["containers/Dockerfile.cuda\nARG PYTHON_VERSION=3.13.13"] --> H[GPU runtime image]
    I["containers/Dockerfile.test_ci\nFROM python:3.13.13-slim"] --> J[CI test image]

    K["gpu-tests.yml\nmatrix: python-version: 3.13"] --> L["setup-gpu-test-env\nwith: python-version: 3.13"]
    L --> M[GPU smoke tests]

    N["pyproject.toml\ntyping-extensions>=4.15.0"] --> O["typing_extensions.override\n→ preflight checks"]
    N --> P["typing_extensions.TypeIs\n→ pydantic_click_options"]
Loading

Reviews (5): Last reviewed commit: "fix(ci): honor GPU matrix python, align ..." | Re-trigger Greptile

@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: 2

🧹 Nitpick comments (2)
.github/workflows/gpu-tests.yml (1)

87-90: ⚡ Quick win

Remove or wire the new Python matrix; right now it is unused and misleading.

This matrix currently has one value (3.11) and is not referenced in any step, so it does not control runtime version. Either pass matrix.python-version into setup (and set default to 3.13 per this PR’s intent) or drop the matrix until it is used.

containers/README.md (1)

86-86: ⚡ Quick win

Document the exact default patch version to match the Dockerfile.

PYTHON_VERSION is documented as 3.13, but containers/Dockerfile.cuda defaults to 3.13.9. Use the exact value in this table to keep container builds reproducible and avoid version ambiguity.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: cb4853b6-1568-40ba-8e15-4f5251fc48df

📥 Commits

Reviewing files that changed from the base of the PR and between 3d9f82a and 6034d6e.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock, !uv.lock
📒 Files selected for processing (25)
  • .github/workflows/ci-checks.yml
  • .github/workflows/gpu-tests.yml
  • .python-version
  • CONTRIBUTING.md
  • Makefile
  • README.md
  • STYLE_GUIDE.md
  • containers/Dockerfile.cuda
  • containers/Dockerfile.test_ci
  • containers/README.md
  • docs/developer-guide/docker.md
  • docs/tutorials/differential-privacy.ipynb
  • docs/tutorials/safe-synthesizer-101.ipynb
  • docs/user-guide/getting-started.md
  • docs/user-guide/troubleshooting.md
  • pyproject.toml
  • script/slurm/README.md
  • script/slurm/env_variables.sh
  • script/slurm/slurm_nss_matrix.sh
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Unit Tests (3.12)
  • GitHub Check: Unit Tests (3.11)
  • GitHub Check: Unit Tests (3.13)
🧰 Additional context used
📓 Path-based instructions (27)
**/*.{sh,bash}

📄 CodeRabbit inference engine (AGENTS.md)

Never use ~ inside double-quoted strings in shell scripts -- it does not expand. Use $HOME or an absolute path instead

Files:

  • script/slurm/env_variables.sh
  • script/slurm/slurm_nss_matrix.sh
**/*.sh

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Shell scripts must use SPDX copyright headers, automatically added by make format

Use shebang #!/usr/bin/env bash (not #!/bin/bash) for shell scripts

Use set -eu minimum; use set -euo pipefail unless pipefail breaks piped-grep patterns

Use snake_case for shell script function names; use _ prefix for internal helpers

Always quote shell script variables ("$VAR", "${VAR}"); use defaults via ${VAR:-default}; use readonly for variables that should not change

Use REPO_ROOT=${REPO_ROOT:-$(git rev-parse --show-toplevel)} pattern for repo root detection in shell scripts

Use shellcheck to lint shell scripts; add # shellcheck disable=SCXXXX with a brief reason when disabling checks

Files:

  • script/slurm/env_variables.sh
  • script/slurm/slurm_nss_matrix.sh

⚙️ CodeRabbit configuration file

Review shell scripts for #!/usr/bin/env bash, set -euo pipefail where appropriate, quoting, repo root detection, and shellcheck compliance.

Files:

  • script/slurm/env_variables.sh
  • script/slurm/slurm_nss_matrix.sh
**/*.{py,md,yaml,yml,sh}

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use American English spelling: 'initialize' not 'initialise', 'recognize' not 'recognise', 'color' not 'colour'

Files:

  • script/slurm/env_variables.sh
  • docs/user-guide/getting-started.md
  • script/slurm/README.md
  • containers/README.md
  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • CONTRIBUTING.md
  • STYLE_GUIDE.md
  • docs/user-guide/troubleshooting.md
  • README.md
  • script/slurm/slurm_nss_matrix.sh
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • docs/developer-guide/docker.md
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
**/*.{py,sh,yaml,yml,md,toml}

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Include SPDX copyright header in every source file; use hash-comments for .py, .sh, .yaml, .yml and HTML-comment for .md; use hash-comments inside YAML frontmatter for markdown with frontmatter

Include newline at end of file with no trailing whitespace (enforced by pre-commit)

Use single space between sentences, never two

Files:

  • script/slurm/env_variables.sh
  • docs/user-guide/getting-started.md
  • script/slurm/README.md
  • containers/README.md
  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • CONTRIBUTING.md
  • STYLE_GUIDE.md
  • docs/user-guide/troubleshooting.md
  • README.md
  • pyproject.toml
  • script/slurm/slurm_nss_matrix.sh
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • docs/developer-guide/docker.md
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
**/*

⚙️ CodeRabbit configuration file

**/*: Review as a senior maintainer for NeMo Safe Synthesizer. Prioritize issues that can change behavior, break user workflows, weaken privacy guarantees, hide failures, make tests unreliable, or create maintenance risk. Avoid generic style commentary unless it points to a concrete project convention that automated tools will not catch.
Comment only when the finding is actionable and tied to changed code. For each finding, state the impact, the condition that triggers it, and the smallest practical fix. Prefer one precise comment over broad advice. Do not ask for refactors outside the PR scope unless the changed code creates the problem.
Review type guidance: - Potential issue: use for correctness bugs, data loss, privacy leaks,
security risks, broken public APIs, invalid config behavior, missing
validation, hidden failures, nondeterministic tests, or CI breakage.

  • Refactor suggestion: use for local maintainability problems introduced
    by the diff when they have clear future cost, such as duplicated setup,
    unclear boundaries, over-mocking, avoidable complexity, or opaque test
    helpers.
  • Nitpick: avoid in chill mode. Do not emit formatting, import-order,
    wording, or style-only comments unless automated tools cannot catch the
    issue and it affects maintainability.

Severity guidance: - Critical: security/privacy leaks, data loss, training/test/holdout
contamination, or broken release/package/core pipeline execution.

  • Major: incorrect generation/training/evaluation behavior, broken
    CLI/SDK public API, invalid config defaults or validators, or GPU/vLLM
    cleanup and process-isolation bugs likely to fail CI or production
    runs.
  • Minor: localized bugs, missing focused tests for changed behavior, or
    bad test patterns that weaken regression coverage.
  • Trivial: small cleanup with no behavior impact. Usually suppress in
    chill mode.
  • Info: context only. Avoid unless it helps reviewers understand risk.
    Safe-Synthesizer-specific review focus: - Data ...

Files:

  • script/slurm/env_variables.sh
  • docs/user-guide/getting-started.md
  • containers/Dockerfile.cuda
  • docs/tutorials/safe-synthesizer-101.ipynb
  • script/slurm/README.md
  • containers/README.md
  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • CONTRIBUTING.md
  • containers/Dockerfile.test_ci
  • STYLE_GUIDE.md
  • Makefile
  • docs/user-guide/troubleshooting.md
  • README.md
  • pyproject.toml
  • script/slurm/slurm_nss_matrix.sh
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • docs/developer-guide/docker.md
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
script/**

⚙️ CodeRabbit configuration file

Review standalone scripts for reproducibility and operational safety. Check argument validation, quoting, repo-root detection, environment variables, generated artifacts, external commands, GPU/cluster assumptions, and whether the script should be wired through Makefile or documented in README/docs.

Files:

  • script/slurm/env_variables.sh
  • script/slurm/README.md
  • script/slurm/slurm_nss_matrix.sh
**/*.{md,markdown,py}

📄 CodeRabbit inference engine (.cursor/rules/agent-markdown-style.mdc)

**/*.{md,markdown,py}: Avoid decorative bold (**text**) in list items, body text, and docstrings; use structural cues (headers, list markers, colons, backticks) for emphasis instead
Use backticks for code identifiers, paths, and CLI commands in markdown and docstrings

Files:

  • docs/user-guide/getting-started.md
  • script/slurm/README.md
  • containers/README.md
  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • CONTRIBUTING.md
  • STYLE_GUIDE.md
  • docs/user-guide/troubleshooting.md
  • README.md
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • docs/developer-guide/docker.md
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
**/*.{md,markdown}

📄 CodeRabbit inference engine (.cursor/rules/agent-markdown-style.mdc)

**/*.{md,markdown}: Bold is acceptable only in markdown tables where it's the conventional way to mark header-like cells in the body
Use ## headers to segment markdown sections instead of bold text
Use -- (em-dash) instead of - (hyphen) for asides in markdown

Files:

  • docs/user-guide/getting-started.md
  • script/slurm/README.md
  • containers/README.md
  • CONTRIBUTING.md
  • STYLE_GUIDE.md
  • docs/user-guide/troubleshooting.md
  • README.md
  • docs/developer-guide/docker.md
docs/**/*.md

📄 CodeRabbit inference engine (.cursor/rules/writing-docs.mdc)

docs/**/*.md: Classify documentation content using the Diataxis framework (TUTORIAL, HOW-TO, EXPLANATION, or REFERENCE) and ensure each page fits ONE type only
Use MkDocs Material admonition syntax (!!! note, !!! warning, ??? tip) for callouts and collapsible content
Use MkDocs Material tab syntax (=== "Tab Name") to present multiple variations or language-specific examples
Include code block metadata in MkDocs Material format: use title attribute for filenames and hl_lines for syntax highlighting of specific lines
Use Mermaid diagram syntax for flowcharts and visual representations in documentation
List prerequisites at the top of each documentation page before main content
End documentation pages with 'Next steps' section containing links to related content

Documentation must use MkDocs Material Markdown extensions: admonitions, content tabs, code blocks, Mermaid diagrams, task lists, footnotes, definition lists, and emoji

Classify documentation pages in docs/ as tutorial, how-to, explanation, or reference per the Diataxis framework; use MkDocs Material syntax (admonitions, tabs, code blocks with titles)

Use Mermaid diagrams with no spaces in node IDs, quote labels with special characters, no explicit colors or styles

Files:

  • docs/user-guide/getting-started.md
  • docs/user-guide/troubleshooting.md
  • docs/developer-guide/docker.md
**/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Markdown documentation files must use SPDX copyright headers, automatically added by make format

No decorative **bold** in markdown body text, list items, or docstrings; use headers, list markers, colons, and backticks for structure

Use -- (em-dash) for asides in markdown, not - (hyphen)

Use single backticks for code identifiers, paths, and CLI commands in markdown

Files:

  • docs/user-guide/getting-started.md
  • script/slurm/README.md
  • containers/README.md
  • CONTRIBUTING.md
  • STYLE_GUIDE.md
  • docs/user-guide/troubleshooting.md
  • README.md
  • docs/developer-guide/docker.md
**/*.{py,yaml,yml,md}

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use canonical dataset names consistently: 'input' for full user-supplied data, 'training' for fine-tuning split, 'test' for holdout split, 'synthetic' for model-produced records

Files:

  • docs/user-guide/getting-started.md
  • script/slurm/README.md
  • containers/README.md
  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • CONTRIBUTING.md
  • STYLE_GUIDE.md
  • docs/user-guide/troubleshooting.md
  • README.md
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • docs/developer-guide/docker.md
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
**/*.{py,md}

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use double backticks for inline code in docstrings; use single backticks in markdown

Enforce 120 character line length for code, comments, and docstrings (configured in ruff.toml)

Files:

  • docs/user-guide/getting-started.md
  • script/slurm/README.md
  • containers/README.md
  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • CONTRIBUTING.md
  • STYLE_GUIDE.md
  • docs/user-guide/troubleshooting.md
  • README.md
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • docs/developer-guide/docker.md
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
docs/**

⚙️ CodeRabbit configuration file

Review documentation as MkDocs Material content. Check Diataxis fit, accurate commands, internal links, code fences, and markdown style from STYLE_GUIDE.md.

Files:

  • docs/user-guide/getting-started.md
  • docs/tutorials/safe-synthesizer-101.ipynb
  • docs/user-guide/troubleshooting.md
  • docs/developer-guide/docker.md
.github/workflows/*.{yaml,yml}

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use # with dashes for section dividers in GitHub Actions workflows

Files:

  • .github/workflows/gpu-tests.yml
  • .github/workflows/ci-checks.yml
.github/**

⚙️ CodeRabbit configuration file

Review GitHub configuration for branch protection expectations, CODEOWNERS alignment, least privilege permissions, pinned actions where practical, and consistency with CONTRIBUTING.md.

Files:

  • .github/workflows/gpu-tests.yml
  • .github/workflows/ci-checks.yml
**/Dockerfile*

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use multi-stage builds for production images in Dockerfiles

Copy uv from ghcr.io/astral-sh/uv:<version> in Dockerfiles

Use --mount=type=cache for pip/uv caches and APT in Dockerfiles; prefer cache mounts over rm -rf to speed up rebuilds

Set ENV UV_LINK_MODE=copy when using cache mounts in Dockerfiles (hardlinks into cache layers vanish after unmount)

Use --no-install-recommends on all apt-get install invocations in Dockerfiles

Use non-root user (appuser) with NVIDIA_VISIBLE_DEVICES=all for GPU access in Dockerfiles

Use tini or --init for proper PID 1 signal handling in batch containers in Dockerfiles

Order COPY directives in Dockerfiles for cache efficiency (deps before source); include comments explaining cache invalidation points

Files:

  • containers/Dockerfile.cuda
  • containers/Dockerfile.test_ci
containers/**

⚙️ CodeRabbit configuration file

Review container changes against STYLE_GUIDE.md and containers/README.md. Check cache mounts, uv usage, non-root runtime behavior, CUDA settings, and copy order.

Files:

  • containers/Dockerfile.cuda
  • containers/README.md
  • containers/Dockerfile.test_ci
**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Use Python 3.11–3.13 with modern syntax (X | Y, list[str], Self). Python 3.14+ is not supported

Python source files must use SPDX copyright headers, automatically added by make format

Python files must pass ruff format and ruff lint checks

Python files must pass ty type checking

Use NSSBaseModel for config/parameter models in config/ which define user-facing configuration; use raw BaseModel or module-specific bases for data transfer objects and internal structures

Use BaseSettings for env/CLI settings with AliasChoices for per-field aliasing or env_prefix for simple settings where all fields share a common prefix

Include Field(description=...) as the canonical field docstring for Pydantic models

Prefer assignment-style field definitions (type = Field(default=..., description="...")) for Pydantic models to ensure type checkers correctly synthesize __init__ signatures

Use Annotated only when the field carries additional metadata beyond Field() (validators, AutoParam, constraints, discriminated unions), not for complex types like Literal[...] alone

Include valid ranges in the description when constraints won't appear in rendered API docs (e.g., 'Must be in (0, 1).')

Prefer @dataclass(frozen=True) for immutable value objects and validators; mutable @dataclass acceptable for builders, accumulators, and pipeline state

Use field(default_factory=list) for mutable defaults in dataclasses, never bare = []

Use StrEnum for string-valued enums used in configs/serialization; use plain Enum for internal-only named constants

Use observability.get_logger(__name__) for logging, never logging.getLogger() or structlog.get_logger() directly

Use category loggers with .runtime for internals, .user for progress/results, .system for system events

Never use print() for operational output; use click.echo() for CLI output or sys.stdout.write() for raw output in tools

Use extra={} for structured data that downst...

Files:

  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
src/**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Python source files in src/ directory must follow Google-style docstring format for auto-generated API reference

Never use assert for validation in library code (can be stripped by -O); use if/raise for input validation. assert is fine in tests where pytest relies on it

Use print() only in tests, standalone scripts, and tooling; use get_logger(__name__) or click.echo() in library code

Files:

  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py

⚙️ CodeRabbit configuration file

Review library code against STYLE_GUIDE.md. Focus on behavior, API contracts, error handling, resource cleanup, typing, logging, and user-facing failures. Public APIs and nontrivial functions need Google-style docstrings.

Files:

  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
src/**/

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Every directory under src/ that contains Python files must include an __init__.py file, even if empty

Files:

  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
**/Makefile

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use Makefile target help format: target-name: ## Description for make help auto-generation; use .PHONY declaration directly above each target; use tab indentation

Place variables in ### CONFIGURATION ### section in Makefiles

Files:

  • Makefile
Makefile

⚙️ CodeRabbit configuration file

Treat Makefile targets as the validation source of truth. Check that new targets are documented with target-name: ## Description, declared .PHONY where appropriate, and use uv/mise conventions.

Files:

  • Makefile
README.md

⚙️ CodeRabbit configuration file

Treat README.md as the project overview. Check that setup, usage, and links stay consistent with CONTRIBUTING.md, Makefile, and docs/.

Files:

  • README.md
pyproject.toml

📄 CodeRabbit inference engine (.cursor/rules/repo-navigation.mdc)

Package metadata, dependencies, and extras (cpu/cu128/engine) should be configured in pyproject.toml

Files:

  • pyproject.toml

⚙️ CodeRabbit configuration file

Treat pyproject.toml as high-risk. Check package metadata, uv indexes, dependency groups, optional extras, Python version bounds, hatch config, ty config, script entry points, dependency consistency, and whether changes require regenerating uv.lock.

Files:

  • pyproject.toml
**/*.toml

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use spaces around = for key-value pairs in TOML files

Use # comment for comments in TOML files; use inline comments for dependency pins

Files:

  • pyproject.toml
**/pyproject.toml

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Order sections in pyproject.toml as: [project], [dependency-groups], [project.optional-dependencies], [tool.uv], [build-system], [tool.*]

Files:

  • pyproject.toml
src/nemo_safe_synthesizer/configurator/**/*.py

⚙️ CodeRabbit configuration file

Review Pydantic-to-Click mapping carefully. Check option names, type conversion, nullable sub-config behavior, validation errors, help text, and compatibility with parse_overrides().

Files:

  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: All branches (except `main`) must follow the naming pattern: `<author>/<description>`, `<author>/<issue-id>-<description>`, `<author>/<type>/<description>`, or `<author>/<type>/<issue-id>-<description>` where author is lowercase alphanumeric with hyphens, type is one of: feature, bugfix, hotfix, release, docs, chore, test
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: All commits merged to `main` must follow Conventional Commits specification with format `<type>(<scope>): <description>` where type is one of: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: All contributions must be signed off with `Signed-off-by` line added to commit messages to certify Developer Certificate of Origin (DCO)
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: All commits must have verified signatures (SSH or GPG signing required) to merge to `main` branch
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Use `make format` to auto-fix code style issues: runs ruff format, import sorting, and copyright header addition
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Use `make check` to run read-only CI checks: format-check, lint, type-check, and copyright header verification
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Run `make test` to execute unit tests (excludes slow unit tests, smoke and e2e tests) before submitting PR
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: New features must include tests before submitting PR
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Bug fixes must include regression tests before submitting PR
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Documentation pages must be added to `mkdocs.yml` navigation section to appear in sidebar
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Pull request titles must follow Conventional Commits format as they become the commit message after squash merge
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Address all review comments in PR, respond to comments in GitHub console (not in private), and resolve comments only when requested change has been made
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Use Assignees list on PR to indicate who is expected to take next action
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Re-request review from reviewers using the circular arrow button after pushing changes in response to feedback
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: GitHub issues must be classified with one Type from: Bug, Feature, Question, or Task
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Issues and PRs should have Priority and Size fields set in the Safe Synthesizer Development GitHub project for backlog ordering and effort tracking
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Apply relevant labels from the canonical label list to issues and PRs for categorization and routing
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Release versions must follow PEP440 format with major.minor.patch numbering and optional rcN suffix, tagged with `v` prefix in git
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Use `make publish-internal` to build wheel and upload to NVIDIA Artifactory (requires TWINE_REPOSITORY_URL, TWINE_USERNAME, TWINE_PASSWORD environment variables)
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Create an issue first to discuss proposed changes before implementing and opening a PR
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Code owners from CODEOWNERS file will be automatically assigned to review PRs affecting src/ and test/ files
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:40:00.165Z
Learning: Use GitHub Discussions instead of Issues for general questions
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:41:06.664Z
Learning: Never add `__init__.py` files under `tests/` as test directories are discovered by pytest via rootdir/testpaths, not Python package imports
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-05-28T22:41:06.664Z
Learning: Be consistent with local code style; local consistency matters more than global rules. When touching legacy code, migrate toward these conventions where practical
🔇 Additional comments (19)
pyproject.toml (1)

39-39: LGTM!

src/nemo_safe_synthesizer/configurator/pydantic_click_options.py (1)

29-29: LGTM!

Also applies to: 112-113

src/nemo_safe_synthesizer/preflight/base.py (1)

75-75: LGTM!

Also applies to: 273-275, 288-290, 303-305, 322-324

src/nemo_safe_synthesizer/preflight/checks/advisory.py (1)

8-8: LGTM!

Also applies to: 33-34, 50-51

src/nemo_safe_synthesizer/preflight/checks/dataframe.py (1)

8-8: LGTM!

Also applies to: 43-44, 59-60, 86-87, 111-112, 127-128, 144-146, 150-152

src/nemo_safe_synthesizer/preflight/checks/environment.py (1)

12-12: LGTM!

Also applies to: 47-48, 274-275, 339-340, 378-379

src/nemo_safe_synthesizer/preflight/checks/metadata.py (1)

8-8: LGTM!

Also applies to: 48-49

.python-version (1)

1-1: LGTM!

CONTRIBUTING.md (1)

30-30: LGTM!

.github/workflows/ci-checks.yml (1)

144-145: LGTM!

Also applies to: 162-168

containers/Dockerfile.cuda (1)

66-66: LGTM!

containers/Dockerfile.test_ci (1)

1-1: LGTM!

Makefile (1)

79-82: ⚡ Quick win

Parameterize the venv Python version in the Makefile to preserve the CI matrix behavior.

Makefile’s .venv target hardcodes uv venv ... --python 3.13, which can defeat the 3.11/3.12/3.13 matrix if CI calls make bootstrap-nss and .venv isn’t already created with the job’s matrix Python.

Smallest fix: make the version configurable (e.g., PYTHON_VERSION ?= 3.13, then uv venv ... --python $(PYTHON_VERSION)), and wire PYTHON_VERSION from the workflow/matrix used by .github/actions/setup-python-env (or ensure that action pre-creates .venv before make bootstrap-nss).

.venv: verify-python-version ## Create a Python virtual environment
	uv venv --seed --allow-existing --python 3.13
script/slurm/env_variables.sh (1)

32-32: LGTM!

script/slurm/slurm_nss_matrix.sh (1)

109-114: LGTM!

Also applies to: 122-122

script/slurm/README.md (1)

118-118: LGTM!

STYLE_GUIDE.md (1)

119-121: LGTM!

docs/user-guide/troubleshooting.md (1)

17-17: LGTM!

Also applies to: 115-118

docs/tutorials/safe-synthesizer-101.ipynb (1)

234-234: LGTM!

Comment thread docs/developer-guide/docker.md Outdated
Comment thread docs/user-guide/getting-started.md Outdated
mckornfield
mckornfield previously approved these changes Jun 1, 2026
binaryaaron and others added 5 commits June 4, 2026 19:42
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
- Clear outputs from differential-privacy.ipynb tutorial notebook
- Move Python 3.11 syntax-compatibility note from README to CONTRIBUTING
- Fix cu128 -> cu129 extras mismatch in docker.md comparison table
- Align getting-started prerequisite line with markdown style rules

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>

@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.

🧹 Nitpick comments (1)
.github/workflows/ci-checks.yml (1)

166-179: ⚡ Quick win

Consider aligning artifact upload with Codecov upload to use Python 3.13 for both.

The coverage artifact upload (line 166) still uses matrix.python-version == '3.11', while the Codecov upload (line 173) now uses matrix.python-version == '3.13'. Since 3.13 is the new primary coverage Python per the PR objectives, aligning both to 3.13 would make the "canonical coverage source" clearer and easier to maintain.

♻️ Proposed alignment
       - name: Upload coverage report
         uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
-        if: matrix.python-version == '3.11'
+        if: matrix.python-version == '3.13'
         with:
           name: coverage-report
           path: coverage.json
           retention-days: 30

Based on learnings: the PR objectives state that 3.13 is now the primary coverage and GPU default.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 2b4d4c55-c435-4ee9-ae77-d9c3e3e29502

📥 Commits

Reviewing files that changed from the base of the PR and between 2a2de57 and 253fe02.

⛔ Files ignored due to path filters (2)
  • mise.lock is excluded by !**/*.lock, !mise.lock
  • uv.lock is excluded by !**/*.lock, !uv.lock
📒 Files selected for processing (24)
  • .github/workflows/ci-checks.yml
  • .github/workflows/gpu-tests.yml
  • .python-version
  • CONTRIBUTING.md
  • README.md
  • STYLE_GUIDE.md
  • containers/Dockerfile.cuda
  • containers/Dockerfile.test_ci
  • containers/README.md
  • docs/developer-guide/docker.md
  • docs/tutorials/differential-privacy.ipynb
  • docs/tutorials/safe-synthesizer-101.ipynb
  • docs/user-guide/getting-started.md
  • docs/user-guide/troubleshooting.md
  • pyproject.toml
  • script/slurm/README.md
  • script/slurm/env_variables.sh
  • script/slurm/slurm_nss_matrix.sh
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
✅ Files skipped from review due to trivial changes (11)
  • docs/tutorials/safe-synthesizer-101.ipynb
  • .python-version
  • README.md
  • docs/tutorials/differential-privacy.ipynb
  • STYLE_GUIDE.md
  • docs/developer-guide/docker.md
  • docs/user-guide/troubleshooting.md
  • src/nemo_safe_synthesizer/preflight/checks/metadata.py
  • src/nemo_safe_synthesizer/preflight/checks/advisory.py
  • script/slurm/README.md
  • src/nemo_safe_synthesizer/preflight/checks/environment.py
🚧 Files skipped from review as they are similar to previous changes (7)
  • docs/user-guide/getting-started.md
  • script/slurm/env_variables.sh
  • .github/workflows/gpu-tests.yml
  • pyproject.toml
  • src/nemo_safe_synthesizer/configurator/pydantic_click_options.py
  • src/nemo_safe_synthesizer/preflight/base.py
  • src/nemo_safe_synthesizer/preflight/checks/dataframe.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Unit Tests (3.12)
  • GitHub Check: Unit Tests (3.11)
  • GitHub Check: Unit Tests (3.13)
🧰 Additional context used
📓 Path-based instructions (12)
.github/workflows/*.{yaml,yml}

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use # with dashes for section dividers in GitHub Actions workflow YAML files

Files:

  • .github/workflows/ci-checks.yml
.github/**

⚙️ CodeRabbit configuration file

Review GitHub configuration for branch protection expectations, CODEOWNERS alignment, least privilege permissions, pinned actions where practical, and consistency with CONTRIBUTING.md.

Files:

  • .github/workflows/ci-checks.yml
**/*.{md,markdown,py}

📄 CodeRabbit inference engine (.cursor/rules/agent-markdown-style.mdc)

**/*.{md,markdown,py}: Avoid decorative bold (**text**) in list items, body text, and docstrings; use structural cues (headers, list markers, colons, backticks) for emphasis instead
Use backticks for code identifiers, paths, and CLI commands in markdown and docstrings

Files:

  • CONTRIBUTING.md
  • containers/README.md
**/*.{md,markdown}

📄 CodeRabbit inference engine (.cursor/rules/agent-markdown-style.mdc)

**/*.{md,markdown}: Bold is acceptable only in markdown tables where it's the conventional way to mark header-like cells in the body
Use ## headers to segment markdown sections instead of bold text
Use -- (em-dash) instead of - (hyphen) for asides in markdown

Files:

  • CONTRIBUTING.md
  • containers/README.md
**/*.{py,sh,yaml,yml,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All source files (.py, .sh, .yaml, .yml, .md) must include SPDX copyright headers; use 'mise run format' to add them automatically

Files:

  • CONTRIBUTING.md
  • containers/README.md
  • script/slurm/slurm_nss_matrix.sh
**/*.md

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Avoid decorative **bold** in markdown body text, list items, or docstrings. Use headers, list markers, colons, and backticks for structure. Bold is acceptable in table header-like cells and MkDocs Material card grid titles

Use -- (em-dash) for asides in markdown, not - (hyphen)

Files:

  • CONTRIBUTING.md
  • containers/README.md
**/*

⚙️ CodeRabbit configuration file

**/*: Review as a senior maintainer for NeMo Safe Synthesizer. Prioritize issues that can change behavior, break user workflows, weaken privacy guarantees, hide failures, make tests unreliable, or create maintenance risk. Avoid generic style commentary unless it points to a concrete project convention that automated tools will not catch.
Comment only when the finding is actionable and tied to changed code. For each finding, state the impact, the condition that triggers it, and the smallest practical fix. Prefer one precise comment over broad advice. Do not ask for refactors outside the PR scope unless the changed code creates the problem.
Review type guidance: - Potential issue: use for correctness bugs, data loss, privacy leaks,
security risks, broken public APIs, invalid config behavior, missing
validation, hidden failures, nondeterministic tests, or CI breakage.

  • Refactor suggestion: use for local maintainability problems introduced
    by the diff when they have clear future cost, such as duplicated setup,
    unclear boundaries, over-mocking, avoidable complexity, or opaque test
    helpers.
  • Nitpick: avoid in chill mode. Do not emit formatting, import-order,
    wording, or style-only comments unless automated tools cannot catch the
    issue and it affects maintainability.

Severity guidance: - Critical: security/privacy leaks, data loss, training/test/holdout
contamination, or broken release/package/core pipeline execution.

  • Major: incorrect generation/training/evaluation behavior, broken
    CLI/SDK public API, invalid config defaults or validators, or GPU/vLLM
    cleanup and process-isolation bugs likely to fail CI or production
    runs.
  • Minor: localized bugs, missing focused tests for changed behavior, or
    bad test patterns that weaken regression coverage.
  • Trivial: small cleanup with no behavior impact. Usually suppress in
    chill mode.
  • Info: context only. Avoid unless it helps reviewers understand risk.
    Safe-Synthesizer-specific review focus: - Data ...

Files:

  • CONTRIBUTING.md
  • containers/Dockerfile.cuda
  • containers/Dockerfile.test_ci
  • containers/README.md
  • script/slurm/slurm_nss_matrix.sh
containers/Dockerfile*

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use multi-stage builds for production Docker images

Copy uv from ghcr.io/astral-sh/uv:<version> in Dockerfiles

Use --mount=type=cache for pip/uv caches and APT in Dockerfiles (/var/cache/apt, /var/lib/apt/lists). Prefer cache mounts over rm -rf /var/lib/apt/lists/*

Set ENV UV_LINK_MODE=copy in Dockerfiles when using cache mounts

Use --no-install-recommends on all apt-get install invocations in Dockerfiles

Use non-root user (appuser) with NVIDIA_VISIBLE_DEVICES=all for GPU access in Dockerfiles

Use tini or --init for proper PID 1 signal handling in batch containers (Dockerfiles)

Order COPY directives in Dockerfiles for cache efficiency (deps before source)

Include comments in Dockerfiles explaining cache invalidation points

Files:

  • containers/Dockerfile.cuda
  • containers/Dockerfile.test_ci
containers/**

⚙️ CodeRabbit configuration file

Review container changes against STYLE_GUIDE.md and containers/README.md. Check cache mounts, uv usage, non-root runtime behavior, CUDA settings, and copy order.

Files:

  • containers/Dockerfile.cuda
  • containers/Dockerfile.test_ci
  • containers/README.md
**/*.{sh,bash}

📄 CodeRabbit inference engine (AGENTS.md)

Never use ~ inside double-quoted strings in shell scripts -- use $HOME or an absolute path instead

Files:

  • script/slurm/slurm_nss_matrix.sh
**/*.sh

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use shebang #!/usr/bin/env bash in shell scripts (not #!/bin/bash)

Use minimum safety floor set -eu in shell scripts. Use set -euo pipefail unless pipefail breaks piped-grep patterns in the script

Use snake_case for shell script function names, _ prefix for internal helper functions

Always quote shell variables ("$VAR", "${VAR}"), use defaults via ${VAR:-default}. Use readonly for variables that should not change after assignment

Use REPO_ROOT=${REPO_ROOT:-$(git rev-parse --show-toplevel)} for repo root detection in shell scripts

Use shellcheck to lint shell scripts. When disabling a check, add # shellcheck disable=SCXXXX with a brief reason

Files:

  • script/slurm/slurm_nss_matrix.sh

⚙️ CodeRabbit configuration file

Review shell scripts for #!/usr/bin/env bash, set -euo pipefail where appropriate, quoting, repo root detection, and shellcheck compliance.

Files:

  • script/slurm/slurm_nss_matrix.sh
script/**

⚙️ CodeRabbit configuration file

Review standalone scripts for reproducibility and operational safety. Check argument validation, quoting, repo-root detection, environment variables, generated artifacts, external commands, GPU/cluster assumptions, and whether the script should be wired through Makefile or documented in README/docs.

Files:

  • script/slurm/slurm_nss_matrix.sh
🧠 Learnings (43)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to **/*.py : Python version support: Project supports Python 3.11, 3.12, and 3.13; Python 3.14+ is not supported
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-03T23:06:56.798Z
Learning: Applies to **/*.py : Target Python 3.11–3.13 with modern syntax (`X | Y`, `list[str]`, `Self`). Python 3.14+ is not supported
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: Require verified commits using either SSH or GPG signing on all commits
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: All commits must include a Signed-off-by trailer (DCO sign-off) certifying your right to contribute the code
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: Branch names must follow the pattern: <author>/<description>, <author>/<issue-id>-<description>, <author>/<type>/<description>, or <author>/<type>/<issue-id>-<description>, where author is lowercase alphanumeric, and type is one of: feature, bugfix, hotfix, release, docs, chore, test
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: All commits merged to main must follow Conventional Commits specification with format <type>(<scope>): <description>, where type is one of: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: Run 'mise run format' to auto-fix code style (ruff format, import sorting, copyright headers) before submitting a PR
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: Run 'mise run check' to perform read-only local quality checks (format, lint, typecheck, copyright) before submitting a PR
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: All new features must include tests; bug fixes must include regression tests
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: PR titles should follow Conventional Commits format as they become the commit message after squash merge
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: Use the project's pinned tool versions from .mise.toml and mise.lock (installed via 'make setup') when running ruff, ty, and other development tools
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: Release versions must follow PEP440 with major, minor, and patch numbers; use stable releases and release candidates only (rcN suffix, no dash); GitHub tags must start with 'v' prefix
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:26:41.911Z
Learning: Use 'mise run publish:internal' to build a wheel and upload to NVIDIA Artifactory (requires TWINE_REPOSITORY_URL, TWINE_USERNAME, TWINE_PASSWORD environment variables)
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use American English spelling: 'initialize' not 'initialise', 'recognize' not 'recognise', 'color' not 'colour'
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: For Python data models, use `NSSBaseModel` for config/parameter models in `config/` which define the user-facing configuration of NSS. Use raw `BaseModel` or module-specific bases (e.g., `ReportBaseModel`) for data transfer objects and internal structures
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use `BaseSettings` for env/CLI settings in Pydantic models, preferring `AliasChoices` on individual fields for both Python name and env var name mapping (e.g., `validation_alias=AliasChoices('config_path', 'NSS_CONFIG')`)
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Always include `Field(description=...)` as the canonical field docstring for Pydantic models, as griffe-pydantic extracts it for API reference and the configurator uses it for CLI help text
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Prefer assignment style for Pydantic model fields (`type = Field(default=..., description='...')`) because type checkers understand `default`, `default_factory`, and `alias` in assignment-style `Field()` and synthesize correct `__init__` signatures
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use `Annotated` only when the field carries additional metadata beyond `Field()` -- `ValueValidator`, `AutoParam`, `DependsOnValidator`, reusable constrained type aliases, nested-type constraints, or discriminated unions
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: For defaults with `Annotated` in Pydantic models, put the default as a bare assignment (`= value`), not inside `Field(default=...)`. Exception: `default_factory` has no bare-assignment equivalent, so use assignment-style `Field(default_factory=...)` even when the type is `Annotated[...]`
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Include valid ranges in the `description` when constraints won't appear in rendered API docs (e.g., 'Must be in (0, 1).')
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Prefer `dataclass(frozen=True)` for immutable value objects and validators. Mutable `dataclass` is acceptable for builders, accumulators, and pipeline state
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use `field(default_factory=list)` for mutable defaults in dataclasses, never `= []`
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use `StrEnum` for string-valued enums used in configs/serialization. Use plain `Enum` for internal-only named constants
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use `extra={}` in logger calls for data that downstream tools should query or aggregate (metrics, counts, durations). Use f-strings for human-readable context that doesn't need machine parsing
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use collection ABCs for function arguments (`Sequence`, `Mapping`, `Iterable`) so callers can pass any compatible container; use concrete types for return values so callers know exactly what they get
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use `Protocol` for structural subtyping when you need duck-typing boundaries
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Prefer `match`/`case` for dispatch on types or tagged values. `if`/`elif` is acceptable for simple boolean predicates
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use comprehensions over imperative loops where intent is clearer. Avoid multiple `for` clauses -- optimize for readability, not conciseness
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use clamping/saturation over raising when out-of-range inputs shouldn't crash the system -- prefer returning a bounded value with a log warning over raising (e.g., `p = max(0.0, min(p, 1.0))`)
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use builder pattern with `with_*` methods returning `Self` for fluent API design
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Avoid deeply nested code -- if a function has more than two levels of indentation beyond `def`, it needs refactoring using guard clauses, extracted helpers, generators, or functional decomposition
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use `_determine_*` for private methods that perform internal resolution, and `_resolve_*` for private methods that handle config resolution
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use canonical dataset names consistently in code, docs, configs, logs, and tests: 'Input' for full user-supplied data, 'Training' for the fine-tuning split, 'Test' for the holdout split, 'Synthetic' for records produced by the model. In Pydantic fields use `input`, `training`, `test`, `synthetic`. In DataFrame variables use `input_df`, `training_df`, `test_df`, `synthetic_df`
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: In user-facing text (docs, logs, error messages), use 'holdout' to refer to the action of withholding data and 'test' for the resulting dataset. Use 'holdout test set' when both concepts appear together
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use relative imports in `src/` (e.g., `from ..observability import get_logger`), absolute imports in `tests/` (e.g., `from nemo_safe_synthesizer.observability import get_logger`)
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: For backends with expensive resources, use the `_torn_down` guard pattern to ensure idempotent and safe multi-step cleanup
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Document side effects, thread safety, and idempotency guarantees in docstrings where applicable
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use `Example:` sections with working code in public API method docstrings
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use single backticks for code identifiers, paths, and CLI commands in markdown. In Python docstrings, use double backticks for inline code
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use `#MISE description=...` on public file tasks and `description` on public TOML tasks so `mise tasks` is useful. Use `#USAGE` comments in file tasks or `usage` in TOML tasks for arguments that need validation or help text
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Every directory under `src/` that contains Python files must include an `__init__.py` file, even if empty, to ensure the directory is recognized as a Python package
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Never add `__init__.py` files under `tests/`. Test directories are discovered by pytest via `rootdir` and `testpaths`, not through Python package imports
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Include SPDX copyright headers at the top of every source file. Use hash-comments for `.py`, `.sh`, `.yaml`, `.yml`. Use HTML-comment for `.md` files. For `.md` files with YAML frontmatter, use hash-comment headers inside the frontmatter block
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Ensure newline at end of file, no trailing whitespace in all files
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Use single space between sentences, never two, in all text files
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: Be consistent with local conventions. If the code around you follows a convention, follow it too -- even if this guide says otherwise. Local consistency matters more than global rules
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer

Timestamp: 2026-06-04T20:28:04.212Z
Learning: When touching legacy code, migrate toward the stated conventions where practical
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to **/*.py : Use ty (Pyright) for type checking; run via mise run check

Applied to files:

  • .github/workflows/ci-checks.yml
  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:50.142Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: tests/TESTING.md:0-0
Timestamp: 2026-06-03T23:08:50.142Z
Learning: Run tests using `mise run test` for unit tests (excludes slow, e2e, and smoke), `mise run test:unit-slow` for slow unit tests, `mise run test:smoke` for CPU smoke tests, `mise run test:smoke:gpu` for GPU smoke tests, `mise run test:e2e` for end-to-end tests, or `mise run test:ci` for CI unit tests with coverage

Applied to files:

  • .github/workflows/ci-checks.yml
  • CONTRIBUTING.md
  • containers/README.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to tests/**/*.py : Run mise run test to execute unit tests (excludes slow unit tests, smoke and e2e)

Applied to files:

  • .github/workflows/ci-checks.yml
  • CONTRIBUTING.md
  • containers/README.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to **/*.py : Python version support: Project supports Python 3.11, 3.12, and 3.13; Python 3.14+ is not supported

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:06:56.798Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-03T23:06:56.798Z
Learning: Applies to **/*.py : Target Python 3.11–3.13 with modern syntax (`X | Y`, `list[str]`, `Self`). Python 3.14+ is not supported

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Use mise tasks (mise run <task>) instead of running ruff, ty, or pytest directly to ensure pinned tool versions from .mise.toml are used

Applied to files:

  • CONTRIBUTING.md
  • containers/Dockerfile.cuda
  • containers/Dockerfile.test_ci
  • containers/README.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Pull request process: create issue first, create feature branch, make changes with conventional commits, run local tests, push branch, open PR using template, address review feedback, then squash merge

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to tests/**/*.py : Mark CUDA-dependent tests with `pytest.mark.e2e`, `pytest.mark.smoke`, or `pytest.mark.requires_gpu`.

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:50.142Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: tests/TESTING.md:0-0
Timestamp: 2026-06-03T23:08:50.142Z
Learning: Applies to tests/**/*.py : For vLLM tests that call `.generate()`, mark with `pytest.mark.vllm`, use per-file process isolation (`-n 0`), and create dedicated `test:smoke:gpu:*` mise tasks. vLLM pre-allocates all GPU memory and never releases it within a process, causing OOM in later tests if not isolated

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:50.142Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: tests/TESTING.md:0-0
Timestamp: 2026-06-03T23:08:50.142Z
Learning: Run a single test with: `uv run --frozen pytest tests/path/test_file.py::test_name -vvs -n0`. Use `uv run --frozen pytest -n auto --dist loadscope -vv` as the default test runner

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:50.142Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: tests/TESTING.md:0-0
Timestamp: 2026-06-03T23:08:50.142Z
Learning: Applies to tests/**/*.py : Define pytest markers in `pytest.ini` with `--strict-markers` enabled. Use exactly one category marker (`unit`, `smoke`, `e2e`) per test. Category modifiers include `slow` for long-running tests, `requires_gpu` for CUDA-dependent tests, `vllm` for vLLM backend tests, `smollm2` for SmolLM2 Hub download tests, and `noautouse` to skip autouse fixtures

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:50.142Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: tests/TESTING.md:0-0
Timestamp: 2026-06-03T23:08:50.142Z
Learning: Organize test files to mirror source structure (e.g., `tests/training/`, `tests/generation/`, `tests/evaluation/`, `tests/cli/`, `tests/data_processing/`, `tests/config/`, `tests/e2e/`, `tests/smoke/`)

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:06:56.798Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-03T23:06:56.798Z
Learning: Place test-suite guidance in `tests/TESTING.md`

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to tests/**/*.py : Markers are auto-assigned by path via `pytest_collection_modifyitems` (`/e2e/` -> `e2e`, `/smoke/` -> `smoke`, default -> `unit`). Explicit markers: `pytest.mark.slow`, `pytest.mark.requires_gpu`, `pytest.mark.timeout()`.

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to **/*.py : Use ruff for linting and formatting checks; run via mise run check for read-only local quality checks

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:06:56.798Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-03T23:06:56.798Z
Learning: Follow detailed code style conventions from STYLE_GUIDE.md for Python, markdown, Dockerfiles, shell scripts, testing, config files, and docstrings

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to **/*.py : Run mise run format to auto-fix code style: ruff format, import sorting, and copyright headers

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to tests/**/*.py : New features must include tests; bug fixes must include regression tests

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:06:56.798Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-03T23:06:56.798Z
Learning: Use mise tasks or wrapper scripts in `tools/` instead of running `ruff` or `ty` directly

Applied to files:

  • CONTRIBUTING.md
  • containers/Dockerfile.cuda
  • containers/README.md
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Tools enforce what they can (`ruff`, `ty`, `pre-commit`). This guide covers what tools can't enforce.

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to .mise/tasks/*.sh : Use `#MISE description=...` on public file tasks for Mise task listing.

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to .mise/tasks/*.sh : Use `#USAGE` comments in file tasks for arguments that need validation or help text.

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:09:02.641Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: .cursor/rules/repo-navigation.mdc:0-0
Timestamp: 2026-06-03T23:09:02.641Z
Learning: Applies to .pre-commit-config.yaml : Configure pre-commit hooks (ruff, ty, copyright, uv-lock) in `.pre-commit-config.yaml`

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:06:56.798Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-03T23:06:56.798Z
Learning: Use `uv sync --frozen --extra cu129 --extra engine --group dev` for a full GPU/dev environment setup

Applied to files:

  • CONTRIBUTING.md
  • containers/README.md
📚 Learning: 2026-06-03T23:09:02.641Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: .cursor/rules/repo-navigation.mdc:0-0
Timestamp: 2026-06-03T23:09:02.641Z
Learning: Applies to mkdocs.yml : Configure documentation site using MkDocs Material in `mkdocs.yml`

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to mkdocs.yml : Add documentation pages to nav section of mkdocs.yml so they appear in the sidebar

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Applies to docs/**/*.md : Use MkDocs Material Markdown extensions for documentation: admonitions, content tabs, code blocks, Mermaid diagrams, task lists, footnotes, definition lists

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to docs/**/*.md : Classify documentation pages as tutorial, how-to, explanation, or reference per the Diataxis framework. Use MkDocs Material syntax: admonitions (`!!! note`), tabs (`===`), code blocks with titles and highlights.

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:09:13.516Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: .cursor/rules/writing-docs.mdc:0-0
Timestamp: 2026-06-03T23:09:13.516Z
Learning: Organize documentation following the structure: docs/index.md (root), getting-started/ (Tutorials), user-guide/ (How-tos and reference), developer-guide/ (Explanations), product-overview/ (Product features), tutorials/, and dev-notes/

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:09:13.516Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: .cursor/rules/writing-docs.mdc:0-0
Timestamp: 2026-06-03T23:09:13.516Z
Learning: Applies to docs/**/*.md : Use MkDocs Material tabs syntax (=== "Label") to present alternative views or language-specific examples in documentation

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:09:13.516Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: .cursor/rules/writing-docs.mdc:0-0
Timestamp: 2026-06-03T23:09:13.516Z
Learning: Applies to docs/**/*.md : Use MkDocs Material admonition syntax (!!! note, !!! warning, ??? tip) for highlighting important information and collapsible sections in documentation

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:09:02.641Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: .cursor/rules/repo-navigation.mdc:0-0
Timestamp: 2026-06-03T23:09:02.641Z
Learning: Applies to AGENTS.md : Maintain agent guide with module map and conventions in `AGENTS.md`

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-05-08T22:28:14.968Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-08T22:28:14.968Z
Learning: Follow Claude Development Instructions as documented in AGENTS.md

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-05-08T22:28:14.968Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-08T22:28:14.968Z
Learning: Follow Claude Development Instructions as documented in AGENTS.local.md

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:06:56.798Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-03T23:06:56.798Z
Learning: Applies to **/*.py : Place durable implementation guidance in function and class docstrings for public contracts and source comments for local invariants

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-03T23:08:32.341Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2026-06-03T23:08:32.341Z
Learning: Configuration layers for AI agents: AGENTS.md (all agents), AGENTS.local.md (local overrides, git-ignored), CLAUDE.md (Claude Code), .cursor/rules/*.mdc (Cursor), .agents/skills/* (shared skills)

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2026-06-01T18:47:21.036Z
Learnt from: binaryaaron
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 481
File: containers/Dockerfile.cuda:100-106
Timestamp: 2026-06-01T18:47:21.036Z
Learning: In `containers/Dockerfile.cuda` (tools stage), `uv`/`uvx` are installed via `mise run setup` with the version pinned in `mise.lock`, and then copied to `/usr/local/bin/` via `cp "$(mise which uv)" /usr/local/bin/uv`. This is the intentional and reproducible approach — there is no need for a separate `FROM ghcr.io/astral-sh/uv:<version>` stage. The `PATH="/usr/local/bin:/mise/shims:${PATH}"` addition is required (not a noop) because `tools/install-mise.sh` installs the `mise` binary at `/usr/local/bin/mise`, so it must be on PATH before the shims are available for subsequent `mise trust` and `mise run setup` calls.

Applied to files:

  • containers/Dockerfile.cuda
  • containers/Dockerfile.test_ci
  • containers/README.md
  • script/slurm/slurm_nss_matrix.sh
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to containers/Dockerfile* : Use `--mount=type=cache` for pip/uv caches and APT (`/var/cache/apt`, `/var/lib/apt/lists`). Prefer cache mounts over `rm -rf /var/lib/apt/lists/*`.

Applied to files:

  • containers/Dockerfile.cuda
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to .mise/tasks/_lib.sh : Put shared shell helpers in `.mise/tasks/_lib.sh`; keep it non-executable so mise does not list it as a task.

Applied to files:

  • containers/Dockerfile.cuda
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to containers/Dockerfile* : Copy uv from `ghcr.io/astral-sh/uv:<version>`.

Applied to files:

  • containers/Dockerfile.test_ci
  • containers/README.md
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to containers/Dockerfile* : Use non-root user (`appuser`) with `NVIDIA_VISIBLE_DEVICES=all` for GPU access.

Applied to files:

  • containers/README.md
📚 Learning: 2026-06-03T23:08:14.151Z
Learnt from: CR
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 0
File: STYLE_GUIDE.md:0-0
Timestamp: 2026-06-03T23:08:14.151Z
Learning: Applies to containers/Dockerfile* : Use multi-stage builds for production images.

Applied to files:

  • containers/README.md
🪛 Betterleaks (1.3.1)
containers/Dockerfile.cuda

[high] 103-103: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

containers/Dockerfile.test_ci

[high] 22-22: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

🪛 markdownlint-cli2 (0.22.1)
CONTRIBUTING.md

[warning] 34-34: Blank line inside blockquote

(MD028, no-blanks-blockquote)

containers/README.md

[warning] 161-161: Multiple headings with the same content

(MD024, no-duplicate-heading)

🪛 Shellcheck (0.11.0)
script/slurm/slurm_nss_matrix.sh

[info] 115-115: Not following: ./bin/activate was not specified as input (see shellcheck -x).

(SC1091)

🪛 Trivy (0.69.3)
containers/Dockerfile.test_ci

[error] 1-1: Image user should not be 'root'

Specify at least 1 USER command in Dockerfile with non-root user as argument

Rule: DS-0002

Learn more

(IaC/Dockerfile)

🔇 Additional comments (6)
CONTRIBUTING.md (2)

30-30: LGTM!


547-550: LGTM!

containers/Dockerfile.cuda (1)

66-66: LGTM!

containers/Dockerfile.test_ci (1)

1-3: LGTM!

containers/README.md (1)

13-13: LGTM!

Also applies to: 86-86

script/slurm/slurm_nss_matrix.sh (1)

109-122: LGTM!

Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
…f floor

- gpu-tests: pass matrix.python-version into setup-gpu-test-env so the
  declared version is actually used (was ignored, falling back to
  .python-version); set GPU smoke matrix to the new 3.13 default.
- Dockerfile.cuda: bump PYTHON_VERSION 3.13.9 -> 3.13.13 to match
  Dockerfile.test_ci.
- ruff.toml: comment why target-version stays at the py311 floor.

Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
@binaryaaron binaryaaron added the area:dev-ex Affects build or dev experience label Jun 4, 2026
@coderabbitai coderabbitai Bot removed docs Documentation-only change test Test-only addition or change chore Maintenance not tied to a user-visible change refactor Internal restructuring with no behavior change labels Jun 4, 2026
Comment thread mise.lock
@@ -1,4 +1,4 @@
# @generated - this file is auto-generated by `mise lock` https://mise.jdx.dev/dev-tools/mise-lock.html
# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

nit: Argh?! I saw this too. Is this from installing mise via a different mechanism, or just the mise.lock being generated by different versions of mise?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

I'm not quite sure; if it continues to occur then let's make it more stable? i'm guessing it's a version thing but haven't checked.

@binaryaaron
binaryaaron added this pull request to the merge queue Jun 5, 2026
Merged via the queue into main with commit 2a8f7a1 Jun 5, 2026
21 checks passed
@binaryaaron
binaryaaron deleted the binaryaaron/support-python3.12 branch June 5, 2026 23:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dev-ex Affects build or dev experience python

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants