@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):
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.
The recommended config
One config,recommended:
Why signals are the strongest evidence
What a signal proves that a rendered pixel cannot.