- AI agents: Automate repository tasks with minimal context
- Contributors: Humans using AI assistants or working directly
- Maintainers: Ensure assistants follow project conventions and CI rules
AI agents should:
- Make atomic, minimal, and reversible changes.
- Prefer local analysis (
uv run,make verify,pytest) before proposing commits. - NEVER modify configuration, CI/CD, or release automation unless explicitly requested.
- Avoid non-deterministic code or random seeds without fixtures.
- Use
AGENTS.mdandMakefileas the source of truth for development commands.
Agents must NOT:
- Bypass tests or linters
- Introduce dependencies without updating
pyproject.toml - Generate or commit large autogenerated files
Before writing code, agents should:
- Read docstrings and existing test cases for pattern alignment
- Match import patterns from neighboring files
- Preserve existing logging and error-handling conventions
.github/ # GitHub actions for CI/CD
CHANGELOG/ # Release changelogs
docs/ # Kubeflow SDK documentation
examples/ # Kubeflow SDK examples
hack/ # Scripts to manage CI/CD and installation
proposals/ # Kubeflow Enhancement Proposals (KEPs)
test/ # Top-level end-to-end tests
kubeflow/ # Main Python package
├── common/ # Shared utilities, types, and constants across all projects
│
├── trainer/ # Kubeflow Trainer
│ ├── api/ # TrainerClient - main user interface
│ ├── backends/ # Execution backend implementations
│ │ ├── kubernetes/ # Kubernetes backend
│ │ ├── container/ # Container backend for local development
│ │ │ └── adapters/ # Docker & Podman adapter implementations
│ │ └── localprocess/ # Subprocess backend for quick prototyping
│ ├── constants/ # Common trainer constants and defaults
│ ├── options/ # Backend configuration options (KubernetesOptions, etc.)
│ ├── types/ # Common trainer types (e.g. TrainJob, CustomTrainer, BuiltinTrainer)
│ └── test/ # Shared test fixtures (common.py)
│
├── optimizer/ # Kubeflow Optimizer
│ ├── api/ # OptimizerClient - main user interface
│ ├── backends/ # Execution backend implementations
│ │ └── kubernetes/ # Kubernetes backend
│ ├── types/ # Common optimizer types (e.g. OptimizationJob, Search)
│ └── constants/ # Common optimizer constants and defaults
│
├── spark/ # Kubeflow Spark
│ ├── api/ # SparkClient - main user interface
│ ├── backends/ # Execution backend implementations
│ │ └── kubernetes/ # Kubernetes backend
│ └── types/ # Spark types and options
│
└── hub/ # Kubeflow Hub
├── api/ # ModelRegistryClient - main user interface
└── types/ # Hub types
- Package manager:
uv(creates.venvautomatically via targets) - Lint/format:
ruff(isort integrated) - Tests:
pytestwith coverage - Build: Hatchling (optional
uv build) - Pre-commit: Config provided and enforced in CI
Setup:
make install-dev # Install uv, create .venv, sync depsVerify (CI parity):
make verify # Runs ruff check --show-fixes and ruff format --checkTesting:
make test-python # All unit tests + coverage (HTML by default)
make test-python report=xml # XML coverage report
uv run pytest -q kubeflow/trainer/utils/utils_test.py # One file
uv run pytest -q kubeflow/trainer/utils/utils_test.py::test_name -k "pattern" # One test
uv run coverage run -m pytest <path> && uv run coverage report # Ad-hoc coverageLocal lint/format:
uv run ruff check --fix . # Fix lint issues (all files)
uv run ruff format kubeflow # Format kubeflow package
uv run ruff check path/to/file.py # Lint single file
uv run ruff format path/to/file.py # Format single fileType checking:
uv run ty check kubeflow/hub # Run type checker
uv run ty check path/to/file.py # Type-check single filePre-commit:
uv run pre-commit install # Install hooks
uv run pre-commit run --all-files # Run all hooksPreferred commands: use uv run ... to ensure tool consistency and .venv usage
Before making changes:
- Read existing code patterns and docstrings for alignment
- Follow the Core Development Principles below
- Run validation commands before proposing changes
Validation before proposing changes:
- Lint/format:
make verify - Tests:
make test-pythonor targetedpytestinvocations - Type checking:
uv run ty check kubeflow/hub
Commit/PR hygiene:
- Follow Conventional Commits in titles and messages
- Include rationale ("why") in commit messages/PR descriptions
- Do not push secrets or change git config
- Scope discipline: only modify files relevant to the task; keep diffs minimal
- Always preserve function signatures, argument positions, and names for exported/public methods
- Check if the function/class is exported in
__init__.pybefore changing public APIs - Look for existing usage patterns in tests and examples
- Use keyword-only arguments for new parameters:
*, new_param: str = "default" - Mark experimental features clearly with docstring warnings
- All Python code MUST include type hints and return types
- Line length 100, Python 3.10 target, double quotes, spaces indent
- Imports: isort via ruff; first-party is
kubeflow; prefer absolute imports - Naming: pep8-naming; functions/vars
snake_case, classesPascalCase, constantsUPPER_SNAKE_CASE; prefix private with_ - Use descriptive, self-explanatory variable names
- Break up complex functions (>20 lines) into smaller, focused functions where it makes sense
- Follow existing patterns in the codebase you're modifying
- Every new feature or bugfix MUST be covered by unit tests
- Unit tests:
kubeflow/trainer/**/*_test.py(no network calls allowed) - Use
pytestwithTestCasedataclass for parametrized tests (seekubeflow/trainer/backends/kubernetes/backend_test.pyfor the reference pattern) - See
kubeflow/trainer/test/common.pyfor fixtures and patterns
- No
eval(),exec(), orpickleon user-controlled input - Proper exception handling (no bare
except:) with descriptive error messages - Remove unreachable/commented code before committing
- Ensure proper resource cleanup (file handles, connections)
- No secrets in code, logs, or examples
- Use Google-style docstrings with Args section for all public functions
- Types go in function signatures, NOT in docstrings
- Focus on "why" rather than "what" in descriptions
- Document all parameters, return values, and exceptions
- Use Pydantic v2 models in
kubeflow.trainer.typesfor schemas