Labels: ci, tooling, priority:high
File: .github/workflows/* (none run ruff/mypy); .pre-commit-config.yaml (pre-commit-only)
Description. grep -rniE "ruff|mypy|lint|typecheck" .github/workflows/ returns nothing across all 8 workflows. Ruff + mypy exist only in pre-commit, bypassable with git commit --no-verify and never run for contributors who don't pre-commit install.
Why it matters. A PR with lint or type errors merges green. This is exactly how PR #259's indentation drift reached green CI. Type regressions ship because mypy never runs on PRs.
Tasks.
Dedup. #59 adds bandit only (security scanner), not ruff/mypy/format. Distinct and broader.
Labels:
ci,tooling,priority:highFile:
.github/workflows/*(none run ruff/mypy);.pre-commit-config.yaml(pre-commit-only)Description.
grep -rniE "ruff|mypy|lint|typecheck" .github/workflows/returns nothing across all 8 workflows. Ruff + mypy exist only in pre-commit, bypassable withgit commit --no-verifyand never run for contributors who don'tpre-commit install.Why it matters. A PR with lint or type errors merges green. This is exactly how PR #259's indentation drift reached green CI. Type regressions ship because mypy never runs on PRs.
Tasks.
lintjob (newlint.ymlor a job inpytest.yml) runningruff check .,ruff format --check ., andmypy --config-file=pyproject.toml src/on push + PR tomain.ruff format --checkwill initially fail on pre-existing drift incli.py(~lines 136–161) — land a format-only commit first.Dedup. #59 adds bandit only (security scanner), not ruff/mypy/format. Distinct and broader.