375ce8eee5
Linux is case-sensitive; Windows and macOS are not. Two tracked paths differing only by case (README.md vs readme.md, src/Foo.py vs SRC/foo.py) land fine on Linux and silently break every clone on a case-insensitive host — the filesystem holds one, so checkout fails or whichever wins clobbers the other. Git won't stop the pair from landing; it only warns at checkout time on a case-insensitive FS. This is the enforcement point. Adds scripts/check-case-collisions.py (index scan keyed on casefolded full paths) + an unconditional workflow_call job wired into ci.yaml and the all-checks-pass gate — unconditional because a collision can ship in any kind of PR (docs, JS, config), not just Python, so gating on a language lane would be the same passive-rule trap the infographic check closes. Tests in tests/scripts/test_case_collision_check.py build collisions via git update-index --cacheinfo so they run on case-insensitive filesystems too.