Skip to main content
Every rule below can be graded in lint.rules in forge.yaml (error, warn or off). The ID is the bracketed [rule] each finding prints. Use this page to look up a rule you have seen in an error; the per-family pages explain each one, with a bad example and its fix.

Migrations

Destructive changes, NOT NULL, defaults, version numbers, transactions, compatibility declarations.

Conventions, contracts and Deps

Proto layout, handler errors, Deps shape, package contracts, SQL placeholders, frontend config.

Schema markers and write policy

Misspelled markers, closed sets, db grants, columns nothing writes.

Deploy, secrets and the graph

Flux safety, secrets, composition graph, component drift, static export.

Tracing, tests and generated files

Untraced calls, slow tests, hand-edited generated files, lockfile drift.

The rollout

What v1.0.0 -> v1.0.1 means and how to gate early.

How to read the table

The Rollout column is the introduced_in release, then -> and the gates_from release for a rule that is, or recently was, in its grace period. A single release (v0.1.40) means the rule has gated since that release or earlier; the table was audited back to v0.1.40. If your forge_version is below the gates_from release, the rule’s findings are warnings with a note. See the rollout. The Group column is how forge groups the rules in its own source; it is not the same as a lane flag. A Codemod is a command that makes the fix for you. Severity is a property of the finding, not the rule, because some rules emit both. The family pages give the default for each.

All rules

Not graded by lint.rules

A few things in a lint report are not forge rules, so lint.rules rejects them as keys and points at the dial that does govern them.