{
  "markdown": "# slopstop\n\n**Ticket-anchored AI development, built on one idea: stop slop before it goes in, instead of\nreviewing it out afterwards.**\n\nWork starts from a ticket, not a prompt. `/slopstop:run` takes one or more tickets and carries\neach from \"open\" to \"merged and archived\" by itself — investigate, write failing tests for what\nthe *ticket* requires, prove each fails for the right reason, attack the plan adversarially,\nimplement without weakening the tests, run four mechanical gates, review the diff in a context\nthat never saw the conversation that wrote it, open the PR, merge, close the ticket, archive the\nnotes.\n\nIt is **autonomous by default.** An unattended run that stalls waiting for someone is the failure\nmode the default exists to avoid.\n\n---\n\n## Does it work?\n\nDuring August 2026 it delivered **16,595 lines of production code and 46,123 lines\nof tests across five repositories**, for **5.5 hours of human attention** — one interruption every\n2.8 hours of compute, answered in a median of four and a half minutes.\n\nThat is about **5.2x** what a very generously-defined strong engineer produces, at measured\nconcurrency of 1.45x — with both parallelism multipliers well below their ceiling.\n\n**[REPORT.md](REPORT.md)** is the full measurement, including the method, the arithmetic, and a\nsection on what would make the comparison wrong.\n\n**[walkthrough/](walkthrough/)** is the other half of the answer: six real defects from those\nruns, each caught by a *different* check, each quoted from the log that recorded it. Five of the\nsix would have survived a fully green test suite.\n\n---\n\n## The commands\n\nSix, and that is the whole list. Full reference with when and why each is used:\n**[COMMANDS.md](COMMANDS.md)**.\n\n| Command | Use it when |\n|---|---|\n| `/slopstop:design <topic>` | You have an idea and no plan. Produces a PRD. |\n| `/slopstop:tickets <run-id>` | You have a PRD and no tickets. Produces a ticket tree. |\n| `/slopstop:run <TICKET>…` | You have tickets. Produces merged pull requests. |\n| `/slopstop:grill [plan]` | You want a plan attacked before you commit to it. |\n| `/slopstop:gh-init` | First time in a GitHub repo. Run once. |\n| `/slopstop:doc-sync` | You changed `design/` and want the wiki to match. |\n\nThe normal path is `:design` → `:tickets` → `:run`. If you already have tickets, go straight to\n`:run`.\n\nEverything else — eleven single-purpose workers — is an internal agent the orchestrators launch.\nYou never invoke one, and there is no slash command for any of them.\n\n---\n\n## Why prevention rather than recovery\n\nMost \"AI code review\" tooling is recovery: it hunts for slop once it is already in the diff.\nslopstop puts the weight earlier. The work is scoped and test-anchored *before* the implementation\nexists, so there is less slop to catch.\n\nThree properties hold whether or not anyone is watching:\n\n**The tests are written first and then frozen.** The agent whose code must satisfy them cannot\nedit them. A gate checks this at every subsequent stage, and it checks by attribution — every\nchange to a frozen test is traced to the commit that made it.\n\n**The mechanical gates have no permissive setting.** Slop detection, a vacuity check that proves\neach test would have failed before the branch existed, a complexity bound, and a duplication gate\nthat catches copy-paste clones in the diff. There is no flag that softens a gate because the\nchange looked small. A gate that waves through the cases it exists\nto police is worse than no gate, because it reports clean.\n\n**The session that wrote the code never reviews it.** Reviewers and adversaries run as subagents\nwith their own context and no access to the conversation that produced the work. This has an\nincident behind it — a PR once recorded a clean review the authoring session had performed on its\nown code.\n\nThe argument at length: **[Prevention, Not\nRecovery](https://iansmith.github.io/slopstop/what_is_slopstop.html)**.\n\n---\n\n> **Claude Desktop users:** commands in this document use the Claude Code form\n> (`/slopstop:run`, `/slopstop:design`, etc.). If you installed via the Desktop\n> installer, use the hyphenated form instead: `/slopstop-run`, `/slopstop-design`,\n> and so on.\n\n## Install\n\n### Claude Code (CLI) — recommended\n\n```\n/plugin marketplace add iansmith/slopstop\n/plugin install slopstop@slopstop\n```\n\nCommands are then namespaced: `/slopstop:run`, `/slopstop:design`, and so on.\n\n(The repo, the marketplace it hosts, and the plugin inside it all share the name `slopstop` —\nhence the doubled-up second command.)\n\n### Claude Desktop — manual install\n\nClaude Desktop has no `/plugin` manager and cannot install from a marketplace. It *does* load\nstandalone slash commands from `~/.claude/commands/`, so this installer drops them there directly.\nA stopgap until Desktop ships plugin support.\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/iansmith/slopstop/master/install-for-claude-desktop.sh | bash\n```\n\nCommands then appear un-namespaced: `/slopstop-run`, `/slopstop-design`. The installer drops every\nskill, workers included, since an orchestrator has to be able to invoke them.\n\nPinning to a tag, uninstalling, and the MCP details are in\n**[SETUP-GUIDE.md](SETUP-GUIDE.md)**.\n\n---\n\n## What you need\n\nslopstop is a **wrapper around a ticket-system MCP and a GitHub backend.** It has no API client of\nits own.\n\n**Required**\n\n- **Claude Code** with the plugin manager, or Claude Desktop via the installer above.\n- **A ticket system** — GitHub Issues (needs no extra MCP), or Linear, or JIRA:\n  ```\n  /plugin install linear@claude-plugins-official\n  /plugin install atlassian@claude-plugins-official\n  ```\n- **A `.project-conf.toml`** in each project. See below.\n\n**Required for the complexity gate**\n\n- **[lizard](https://github.com/terryyin/lizard)** — `pip install lizard`. slopstop's\n  `complexity-check` gate measures every function touched in a diff for\n  [cyclomatic complexity](https://en.wikipedia.org/wiki/Cyclomatic_complexity) — the\n  number of independent paths through the code. Functions above the project's configured\n  threshold stop the ticket. lizard is the tool that does the measuring; without it on\n  your `PATH` the gate cannot run.\n\n**Required for the duplication gate**\n\n- **[ast-grep](https://ast-grep.github.io/)** — `brew install ast-grep` or\n  `cargo install ast-grep`. slopstop's `duplication-check` gate extracts AST blocks from\n  every changed file, normalises identifiers and literals, and flags clone groups with two\n  or more members. ast-grep is the tree-sitter frontend that does the extraction; without\n  it on your `PATH` the gate cannot run. Supports Python, Go, TypeScript, JavaScript, C#,\n  Rust, Kotlin, and Java.\n\n**Required for the PR and merge stages**\n\n- **The GitHub MCP** (`/plugin install github@claude-plugins-official`), or **the `gh` CLI**, or\n  both. Two things still prefer `gh`: reading bot comments, and the merge itself — `:run` uses\n  `gh pr merge --merge --delete-branch`, and the MCP's merge tool does not delete the branch.\n\n> **Known limitation.** `mcp__plugin_github_github__create_pull_request` returns 403 on some repos\n> due to the plugin's PAT scope. `:run` falls back to `gh pr create` on a 403, so without `gh`\n> installed PR creation will fail.\n\n**Recommended**\n\n- **A test command** the workers can invoke. Auto-detected from `Taskfile.yml`, `package.json`,\n  `Makefile`, `Cargo.toml`, `go.mod`, or `pyproject.toml`, then threaded to every worker that\n  needs one.\n- **A PR review bot**, if you want a second opinion on top of the `review` worker. It is read\n  **once** and never waited for.\n\nFull detail, including MCP tool namespaces and troubleshooting: **[SETUP-GUIDE.md](SETUP-GUIDE.md)**.\n\n---\n\n## Configuration\n\nEvery project needs `.project-conf.toml` at its repo root. Minimal versions:\n\n**GitHub Issues**\n\n```toml\nsystem = \"github\"\nkey    = \"owner/repo\"\nprefix = \"MYPREFIX\"\n\n[status_labels]\nin_progress = \"status:in-progress\"\n```\n\n`/slopstop:gh-init` writes this for you and creates the labels. Run it once.\n\n**Linear**\n\n```toml\nsystem = \"linear\"\nkey    = \"MAZ\"      # Linear team key\nprefix = \"MAZ\"\n```\n\n**JIRA**\n\n```toml\nsystem = \"jira\"\nkey    = \"PLTF\"     # JIRA project key\nprefix = \"PLTF\"\n```\n\nThe plugin reads this on every invocation and **only operates on tickets whose key matches the\ncwd's `prefix`** — so a session in one project can never touch another project's ticket.\n\nEvery available key, with defaults: **[CONFIG.md](CONFIG.md)**.\n\n---\n\n## Where to go next\n\n| | |\n|---|---|\n| **[QUICKSTART.md](QUICKSTART.md)** | One real bug from ticket to merged PR, in about 15 minutes. |\n| **[COMMANDS.md](COMMANDS.md)** | The six commands — when and why to use each. |\n| **[REPORT.md](REPORT.md)** | What it produces, measured. |\n| **[walkthrough/](walkthrough/)** | Six defects, six different checks, quoted from the logs. |\n| **[SETUP-GUIDE.md](SETUP-GUIDE.md)** | Installation, MCP servers, project layout. |\n| **[CONFIG.md](CONFIG.md)** | Every `.project-conf.toml` setting. |\n| **[PRIVACY.md](PRIVACY.md)** | What leaves your machine, and what does not. |\n\n---\n\n## License\n\nCC-BY-SA-4.0. See [LICENSE](LICENSE).\n\n## Author\n\nIan Smith — [github.com/iansmith](https://github.com/iansmith)\n",
  "bytes": 9208,
  "sha": "377b18571bdc996ab9acecd1620ad209f2b55d862f8c010446924e02150e423e",
  "repo_slug": "iansmith/ticket-plugin",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_iansmith_ticket_plugin_ticket_plugin_af26b22f/readme"
}