- lint job now uses astral-sh/ruff-action instead of provisioning a full Python toolchain via setup-python just to pip install ruff — the action just downloads the standalone Ruff binary. - build job's cache: pip was hanging on every run: the Gitea runner has no reachable Actions-cache backend, so setup-python's cache restore step was timing out on a connect (ETIMEDOUT) before falling back and continuing anyway. Removed since deps here are tiny and a cold install costs seconds, not minutes. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>