Ticket-anchored AI development, built on one idea: stop slop before it goes in, instead of reviewing it out afterwards.
Work starts from a ticket, not a prompt. /slopstop:run takes one or more tickets and carries
each from "open" to "merged and archived" by itself — investigate, write failing tests for what
the ticket requires, prove each fails for the right reason, attack the plan adversarially,
implement without weakening the tests, run four mechanical gates, review the diff in a context
that never saw the conversation that wrote it, open the PR, merge, close the ticket, archive the
notes.
It is autonomous by default. An unattended run that stalls waiting for someone is the failure mode the default exists to avoid.
During August 2026 it delivered 16,595 lines of production code and 46,123 lines of tests across five repositories, for 5.5 hours of human attention — one interruption every 2.8 hours of compute, answered in a median of four and a half minutes.
That is about 5.2x what a very generously-defined strong engineer produces, at measured concurrency of 1.45x — with both parallelism multipliers well below their ceiling.
REPORT.md is the full measurement, including the method, the arithmetic, and a section on what would make the comparison wrong.
walkthrough/ is the other half of the answer: six real defects from those runs, each caught by a different check, each quoted from the log that recorded it. Five of the six would have survived a fully green test suite.
Six, and that is the whole list. Full reference with when and why each is used: COMMANDS.md.
| Command | Use it when |
|---|---|
/slopstop:design <topic> |
You have an idea and no plan. Produces a PRD. |
/slopstop:tickets <run-id> |
You have a PRD and no tickets. Produces a ticket tree. |
/slopstop:run <TICKET>… |
You have tickets. Produces merged pull requests. |
/slopstop:grill [plan] |
You want a plan attacked before you commit to it. |
/slopstop:gh-init |
First time in a GitHub repo. Run once. |
/slopstop:doc-sync |
You changed design/ and want the wiki to match. |
The normal path is :design → :tickets → :run. If you already have tickets, go straight to
:run.
Everything else — eleven single-purpose workers — is an internal agent the orchestrators launch. You never invoke one, and there is no slash command for any of them.
Most "AI code review" tooling is recovery: it hunts for slop once it is already in the diff. slopstop puts the weight earlier. The work is scoped and test-anchored before the implementation exists, so there is less slop to catch.
Three properties hold whether or not anyone is watching:
The tests are written first and then frozen. The agent whose code must satisfy them cannot edit them. A gate checks this at every subsequent stage, and it checks by attribution — every change to a frozen test is traced to the commit that made it.
The mechanical gates have no permissive setting. Slop detection, a vacuity check that proves each test would have failed before the branch existed, a complexity bound, and a duplication gate that catches copy-paste clones in the diff. There is no flag that softens a gate because the change looked small. A gate that waves through the cases it exists to police is worse than no gate, because it reports clean.
The session that wrote the code never reviews it. Reviewers and adversaries run as subagents with their own context and no access to the conversation that produced the work. This has an incident behind it — a PR once recorded a clean review the authoring session had performed on its own code.
The argument at length: Prevention, Not Recovery.
Claude Desktop users: commands in this document use the Claude Code form (
/slopstop:run,/slopstop:design, etc.). If you installed via the Desktop installer, use the hyphenated form instead:/slopstop-run,/slopstop-design, and so on.
/plugin marketplace add iansmith/slopstop
/plugin install slopstop@slopstop
Commands are then namespaced: /slopstop:run, /slopstop:design, and so on.
(The repo, the marketplace it hosts, and the plugin inside it all share the name slopstop —
hence the doubled-up second command.)
Claude Desktop has no /plugin manager and cannot install from a marketplace. It does load
standalone slash commands from ~/.claude/commands/, so this installer drops them there directly.
A stopgap until Desktop ships plugin support.
curl -fsSL https://raw.githubusercontent.com/iansmith/slopstop/master/install-for-claude-desktop.sh | bashCommands then appear un-namespaced: /slopstop-run, /slopstop-design. The installer drops every
skill, workers included, since an orchestrator has to be able to invoke them.
Pinning to a tag, uninstalling, and the MCP details are in SETUP-GUIDE.md.
slopstop is a wrapper around a ticket-system MCP and a GitHub backend. It has no API client of its own.
Required
- Claude Code with the plugin manager, or Claude Desktop via the installer above.
- A ticket system — GitHub Issues (needs no extra MCP), or Linear, or JIRA:
/plugin install linear@claude-plugins-official /plugin install atlassian@claude-plugins-official - A
.project-conf.tomlin each project. See below.
Required for the complexity gate
- lizard —
pip install lizard. slopstop'scomplexity-checkgate measures every function touched in a diff for cyclomatic complexity — the number of independent paths through the code. Functions above the project's configured threshold stop the ticket. lizard is the tool that does the measuring; without it on yourPATHthe gate cannot run.
Required for the duplication gate
- ast-grep —
brew install ast-greporcargo install ast-grep. slopstop'sduplication-checkgate extracts AST blocks from every changed file, normalises identifiers and literals, and flags clone groups with two or more members. ast-grep is the tree-sitter frontend that does the extraction; without it on yourPATHthe gate cannot run. Supports Python, Go, TypeScript, JavaScript, C#, Rust, Kotlin, and Java.
Required for the PR and merge stages
- The GitHub MCP (
/plugin install github@claude-plugins-official), or theghCLI, or both. Two things still prefergh: reading bot comments, and the merge itself —:runusesgh pr merge --merge --delete-branch, and the MCP's merge tool does not delete the branch.
Known limitation.
mcp__plugin_github_github__create_pull_requestreturns 403 on some repos due to the plugin's PAT scope.:runfalls back togh pr createon a 403, so withoutghinstalled PR creation will fail.
Recommended
- A test command the workers can invoke. Auto-detected from
Taskfile.yml,package.json,Makefile,Cargo.toml,go.mod, orpyproject.toml, then threaded to every worker that needs one. - A PR review bot, if you want a second opinion on top of the
reviewworker. It is read once and never waited for.
Full detail, including MCP tool namespaces and troubleshooting: SETUP-GUIDE.md.
Every project needs .project-conf.toml at its repo root. Minimal versions:
GitHub Issues
system = "github"
key = "owner/repo"
prefix = "MYPREFIX"
[status_labels]
in_progress = "status:in-progress"/slopstop:gh-init writes this for you and creates the labels. Run it once.
Linear
system = "linear"
key = "MAZ" # Linear team key
prefix = "MAZ"JIRA
system = "jira"
key = "PLTF" # JIRA project key
prefix = "PLTF"The plugin reads this on every invocation and only operates on tickets whose key matches the
cwd's prefix — so a session in one project can never touch another project's ticket.
Every available key, with defaults: CONFIG.md.
| QUICKSTART.md | One real bug from ticket to merged PR, in about 15 minutes. |
| COMMANDS.md | The six commands — when and why to use each. |
| REPORT.md | What it produces, measured. |
| walkthrough/ | Six defects, six different checks, quoted from the logs. |
| SETUP-GUIDE.md | Installation, MCP servers, project layout. |
| CONFIG.md | Every .project-conf.toml setting. |
| PRIVACY.md | What leaves your machine, and what does not. |
CC-BY-SA-4.0. See LICENSE.
Ian Smith — github.com/iansmith