Gates on every change
Every pull request runs lint, tests and a build, on backend and frontend, plus a job that fails if a generated contract is out of date. The CI token is read-only by default, so code from a pull request never inherits write access.