CI Perf Lint

Rule documentation

Rules

Current explainers for workflow and repository-wide findings. These docs describe what gets flagged, why it matters, and how to verify improvements.

174 Total rules

Repository-wide and workflow findings. Open a rule to see what gets flagged, suggested action, and verification guidance.

async-test-uses-sync-testclient

async-test-uses-sync-testclient

Detects `async def test_*` functions under `tests/` that instantiate `TestClient(...)`.

avoid-brew-update-on-hosted-macos

avoid-brew-update-on-hosted-macos

Flags GitHub-hosted macOS jobs that run `brew update` or `brew upgrade` during CI.

avoid-broad-upload-artifact

avoid-broad-upload-artifact

Detects `actions/upload-artifact` steps that upload very broad paths (`.`, `./`, `*`, or `**`) without an error-condition guard.

avoid-c-drive-on-windows-runner

avoid-c-drive-on-windows-runner

Avoid hardcoding `C:\` drive paths on Windows runners.

avoid-docker-image-via-uses

avoid-docker-image-via-uses

Steps using `uses: owner/repo` without `@ref`, `docker://`, or `./` qualifier.

avoid-eslint-plugin-prettier

avoid-eslint-plugin-prettier

Flags repositories whose visible ESLint config appears to wire Prettier into ESLint.

avoid-lucide-angular-icons-registry

avoid-lucide-angular-icons-registry

Flags `icons` registry imports from `lucide-angular`.

avoid-lucide-dynamic-icon

avoid-lucide-dynamic-icon

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect `lucide-react/dynamic`.

avoid-mui-barrel-imports

