Vague rules like "write clean code" do nothing. Specific rules are what change Claude's behavior.
In your CLAUDE.md, write the exact things you'd say in a code review: use camelCase for variables, never commit to main directly, always write a test before fixing a bug, prefer fetch over axios in this project. Name the libraries you ban and the ones you prefer.
If your linter enforces a rule, Claude doesn't need to re-learn it. But patterns that ESLint won't catch, conventions your team agreed on in Slack, and things you've fixed times already belong in CLAUDE.md. I find these "we agreed in Slack" conventions are where most teams lose the most time.