Your coding agents keep re-introducing the bugs you already fixed.
deslop puts your rules in the agent's context before it writes code — and gates the patterns we can prove agents emit.
open source · github.com/Amaresh/deslop
$ deslop install --target . resolving pack index… deslop-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 3 rules (1 checker, 2 teach-only) next: deslop review to dry-run against HEAD deslop check in CI for checker rules
how is this different
Most tools review code after it's written — comments on a pull request, fixes you'll apply next sprint. deslop works earlier: your rules sit in the agent's context before it generates, so the bad pattern never lands. And for patterns we can prove agents emit, deslop check gates them in CI.
> Reviewers grade papers. deslop 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. Today exactly one rule holds that status: no-jpql-null-or-lower. The Rules page shows which is which.
$ deslop 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.
$ deslop 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