This project uses ruff for Python linting and formatting.

Rules:
- Line length: 100 characters
- Python target: 3.11+
- Use double quotes for strings
- Sort imports with isort (ruff I rules): stdlib, third-party, first-party (framework), local
- Combine as-imports
- Use type hints on all function signatures
- Use `from __future__ import annotations` for modern type syntax
- Raise exceptions with `from` in except blocks (B904)
- No unused imports (F401), no unused variables (F841)
- Prefer list/dict/set comprehensions over map/filter (C4)

Run `make lint` to auto-fix, `make check` to verify without modifying files.
Run `make format` to apply ruff formatting.

The ruff config lives in core/pyproject.toml under [tool.ruff].
