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.

$ 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