Thank you for considering contributing to Certamen Core! We welcome contributions of all kinds:
- Bug reports
- Feature requests
- Code contributions
- Documentation improvements
- Example workflows
Please read our Code of Conduct before participating.
-
Fork the repository on GitHub.
-
Clone your forked repository:
git clone https://github.com/YOUR_USERNAME/certamen-core.git cd certamen-core -
Set up the environment:
python -m venv venv source venv/bin/activate pip install -e .[dev] -
Install pre-commit hooks:
pre-commit install pre-commit install --hook-type commit-msg
feature/short-descriptionfor new featuresfix/short-descriptionfor bug fixesexp/short-descriptionfor experiments
-
Create a branch from
main:git checkout -b feature/my-feature
-
Make your changes.
-
Run quality checks:
make fmt # format code make lint # lint + type check make test # run tests with coverage pre-commit run -a # all pre-commit hooks
-
Commit with a concise message (under 72 characters):
git commit -m "add tournament timeout configuration"
| Target | Purpose |
|---|---|
make dev |
Install dev dependencies + pre-commit hooks |
make fmt |
Format + autofix code (ruff format + ruff check --fix) |
make lint |
Lint + format check + type check (ruff, pyright) |
make test |
Run tests with coverage |
make test-quick |
Run tests without coverage |
make clean |
Remove build artifacts |
Integration tests only. We do not accept unit tests.
- Tests must exercise real components, not isolated functions
- Mock only external LLM providers (never internal logic)
- Property-based testing with Hypothesis is encouraged
- Tests go in
tests/integration/
Do not submit:
- Unit tests that mock internal classes
- Tests in
tests/unit/(reserved for minimal CLI flag tests) - Tests that modify themselves to pass
We do not use docstrings or inline comments explaining "what" the code does. Instead:
- Use clear, descriptive function and variable names
- Keep functions small and focused
- Use type hints for all function signatures
- Let the code speak for itself
- All code must pass
pyrightin strict mode - Use proper type annotations on all public functions
- Avoid
Anyunless absolutely necessary
The project follows Clean Architecture with enforced layer boundaries:
interfaces -> application -> infrastructure -> domain -> ports -> shared
Import-linter enforces these boundaries in CI. Do not introduce cross-layer imports that violate this direction.
- Use imperative mood: "add feature" not "added feature"
- Keep under 72 characters
- No emoji prefixes
- No AI-generated footers or co-authored-by lines
- Follow Conventional Commits format
-
Push your branch:
git push origin feature/my-feature
-
Open a Pull Request against
main. -
Fill in the PR template.
-
Ensure CI passes (pre-commit, lint, tests on all platforms).
A maintainer will review your PR. We may request changes before merging.
Use GitHub Issues with the provided templates:
- Bug reports: Include version, Python version, OS, and reproduction steps
- Feature requests: Describe the problem and proposed solution
Do not report security vulnerabilities through public issues. See SECURITY.md for responsible disclosure instructions.