Read .github/CONTRIBUTING.md, docs/concepts/design.md, and docs/ARCHITECTURE.md before
making a
non-trivial change. Preserve unrelated work in a dirty worktree and keep edits
inside the requested scope.
The repository test suite is intentionally layered because some end-to-end checks create complete workspaces and can take minutes. Do not run every test after every edit.
- Focused checks (during development): run the smallest relevant test node or file for the code being changed. Repeat this layer while iterating.
- Default suite (before handoff):
uv run --frozen pytest -qruns the normal unit, behavior, and lightweight integration tests. Tests markedsloware skipped by default. - Slow integration checks (only when related): run a marked test with
uv run --frozen pytest -q --run-slow <test-path-or-node>. Use this layer only when the change touches the workflow that test exercises, when a release gate explicitly requires it, or when investigating a failure in that workflow. Run all slow tests only for broad cross-cutting changes. - External/live checks (manual): tests that require Docker, Harbor jobs, model calls, credentials, network services, or a real evolution campaign are never routine validation. Run them only when the task explicitly needs that integration and report the environment and artifacts separately.
Choose tests by behavior, not just by filename. Typical mappings are:
- CLI or one source module: its direct test file or exact test nodes.
- Recipe, scaffold, or seed changes: the recipe-specific tests plus
tests/test_recipe_composition.pyand/ortests/test_resource_layout.pyas applicable. - Architecture/module inventory changes: the relevant
tests/test_coherence.pynodes. - Legacy recipe/operator/driver changes:
tests/test_recipe_full_cycle.pywith--run-slowon Linux (requires libseccomp and cached uv dependencies/Python). It runs nine original recipes through one generation with real operators and evaluator scripts, a deterministic Harbor substitute, and blocked network access. gepa_locallocal-Harbor generation changes: the focused recipe tests andtests/test_gepa_local_recipe.py::test_gepa_local_full_generation_improves_championwith--run-slow.- Packaging/release changes: build the distribution and run
tests/test_release_artifact.pywithEVOLVE_RELEASE_DISTset, following the release workflow.
If a new test routinely takes tens of seconds, launches a complete evolution,
or depends on expensive setup, mark it @pytest.mark.slow and document the
feature/path that should trigger it. A slow test must stay deterministic and
must not silently depend on live external services.