Problem. ci.yml has no Composer caching; mutation testing (>1hr) runs on every PR; the environment-independent slow gates (Pint/PHPStan/Reader-baseline) and full type-coverage run redundantly across all 6 matrix legs.
Evidence.
ci.yml jobs lack a caching layer (contrast e2e.yml:34-36, docs.yml:35).
- The mutation job is under
on: push/pull_request with no guard (ci.yml:55-67); CLAUDE.md calls it a CI/manual concern.
test:type re-runs the full suite with coverage on a matrix leg; the slow gates repeat per leg though they are PHP-version-independent.
Fix. Add ramsey/composer-install (or actions/cache over ~/.composer/cache); move mutation to schedule + workflow_dispatch (mirror published-smoke.yml); run type-coverage + Pint/PHPStan/Reader-baseline on a single PHP leg only. Keep the test matrix + stan + lint as required PR checks.
Done when. PR CI is meaningfully faster; mutation still runs on a schedule; coverage is unchanged.
Filed from a repo-wide improvement audit; every claim was adversarially verified against source.
Problem.
ci.ymlhas no Composer caching; mutation testing (>1hr) runs on every PR; the environment-independent slow gates (Pint/PHPStan/Reader-baseline) and full type-coverage run redundantly across all 6 matrix legs.Evidence.
ci.ymljobs lack a caching layer (contraste2e.yml:34-36,docs.yml:35).on: push/pull_requestwith no guard (ci.yml:55-67); CLAUDE.md calls it a CI/manual concern.test:typere-runs the full suite with coverage on a matrix leg; the slow gates repeat per leg though they are PHP-version-independent.Fix. Add
ramsey/composer-install(oractions/cacheover~/.composer/cache); move mutation toschedule+workflow_dispatch(mirrorpublished-smoke.yml); run type-coverage + Pint/PHPStan/Reader-baseline on a single PHP leg only. Keep the test matrix + stan + lint as required PR checks.Done when. PR CI is meaningfully faster; mutation still runs on a schedule; coverage is unchanged.
Filed from a repo-wide improvement audit; every claim was adversarially verified against source.