Back to the catalog

ticket-plugin

A Claude Code plugin that keeps a durable per-ticket plan, findings, and progress log for every ticket you work on — without bloating the ti

Open source Open in the app JSON README (API)

About

A Claude Code plugin that keeps a durable per-ticket plan, findings, and progress log for every ticket you work on — without bloating the ticket itself or polluting the repo. Auto-detects Linear or JIRA as your ticket system at run-time. The four slash commands form a complete loop around a ticket: - /ticket-plugin:start <KEY> fetches the ticket, transitions it to "In Progress", and seeds task_plan.md, findings.md, and progress.md. Resuming an existing ticket reads back the tracking files and prints a summary. - /ticket-plugin:update is a mid-session checkpoint. The ticket stays active. - /ticket-plugin:pause snapshots state and clears the active-ticket pointer. Local-only. - /ticket-plugin:archive pushes the final task plan back to the ticket as its description and posts findings as a comment, then archives the local folder. Refuses to run unless the ticket is already in a terminal state on the ticket system — the user controls the state transition. The aim: fewer wasted tokens re-exp

Details

Kind
Plugins
Topic
Developer tools
Publisher
iansmith
Origin
marketplace
Category
ferramentas
Stars
2
Last push
2026-09-07T19:52:57Z
Repository state
ativo
Language
Go
License
NOASSERTION
Added
2026-08-30 01:48:58
Updated
2026-08-30 01:48:58
Origin id
iansmith/ticket-plugin/ticket-plugin

README

# slopstop

**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.

---

## Does it work?

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](REPORT.md)** is the full measurement, including the method, the arithmetic, and a
section on what would make the comparison wrong.

**[walkthrough/](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.

---

## The commands

Six, and that is the whole list. Full reference with when and why each is used:
**[COMMANDS.md](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.

---

## Why prevention rather than recovery

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](https://iansmith.github.io/slopstop/what_is_slopstop.html)**.

---

> **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.

## Install

### Claude Code (CLI) — recommended

```
/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 — manual install

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.

```bash
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](SETUP-GUIDE.md)**.

---

## What you need

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.toml`** in each project. See below.

**Required for the complexity gate**

- **[lizard](https://github.com/terryyin/lizard)** — `pip install lizard`. slopstop's
  `complexity-check` gate measures every function touched in a diff for
  [cyclomatic complexity](https://en.wikipedia.org/wiki/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**

- **[ast-grep](https://ast-grep.github.io/)** — `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**

- **The GitHub MCP** (`/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_request` returns 403 on some repos
> due to the plugin's PAT scope. `:run` falls back to `gh pr create` on a 403, so without `gh`
> installed PR creation will fail.

**Recommended**

- **A test command** the workers can invoke. Auto-detected from `Taskfile.yml`, `package.json`,
  `Makefile`, `Cargo.toml`, `go.mod`, or `pyproject.toml`, then threaded to every worker that
  needs one.
- **A PR review bot**, if you want a second opinion on top of the `review` worker. It is read
  **once** and never waited for.

Full detail, including MCP tool namespaces and troubleshooting: **[SETUP-GUIDE.md](SETUP-GUIDE.md)**.

---

## Configuration

Every project needs `.project-conf.toml` at its repo root. Minimal versions:

**GitHub Issues**

```toml
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**

```toml
system = "linear"
key    = "MAZ"      # Linear team key
prefix = "MAZ"
```

**JIRA**

```toml
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](CONFIG.md)**.

---

## Where to go next

| | |
|---|---|
| **[QUICKSTART.md](QUICKSTART.md)** | One real bug from ticket to merged PR, in about 15 minutes. |
| **[COMMANDS.md](COMMANDS.md)** | The six commands — when and why to use each. |
| **[REPORT.md](REPORT.md)** | What it produces, measured. |
| **[walkthrough/](walkthrough/)** | Six defects, six different checks, quoted from the logs. |
| **[SETUP-GUIDE.md](SETUP-GUIDE.md)** | Installation, MCP servers, project layout. |
| **[CONFIG.md](CONFIG.md)** | Every `.project-conf.toml` setting. |
| **[PRIVACY.md](PRIVACY.md)** | What leaves your machine, and what does not. |

---

## License

CC-BY-SA-4.0. See [LICENSE](LICENSE).

## Author

Ian Smith — [github.com/iansmith](https://github.com/iansmith)

More