release.py previously ran the code generator, 'ruff check --fix',
'ruff format', and line-ending normalization before building. Any drift
rewrote tracked files, dirtying the checkout and turning the release
into a dev version (the v0.10.6 PyPI 400). Generation and linting are
now validation-only:
- tools/generate.py gains a --check mode that reports stale generated
files without writing (comparing Python content in ruff-formatted
form, matching what write + format would produce)
- release.py runs generate --check, ruff check (no --fix), and
ruff format --check, failing with remediation hints
- normalize_line_endings() is removed; .gitattributes keeps checkouts LF