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.

$ 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