Logo for lint.ai: stylized text of 'lint.ai', with a circular set of arrows connecting the 'i' letters in each of 'lint' and 'ai'.

AROMA: The Laws of Lint

Fight code smell by obeying these five simple rules for your linters.


Every lint rule must be actionable, and must contain the desired action in its text, explained at a level of technical complexity immediately grokkable by the youngest intern at the company.
X We found smart-quotes in your string literals.
This line has a Smart Quote. Replace with a normal double quote (").

Requires Human Attention

If the fix can be derived from the AST, the linter should just implement (and offer to a human for approval) the transform. (Note that a temporary human-actionable linter is fine, so long as the automatic transform is a followup task.)
X PEP8 E501: This line is too long.


No linter is perfect. Every linter must be able to be bypassed on both a per-line and a project-wide basis.


The number of lint exceptions that will ultimately be ignored by the programmer has to be low enough that it's reasonable to require that each such exception must have an in-line explanation in the code.
X Don’t name methods in camelCase.
The same method name is being defined in camelCase and snake_case. Please make sure their functionality cannot diverge.


No sustainable objection to a lint rule can exist. Either the rule is self-evident, or a global consensus was found.
X Don't use Perl; it's an awful language.
Please don't use the builtin input() in code that might run under Python 2; it doesn't do what you'd expect, and opens up a ton of security vulnerabilities. Use raw_input() or six.moves.input(), instead.