Static analysis and sanitizer gates =================================== Pull requests always run Ruff 0.12.8 over ``python/mspasspy`` and ``python/tests`` with ``E9,F63,F7,F82`` selected. Pull requests that change ``cxx/**`` additionally run the complete native CTest suite in separate ASan and UBSan builds. The stable ``static-gates`` job accepts only successful applicable jobs or two skipped sanitizer jobs when no native path changed. Branch protection must not require ``static-gates`` until this workflow has been merged into ``master`` and produced the check there. Configuring it earlier could leave pull requests waiting for a context that the base branch cannot create. After a successful run on ``master``, a repository administrator should add exactly ``static-gates`` to the required status checks and confirm it through the branch-protection API.