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.
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.