Skip to main content
@reticlehq/eslint-plugin is three ESLint rules that keep Reticle’s signal layer and its comments self-enforcing. It is entirely optional: nothing in Reticle needs it, and you want it only once your app emits signals and you want the linter to tell you when a new mutation has no signal. It exists because conventions rot. Someone adds a mutation, forgets the signal, and every verdict for that flow quietly drops a grade. Nothing breaks, the tests still pass, the evidence just gets weaker. A lint rule is the only way a convention survives contact with a deadline. Apache 2.0. Depends on @typescript-eslint/utils. Peer dependency: eslint >= 9.

Exports

The rules

reticle/require-signal-on-mutation

Warns when a store mutation happens without a mapped Reticle signal. Message id: mutationWithoutSignal. Text: store mutation without a mapped Reticle signal. Options (options[0], no additional properties):
The check is scoped per function: a mutation and its signal must live in the same function body.

reticle/no-internal-tags

Errors on internal design-doc reference codes and internal version strings appearing in comments, file names, directory names or test descriptions. Message ids: internalTag (in a comment or test description) and pathTag (in a file or directory name), each with a { tag } placeholder. No options. This one is mostly for contributors to Reticle itself, but the recommended config turns it on for everyone.

reticle/no-runaway-comment

Errors on a single block comment longer than 60 lines, which is usually pasted output rather than prose. Message id: runawayComment, with { lines } and { max } placeholders. No options. One config, recommended:
Which is exactly:
recommended enables all three rules, and no-internal-tags and no-runaway-comment at error. An older README documented only the first rule, so the other two can arrive as a surprise. Enable the rules individually if you want just the signal check.

Why signals are the strongest evidence

What a signal proves that a rendered pixel cannot.
Last modified on October 25, 2026