avoid-mui-barrel-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` with Material UI's recommended top-level package restriction.

avoid-mypy-production-bundle

avoid-mypy-production-bundle

Detects mypy declared in production dependency sections or bundled into CDK deployment assets.

avoid-prettier-eslint

avoid-prettier-eslint

Flags repositories whose visible dependencies or config still indicate `prettier-eslint`, or workflows that call `prettier-eslint` directly.

avoid-svg-component-imports

avoid-svg-component-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect SVG imports that turn asset files into React, Vue, or similar framework components.

avoid-xcode-install-on-hosted-macos

avoid-xcode-install-on-hosted-macos

Flags GitHub-hosted macOS jobs that visibly install or download Xcode during CI.

cache-terraform-providers

cache-terraform-providers

Detects jobs that run `terraform init` without caching the downloaded provider plugins.

cargo-build-before-test

cargo-build-before-test

Detects redundant `cargo build` steps that immediately precede `cargo test` with identical build conditions.

cdk-asset-waste-files

cdk-asset-waste-files

CDK assets contain unnecessary files that inflate deployment package size.

cdk-bucket-deployment-memory-unconfigured

cdk-bucket-deployment-memory-unconfigured

CDK code that uses `BucketDeployment` without setting the `memoryLimit` property.

CDK Duplicate Asset Hash

cdk-duplicate-asset-hash

Detects multiple CDK assets with the same `sourceHash` in `cdk.out/manifest.json`.

circleci-checkout-uses-full-clone

circleci-checkout-uses-full-clone

CircleCI defaults to a blobless clone (`method: blobless`), which fetches only the reachable objects for the current commit. This is equivalent to `git clone --filter=blob:none` and is faster and uses less data than a full clone.

collapse-multiple-go-builds-in-job

collapse-multiple-go-builds-in-job

Detects CI jobs that run multiple separate `go build` commands.

consider-caching-os-packages-or-using-a-custom-image

consider-caching-os-packages-or-using-a-custom-image

Flags jobs that repeatedly install OS packages at runtime without visible package caching or a prebuilt image strategy.

consider-filter-blob-none-for-release-metadata

consider-filter-blob-none-for-release-metadata

Flags history-aware metadata jobs that may be able to use checkout `filter: blob:none`.

consider-slim-over-alpine-for-ci

consider-slim-over-alpine-for-ci

Flags CI jobs that run inside a visible Alpine or musl-based container image.

db-io-reduce

db-io-reduce

Database service containers and ad-hoc `docker run` commands in CI write to disk by default. On GitHub Actions hosted runners, this causes unnecessary I/O overhead that can significantly slow down test suites.

deep-checkout-excessive-depth

deep-checkout-excessive-depth

Detects `actions/checkout` configured with `fetch-depth >= 1000` when the job does not appear to need that much history.

deep-checkout-without-need

deep-checkout-without-need

Detects `actions/checkout` configured with `fetch-depth: 0` when the job does not appear to need full git history.

detected-large-barrel-file

detected-large-barrel-file

This repository-wide finding comes from an embedded `oxlint` scan using `oxc/no-barrel-file`.

detected-large-files

detected-large-files

This repository-wide finding flags excessive large data and binary files that bloat git clone and checkout operations.

docker-bake-file-unused-in-ci

docker-bake-file-unused-in-ci

Detects repositories that have a Docker bake file while CI bypasses it with direct Docker image builds.

Docker build cache disabled in CI

docker-build-cache-disabled-in-ci

Routine Docker builds should reuse cache whenever possible. `--no-cache` and build action `no-cache: true` force every layer to rebuild, even when the Dockerfile and copied files are unchanged.

Docker build loads image into daemon unnecessarily

docker-build-load-true-unnecessary

`docker/build-push-action` with `load: true` loads the built image into the local Docker daemon. This adds serialization overhead and is only needed when a subsequent step in the same job uses the image locally (e.g., `docker run`, `docker compose`, `docker tag`, `docker save`).

docker-build-without-layer-cache

docker-build-without-layer-cache

Detects `docker/build-push-action` and `depot/build-push-action` steps that do not configure `cache-from` and `cache-to`.

Dockerfile local ADD without clear need

dockerfile-add-without-clear-need

`ADD` has extra behavior for remote URLs and archive extraction. For ordinary local files and directories, `COPY` is more explicit and avoids accidentally doing extra work in the Docker build.

dockerfile-apk-add-without-no-cache-or-cache-mount

dockerfile-apk-add-without-no-cache-or-cache-mount

Detects Dockerfile `RUN apk add` instructions that do not use `--no-cache` or a BuildKit cache mount.

dockerfile-apt-install-without-cleanup-or-cache-mount

dockerfile-apt-install-without-cleanup-or-cache-mount

Detects Dockerfile `RUN` instructions that perform apt package work without either cleaning apt lists in the same layer or using BuildKit apt cache mounts.

Dockerfile apt install without no-install-recommends

dockerfile-apt-install-without-no-install-recommends

`apt-get install` installs recommended packages by default. In CI-built Docker images, those extra packages often increase layer size without improving the runtime image.

Dockerfile base image uses floating tag

dockerfile-base-image-uses-floating-tag

Untagged base images and `:latest` can move to new content independently of the repository. That makes rebuilds less predictable and can invalidate Docker cache layers even when application code has not changed.

dockerfile-bun-install-without-frozen-lockfile

dockerfile-bun-install-without-frozen-lockfile

Detects Node Dockerfiles that run Bun dependency installation without frozen lockfile behavior while a Bun lockfile is available in the Docker build context.

dockerfile-bundle-install-without-cache-mount

dockerfile-bundle-install-without-cache-mount

Detects Ruby Dockerfiles that run `bundle install` without a visible BuildKit cache mount on the same instruction.

dockerfile-cargo-build-release-without-cache-mount

dockerfile-cargo-build-release-without-cache-mount

Detects Rust Dockerfiles that run `cargo build --release` without a visible BuildKit cache mount on the same instruction.

dockerfile-cargo-install-without-locked

dockerfile-cargo-install-without-locked

Detects Rust Dockerfiles that install external Rust tools with `cargo install` without `--locked`.

Dockerfile compiled build copies source layer

dockerfile-compiled-build-copies-source-layer

Compiled Docker builds often need source files only temporarily to produce a binary or build artifact. A broad `COPY . .` before `go build` or `cargo build` creates a source layer that changes frequently and can invalidate later layers.

dockerfile-copies-all-before-deps

dockerfile-copies-all-before-deps

Detects Dockerfiles that copy broad source context before dependency installation.

dockerfile-copy-link-without-cache-benefit

dockerfile-copy-link-without-cache-benefit

Detects `COPY --link` instructions whose cache benefit is unlikely to beat their build graph overhead.

dockerfile-final-stage-copies-broad-context

dockerfile-final-stage-copies-broad-context

Detects Dockerfiles where the final image stage copies the broad build context.

dockerfile-go-build-without-cache-mount

dockerfile-go-build-without-cache-mount

Detects Go Dockerfiles that run `go build` without a visible BuildKit cache mount on the same instruction.

dockerfile-go-mod-download-without-cache-mount

dockerfile-go-mod-download-without-cache-mount

Detects Go Dockerfiles that run `go mod download` without a visible BuildKit cache mount on the same instruction.

dockerfile-gradle-build-without-cache-mount

dockerfile-gradle-build-without-cache-mount

Detects Java Dockerfiles that run Gradle build tasks without a visible BuildKit cache mount on the same instruction.

dockerfile-gradle-dependencies-without-cache-mount

dockerfile-gradle-dependencies-without-cache-mount

Detects Java Dockerfiles that run Gradle dependency resolution without a visible BuildKit cache mount on the same instruction.

dockerfile-maven-build-without-cache-mount

dockerfile-maven-build-without-cache-mount

Detects Java Dockerfiles that run Maven build goals without a visible BuildKit cache mount on the same instruction.

dockerfile-maven-go-offline-without-cache-mount

dockerfile-maven-go-offline-without-cache-mount

Detects Java Dockerfiles that run `mvn dependency:go-offline` without a visible BuildKit cache mount on the same instruction.

dockerfile-pnpm-install-without-frozen-lockfile

dockerfile-pnpm-install-without-frozen-lockfile

Detects Node Dockerfiles that run `pnpm install` without `--frozen-lockfile` while `pnpm-lock.yaml` is available in the Docker build context.

dockerfile-uses-npm-install-with-lockfile

dockerfile-uses-npm-install-with-lockfile

Detects Node Dockerfiles that run project-level `npm install`-style commands while `package-lock.json` is available in the Docker build context.

dockerfile-uv-sync-without-frozen-lockfile

dockerfile-uv-sync-without-frozen-lockfile

Detects Python Dockerfiles that run project-level `uv sync` without frozen or locked lockfile behavior while `uv.lock` is available in the Docker build context.

dockerfile-yarn-install-without-immutable-lockfile

dockerfile-yarn-install-without-immutable-lockfile

Detects Node Dockerfiles that run Yarn dependency installation without a lockfile-immutable flag while `yarn.lock` is available in the Docker build context.

dockerignore-misses-noisy-build-context-paths

dockerignore-misses-noisy-build-context-paths

Detects Docker build contexts where a `.dockerignore` file exists but still allows noisy root paths into the build context.

duplicate-checkout-in-same-workflow

duplicate-checkout-in-same-workflow

Detects multiple non-matrix jobs that each perform checkout before similar install-heavy work inside one workflow.

duplicate-install-or-lint

duplicate-install-or-lint

Detects non-matrix jobs that repeat the same dependency install and lint combination within one workflow.

elixir-otp-version-performance

elixir-otp-version-performance

Detects outdated Elixir and OTP (Erlang) versions across your CI configuration, Dockerfiles, and `.tool-versions` files.

go-build-before-race-test

go-build-before-race-test

Detects broad `go build ./...` steps that run before broad race-enabled Go tests.

go-test-broad-package-serial-p-one

go-test-broad-package-serial-p-one

Detects broad Go test runs that serialize package execution with `-p 1`.

go-test-repeats-vet-after-go-vet

go-test-repeats-vet-after-go-vet

Detects Go CI jobs that run `go vet` and then run `go test` without `-vet=off`.

hatch-without-uv-installer

hatch-without-uv-installer

Flags repositories and CI jobs that use Hatch without `installer = "uv"` configured.

large-jest-snapshot

large-jest-snapshot

This repository-wide finding comes from an embedded `oxlint` scan using `jest/no-large-snapshots`.

matrix-test-job-without-test-sharding

matrix-test-job-without-test-sharding

Flags test jobs that use a shard-like matrix but do not visibly pass the matrix value into the test command.

missing-angular-cli-cache

missing-angular-cli-cache

Flags workflows that visibly run Angular CLI tasks while Angular CLI cache is not fully wired for CI.

missing-concurrency

missing-concurrency

Detects heavy workflows that do not define workflow-level or job-level `concurrency`.

missing-dependency-cache

missing-dependency-cache

Detects setup steps that prepare a language runtime but do not visibly enable dependency caching.

missing-dockerignore-for-build-context

missing-dockerignore-for-build-context

Detects Docker image builds that use a wide build context without a visible `.dockerignore` file.

missing-gradle-build-cache

missing-gradle-build-cache

Flags workflows that visibly run Gradle tasks while no repository-level Gradle build cache configuration is visible.

missing-make-j-flag

missing-make-j-flag

Detects workflow steps that run `make`, `gmake`, or `cmake --build` without any parallelization mechanism.

missing-next-build-cache

missing-next-build-cache

Flags workflows that visibly run `next build` while no cache step for `.next/cache` is visible.

missing-path-ignore-for-non-code

missing-path-ignore-for-non-code

Detects heavy workflows that do not ignore obviously non-code changes such as docs and markdown.

missing-paths-filter

missing-paths-filter

Detects heavy workflows that respond to `push` or `pull_request` without `paths` or `paths-ignore`.

missing-release-downstream-success-guard

missing-release-downstream-success-guard

Flags release-like downstream jobs that already use a status-based `if:` expression but do not also visibly guard on upstream success.

missing-test-worker-tuning-for-standard-runner

missing-test-worker-tuning-for-standard-runner

Flags direct test-runner commands on standard GitHub-hosted runners when no visible worker tuning is present.

missing-timeout-in-minutes-buildkite

missing-timeout-in-minutes-buildkite

Buildkite pipeline steps do not have a default timeout. Without `timeout_in_minutes`, a hung or degraded step can run indefinitely and consume agent capacity.

missing-timeout-in-minutes-gitlab-ci

missing-timeout-in-minutes-gitlab-ci

GitLab CI jobs use a project-level default timeout (60 minutes). Heavy jobs should use an explicit `timeout` to prevent runaway builds and wasted CI minutes.

missing-timeout-minutes

missing-timeout-minutes

Detects non-matrix jobs of interest that do not define job-level `timeout-minutes`.

missing-turbo-cache

missing-turbo-cache

Flags workflows that visibly run `turbo run ...` tasks while no local Turbo cache path or remote-cache wiring is visible.

native-dependency-may-fall-back-to-source-build

native-dependency-may-fall-back-to-source-build

Flags repositories that use native-heavy packages while the workflow also shows install conditions that may bypass wheels or prebuilt binaries.

nox-without-uv-backend

nox-without-uv-backend

Flags repositories and CI jobs that use nox without the `--uv` flag or `nox.options.uv = True`.

npm-ci-over-npm-install

npm-ci-over-npm-install

Detects workflows that use `npm install` instead of `npm ci` when `package-lock.json` exists in the repository.

outdated-datadog-lambda-extension

outdated-datadog-lambda-extension

Detects Datadog Lambda Extension versions below v88 in GitHub Actions workflows and recommends upgrading to v88 or later.

outdated-husky-version

outdated-husky-version

Flags repositories that use Husky `< 9.1.2` and also have workflows that look relevant to local hook workloads such as lint, format, test, or TypeScript checks.

outdated-setup-action-without-cache

outdated-setup-action-without-cache

Detects older `actions/setup-*` majors when no cache configuration is visible.

pdm-without-use-uv

pdm-without-use-uv

Flags repositories and CI jobs that use PDM without `use_uv = true` configured.

prefer-buildx-bake-for-multiple-images

prefer-buildx-bake-for-multiple-images

Detects CI jobs that build multiple Docker images or targets through separate Docker build invocations.

prefer-buildx-build-over-docker-build

prefer-buildx-build-over-docker-build

Detects CI jobs that run legacy `docker build` instead of `docker buildx build`.

prefer-direct-angular-material-imports

prefer-direct-angular-material-imports

Flags top-level Angular Material imports that can expand the module graph for CI tooling.

prefer-direct-ant-design-icons-imports

prefer-direct-ant-design-icons-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `@ant-design/icons` package root.

prefer-direct-antd-imports

prefer-direct-antd-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `antd` package root.

prefer-direct-date-fns-imports

prefer-direct-date-fns-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `date-fns` package root.

prefer-direct-effect-imports

prefer-direct-effect-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from top-level Effect package entries.

prefer-direct-font-awesome-imports

prefer-direct-font-awesome-imports

Flags top-level Font Awesome icon pack imports that can expand the module graph for CI tooling.

prefer-direct-headlessui-float-react-imports

prefer-direct-headlessui-float-react-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `@headlessui-float/react` package root.

prefer-direct-headlessui-react-imports

prefer-direct-headlessui-react-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `@headlessui/react` package root.

prefer-direct-heroicons-imports

prefer-direct-heroicons-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect grouped Heroicons imports.

prefer-direct-lodash-es-imports

prefer-direct-lodash-es-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `lodash-es` package root.

prefer-direct-material-ui-v4-imports

prefer-direct-material-ui-v4-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from Material UI v4 package roots.

prefer-direct-mui-core-imports

prefer-direct-mui-core-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `mui-core` package root.

prefer-direct-ramda-imports

prefer-direct-ramda-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `ramda` package root.

prefer-direct-react-bootstrap-imports

prefer-direct-react-bootstrap-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `react-bootstrap` package root.

prefer-direct-react-icons-imports

prefer-direct-react-icons-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect grouped `react-icons` icon-set imports.

prefer-direct-react-use-imports

prefer-direct-react-use-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `react-use` package root.

prefer-direct-recharts-imports

prefer-direct-recharts-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `recharts` package root.

prefer-direct-rxjs-imports

prefer-direct-rxjs-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `rxjs` package root.

prefer-direct-tabler-icons-imports

prefer-direct-tabler-icons-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `@tabler/icons-react` package root.

prefer-direct-tremor-imports

prefer-direct-tremor-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `@tremor/react` package root.

Use direct upload for already-compressed artifacts

prefer-direct-upload-for-compressed-artifacts

`actions/upload-artifact` steps that upload a single already-compressed or binary file without using `archive: false`, or that use a version older than v7 which does not support direct uploads.

prefer-direct-visx-imports

prefer-direct-visx-imports

This repository-wide finding comes from an embedded `oxlint` scan using `eslint/no-restricted-imports` to detect imports from the `@visx/visx` package root.

prefer-dorny-paths-filter-for-scoped-jobs

prefer-dorny-paths-filter-for-scoped-jobs

Detects workflows where multiple heavy component-scoped jobs run on broad PR or branch push triggers without a visible `dorny/paths-filter` gate.

prefer-eslint-plugin-import-x

prefer-eslint-plugin-import-x

Flags repositories whose visible ESLint setup appears to use `eslint-plugin-import` without visible `eslint-plugin-import-x` usage.

prefer-explicit-import-extensions

prefer-explicit-import-extensions

Large Vite-family repositories should prefer explicit file extensions for relative JavaScript and TypeScript imports.

prefer-jest-30-for-jest-29

prefer-jest-30-for-jest-29

Jest 29 repositories should consider Jest 30 when the visible TypeScript and JSDOM compatibility conditions are already satisfied.

prefer-lefthook-for-complex-git-hooks

prefer-lefthook-for-complex-git-hooks

Flags repositories whose Git hook setup looks moderately complex and may be easier to maintain with Lefthook.

prefer-mypy-performance-milestone

prefer-mypy-performance-milestone

Detects mypy versions below known performance milestones in the 1.x series and suggests incremental upgrades.

prefer-native-arm-runner-over-qemu

prefer-native-arm-runner-over-qemu

Detects Docker image builds that target ARM through QEMU emulation in GitHub Actions.

prefer-next-typescript-performance-milestone

prefer-next-typescript-performance-milestone

Flags a repository that depends on TypeScript 5.x but is still below the next notable 5.x performance milestone.

prefer-nextest-for-heavy-rust-tests

prefer-nextest-for-heavy-rust-tests

Flags heavy-looking Rust test jobs that still run `cargo test` without visible `cargo-nextest` adoption.

prefer-nextjs-12-minor-performance-milestone

prefer-nextjs-12-minor-performance-milestone

Flags workflows that visibly run `next build` when the repository depends on Next.js `12.0`, `12.1`, or `12.2`.

prefer-nextjs-13-minor-performance-milestone

prefer-nextjs-13-minor-performance-milestone

Flags workflows that visibly run `next build` when the repository depends on Next.js `13.0`, `13.1`, or `13.2`.

prefer-nextjs-14-minor-performance-milestone

prefer-nextjs-14-minor-performance-milestone

Flags workflows that visibly run `next build` when the repository depends on Next.js `14.0` or `14.1`.

prefer-node-run-over-npm-run

prefer-node-run-over-npm-run

Detects simple GitHub Actions steps and package.json scripts that run package scripts through `npm run` when `node --run` may be a lower-overhead replacement.

prefer-oxfmt-over-prettier

prefer-oxfmt-over-prettier

Flags repositories that appear to use Prettier without visible Oxfmt adoption.

prefer-oxlint-over-eslint

prefer-oxlint-over-eslint

Flags repositories that appear to use ESLint without visible Oxlint adoption.

prefer-pydantic-v2

prefer-pydantic-v2

Detects Python dependency files that pin or request Pydantic v1.

prefer-ruff-format-over-black

prefer-ruff-format-over-black

Detects repositories that appear to use `black` without visible Ruff formatting adoption.

prefer-ruff-import-sorting-over-isort

prefer-ruff-import-sorting-over-isort

Detects repositories that appear to use `isort` without visible Ruff import-sorting adoption.

prefer-setup-bun-for-lightweight-node-tooling

prefer-setup-bun-for-lightweight-node-tooling

Flags jobs that:

prefer-setup-uv-for-lightweight-python-tooling

prefer-setup-uv-for-lightweight-python-tooling

Flags jobs that:

prefer-sparse-checkout-for-scoped-workflow

prefer-sparse-checkout-for-scoped-workflow

Flags build or release jobs that use only a narrow working tree and may still benefit from sparse checkout.

prefer-standard-arm-runner-for-api-cli

prefer-standard-arm-runner-for-api-cli

Flags API-bound CLI jobs that run on standard x64 Ubuntu GitHub-hosted runners and may be good candidates for the matching standard arm64 Ubuntu runner.

prefer-standard-arm-runner-for-portable-tooling

prefer-standard-arm-runner-for-portable-tooling

Flags lightweight lint or format tooling jobs that run on standard x64 Ubuntu GitHub-hosted runners and may be good candidates for the matching standard arm64 Ubuntu runner.

prefer-storybook-6-minor-performance-milestone

prefer-storybook-6-minor-performance-milestone

Flags workflows that visibly run `build-storybook` or `storybook build` when the repository depends on Storybook `6.0`, `6.1`, `6.2`, `6.3`, or `6.4`.

prefer-storybook-7-minor-performance-milestone

prefer-storybook-7-minor-performance-milestone

Flags workflows that visibly run `build-storybook` or `storybook build` when the repository depends on Storybook `7.0`, `7.1`, `7.2`, `7.3`, `7.4`, or `7.5`.

prefer-tailwind-v4-upgrade-tool

prefer-tailwind-v4-upgrade-tool

Tailwind CSS v3 projects should usually start a v4 migration with the official upgrade tool, but only when the visible compatibility signals look reasonable.

prefer-turborepo-over-npm-workspaces

prefer-turborepo-over-npm-workspaces

Flags repositories that appear to rely primarily on npm, use more than two workspace patterns, and do not use Turborepo.

prefer-uv-pip-over-pip

prefer-uv-pip-over-pip

Flags `pip install` commands in jobs that already have `setup-uv` available. If uv is already installed (via `astral-sh/setup-uv`), plain `pip install` should be replaced with `uv pip install` for faster installs.

prefer-zstd-compression-for-pushed-docker-images

prefer-zstd-compression-for-pushed-docker-images

Detects pushed BuildKit Docker image builds that do not request zstd layer compression.

pyramid-config-scan-unrestricted

pyramid-config-scan-unrestricted

Detects Pyramid `config.scan()` calls that do not specify an `ignore=` filter when the scan target contains directories that are unlikely to contain runtime application code.

pytest norecursedirs is explicitly set, overriding defaults

pytest-norecursedirs-override

The project has `norecursedirs` explicitly set in a pytest config file **and** does not have `testpaths` configured. The check also verifies that directories corresponding to pytest's default `norecursedirs` entries exist in the repository but are missing from the custom list.

pytest testpaths is not configured

pytest-testpaths-unconfigured

The project uses pytest but has not configured `testpaths` in any pytest config file (`pytest.ini`, `pyproject.toml`, `setup.cfg`, `tox.ini`), and CI workflow steps do not pass explicit test paths either.

python-top-level-heavy-client-init

python-top-level-heavy-client-init

Detects heavy client, connection, or model initialization at module top level in `src/**/*.py` for FastAPI, Django, and Flask repositories.

recommend-rspack-over-webpack

recommend-rspack-over-webpack

This rule detects repositories using webpack 5.x that could benefit from migrating to rspack.

recommend-swc-over-babel

recommend-swc-over-babel

This rule detects repositories using Babel that could benefit from migrating to SWC.

recommend-webpack-4-latest-patch

recommend-webpack-4-latest-patch

This rule detects repositories using webpack 4.x at a version below 4.47.

recommend-webpack-5-latest-patch

recommend-webpack-5-latest-patch

This rule detects repositories using webpack 5.x at a version below 5.50.

redundant-bootstrap-in-husky-hook

redundant-bootstrap-in-husky-hook

Flags repositories whose `.husky/*` hook files still use deprecated Husky bootstrap or x-runner wrapping such as `npx`.

redundant-install-for-preinstalled-cli

redundant-install-for-preinstalled-cli

Flags GitHub-hosted Ubuntu, Windows, or macOS jobs that visibly install a CLI already present on the runner image and then use that CLI later in the same job.

redundant-manual-cache-with-setup-action

redundant-manual-cache-with-setup-action

Detects jobs that configure a setup action's built-in dependency cache and also define a matching manual `actions/cache` layer for the same dependency family.

redundant-npx-or-bootstrap

redundant-npx-or-bootstrap

Detects jobs that already install dependencies and still invoke common local CLI tools through bootstrap runners such as `npx`, `pnpx`, `pnpm dlx`, `bunx`, `yarn dlx`, `uvx`, or `uv tool run`.

renovate-aws-sdk-grouping

renovate-aws-sdk-grouping

Renovate configuration does not group AWS SDK dependencies, and the repository uses multiple AWS SDK v3 packages.

renovate-cdk-deps-grouping

renovate-cdk-deps-grouping

Renovate configuration does not group CDK dependencies, and the repository uses multiple CDK packages.

renovate-rebase-when-unconfigured

renovate-rebase-when-unconfigured

Renovate configuration does not explicitly set `rebaseWhen` locally.

repeated-build-in-same-workflow

repeated-build-in-same-workflow

Detects the same build family running in multiple non-matrix jobs within one workflow.

repeated-install-in-same-job

repeated-install-in-same-job

Detects the same install command running multiple times within one job.

repeated-lint-in-same-workflow

repeated-lint-in-same-workflow

Detects the same lint tool family running in multiple non-matrix jobs within one workflow.

scheduled-heavy-workflow-without-throttling

scheduled-heavy-workflow-without-throttling

Flags heavy scheduled workflows that appear to run more often than every 3 hours.

setup-node-cache-dependency-path-unset

setup-node-cache-dependency-path-unset

Detects `actions/setup-node` steps that enable caching without specifying `cache-dependency-path` when lock files exist outside the repository root.

tailwind-content-config

tailwind-content-config

Tailwind CSS content configuration must be present and scoped to avoid unnecessary file scanning.

terraform-github-app-auth

terraform-github-app-auth

GitHub App authentication via `app_auth` provides significantly higher API rate limits compared to a personal access token (PAT). Higher rate limits reduce the risk of hitting API limits during large `terraform plan`/`apply` operations, concurrent plans, and provider refreshes. Rate limit pauses can delay CI workflows by up to an hour.

terraform-github-parallel-requests

terraform-github-parallel-requests

**Severity**: suggestion **Confidence**: high

terraform-github-slow-resources

terraform-github-slow-resources

These resources already have an implicit repository scope via the GitHub provider. Looking up `data.github_repository` triggers an extra GitHub API call **per resource**, which inflates `terraform plan` and `apply` duration. In repositories with many branch protections, environments, or secrets, this compounds significantly and can trigger API rate limits.

terraform-lockfile-missing

terraform-lockfile-missing

Repositories that run `terraform` in CI but have no `.terraform.lock.hcl` file committed.

terraform-pagerduty-team-membership-version

terraform-pagerduty-team-membership-version

Repositories that use `pagerduty_team_membership` with a PagerDuty provider version constraint that allows versions below v3.32.2.

terraform-parallelism-unconfigured

terraform-parallelism-unconfigured

Terraform defaults to `parallelism=10`, which is slow for large configurations. Tuning parallelism to match runner capacity is one of the highest-leverage Terraform CI optimizations.

tox-without-tox-uv

tox-without-tox-uv

Flags jobs that run `tox` without `tox-uv` installed.

ts-loader-fork-ts-checker

ts-loader-fork-ts-checker

This rule detects webpack configurations using `ts-loader` with `transpileOnly: true` or `happyPackMode: true` but missing `fork-ts-checker-webpack-plugin`.

ungated-heavy-job

ungated-heavy-job

Detects heavy jobs with no visible `if` condition inside broadly triggered workflows.

unnecessary-app-install-for-lint-job

unnecessary-app-install-for-lint-job

Detects jobs that install full application dependencies but only run lint or check tools.

unnecessary-checkout-when-only-using-artifacts

unnecessary-checkout-when-only-using-artifacts

Detects `actions/checkout` steps in jobs that only use artifact actions (`actions/download-artifact@` or `actions/upload-artifact@`) without any visible dependency on repository files.

wasteful-npm-global-install

wasteful-npm-global-install

Jobs that use yarn, pnpm, or bun for package management but still run `npm install -g npm@latest` (or similar npm global upgrade commands).

wasteful-package-install-in-container

wasteful-package-install-in-container

Jobs that run inside a Docker container (`container:`) but install OS packages (`apt-get install`, `apk add`, `brew install`, etc.) in workflow steps where the installed packages are not referenced in later steps.