AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
Ticket-anchored AI development — stop slop before it goes in
Translation pending
Developer toolsGo · PythonGitHub @iansmithOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
slopstop is a system for preventing a coding agent, in this case Claude Code, from introducing slop and bugs into your code base. Slopstart is quite large when you using all of its features. It also is slow. A single ticket may take multiple hours... that's because its doing the checks that a senior engineer would do.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
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.Read the full README ↗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 | bash
Commands 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
/plugin install linear@claude-plugins-official
/plugin install atlassian@claude-plugins-official
.project-conf.toml in each project. See below.Required for the complexity gate
pip install lizard. slopstop's
complexity-check gate 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
your PATH the gate cannot run.Required for the duplication gate
brew install ast-grep or
cargo install ast-grep. slopstop's duplication-check gate 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 your PATH the gate cannot run. Supports Python, Go, TypeScript, JavaScript, C#,
Rust, Kotlin, and Java.Required for the PR and merge stages
/plugin install github@claude-plugins-official), or the gh CLI, or
both. Two things still prefer gh: reading bot comments, and the merge itself — :run uses
gh 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
Taskfile.yml, package.json,
Makefile, Cargo.toml, go.mod, or pyproject.toml, then threaded to every worker that
needs one.review worker. 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