not a linter · not a PR bot
Shift code quality gates from reactive post-PR reviews to proactive runtime and compilation constraints on your agents.
Stop agents from making mistakes before they touch code.
open source · github.com/StopThatSlop/stopthatslop
$ python3 scripts/stopthatslop.py install --target . resolving pack index… stopthatslop-java-spring-v1 (0.1.0) target harness: cursor (detected .cursor/) ✓ writing skills/no-jpql-null-or-lower/SKILL.md ✓ writing skills/no-transactional-external-io/SKILL.md ✓ writing skills/no-rest-template-without-timeout/SKILL.md collision check: AGENTS.md found, no conflicts installed Java/Spring pack · checkers fail CI next: stopthatslop review to dry-run against HEAD stopthatslop check in CI for checker rules
how is this different
We are not a linter. Linters see the aftermath. We are not a PR bot — we do not comment on pull requests. Most tools still review code after it exists. StopThatSlop puts the constraint in the agent's context before it generates. For patterns we can prove agents emit, stopthatslop check fails CI. Teach-only rules never do.
> Reviewers grade papers. StopThatSlop changes what the author writes.
the pipeline
Three stages. Only one of them is trusted enough to fail a build.
stage 1 — teach
Opinionated defaults in the agent's context
Small per-rule skills installed next to your code. When the agent opens a matching file, the rule is already there — not in a prompt appendix it will skim, and not in a PR comment three days late. Teach rules are opinionated defaults, nothing more.
# what the agent reads, before it writes: $ cat skills/no-jpql-null-or-lower/SKILL.md invariant: optional JPQL filters use an empty-string sentinel, never :param IS NULL OR LOWER(...) # so this: WHERE (:status IS NULL OR LOWER(c.status) = LOWER(:status)) # becomes this: WHERE (:status = '' OR LOWER(c.status) = LOWER(:status))
stage 2 — checker
The rare ones earn a CI gate
A rule only becomes a checker when an independently produced agent-written violation sample fails its detector. Teach-only never fails the build. The Rules page shows which is which.
$ python3 scripts/stopthatslop.py check FAIL InvoiceRepository.java:18 jpql null-or-lower filter :param IS NULL OR LOWER(i.status) = LOWER(:status) ───────────────────────────────── 1 violation / 1 checker rule · exit 1
stage 3 — mining
Rules extracted from your own fix history
A deterministic CLI distills candidates from your git log; judgment runs inside your own agent session; every promotion passes a verification gate before it ships as a rule. Currently validating on our own repositories.
$ python3 scripts/stopthatslop.py mine --dry-run [cli] classifying fix commits… done [cli] distilling candidate patterns… done [your agent session] drafting invariants… [cli] verification gate: rejecting drafts without an independent agent-written failing sample status: validating on our own repositories