Skip to content

CI and test policy

Routine reviews use the fast ci.yml workflow. The complete full-tests.yml workflow runs on manual request and is mandatory for every release publication. Python 3.12 is the initial tested version. The metadata permits newer Python, but broader compatibility must be measured before being advertised.

Change or event Checks
Documentation-only PR or main push Ruff, infrastructure/policy tests, integration metadata, wheel/sdist build, strict Twine checks and a strict documentation-site build; no numerical dependencies or model tests
Code, tests, examples, dependencies, workflows or mixed changes All documentation checks, the full core suite and curated Bayesian smoke tests against the built wheel on Linux, plus both quickstarts
Manual full-suite run or release Complete Linux/macOS core and Bayesian suites and clean wheel/sdist installation checks

Documentation-only means changes entirely within README.md, CHANGELOG.md, CONTRIBUTING.md, zensical.toml, requirements-docs.txt, or recognized prose/image files under docs/. Unknown paths, executable documentation, mixed changes and unavailable history receive code checks. The workflow always reports Required checks; only documentation profiles may skip its model jobs. New commits cancel superseded fast runs.

The Bayesian smoke manifest is tests/smoke-tests.json. It exercises likelihood/prior contracts, factorization, posterior mixing diagnostics, environment advice, response filters, learned GP timescales and a short sampler checkpoint/resume check. It is deliberately limited. For numerical changes, run the affected tests and request the complete suite before merging when broader coverage is needed. Passing fast CI does not imply the full suite passed.

Complete suite

In GitHub Actions, select Full test suite, choose Run workflow, and select the branch to test. With the GitHub CLI:

gh workflow run full-tests.yml --ref YOUR_BRANCH

This runs tests without publishing. Release verification calls the same full workflow at the resolved release commit; fast PR checks cannot substitute for it.

Job What it verifies
Infrastructure and lint Release gate regressions, package metadata/import checks and Ruff
Model integration status Valid source commit and required integrated model suite files
Build distributions Wheel/sdist creation and strict Twine metadata rendering checks
Installed wheel/sdist on Linux/macOS Clean artifact installation, dependency consistency and import tests outside the checkout
Core/Bayesian models on Linux/macOS Entire migrated suite directories against the built wheel; two core and eight Bayesian file shards per platform
Full suite required checks Every required job passed

Release verification requires integrated models and a matching non-development version tag. Each model suite must execute at least one passing test; an entirely skipped suite is rejected even if pytest exits successfully. Bayesian jobs enable CPU float64 and one BLAS/OpenMP thread. Keep ordinary suite execution under the workflow timeout; costly SBC, recovery and scalability studies should use separately reviewed manual workflows with explicit budgets. No research campaign is launched by package CI.

For local infrastructure tests:

python -m pip install -e '.[dev]'
python -m pytest tests/infrastructure
python scripts/check_release.py

The last command checks integration readiness. Publication still requires a matching non-development version tag. Installed-package checks are also run separately by CI, preventing an editable install from hiding missing distribution files.

The synthetic model suites check numerical contracts and execution paths. They do not establish general convergence, uncertainty calibration, physiological timing, response recovery or empirical usefulness. See capabilities.md for scope and test-migration.json for transferred tests and exclusions.

For installed model tests, build and install the wheel with [test,bayesian], then run:

JAX_ENABLE_X64=true OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 python scripts/run_model_tests.py core
JAX_ENABLE_X64=true OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 python scripts/run_model_tests.py bayesian --smoke
# Complete Bayesian suite when needed:
JAX_ENABLE_X64=true OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 python scripts/run_model_tests.py bayesian

The runner uses Python isolated mode and pytest importlib mode. Test-only reference integrators and synthetic fixtures live under tests/reference; they are not installed in the wheel. Every file belongs to exactly one CI shard, and each shard must execute passing tests. Source-repository research campaigns and legacy estimators are explicitly excluded from this package.