Case Studies.
A register of every repository we have onboarded with sm refit, start to finish. Each run publishes its whole result: what got genuinely fixed, what was merely baselined, and every defect the run exposed in slop-mop itself.
Method
Every run follows the same five steps.
- Pick a repository cold. No coordination with maintainers and no pre-cleaning. Both runs so far are published; with two of them, that is a description of what happened, not evidence of a policy.
- Record the starting board.
sm scourbefore anything is touched, artifact committed. - Run
sm refitgate by gate. Fix what can be fixed. Where the result is to accept the existing state instead, record it as a baseline. - Record the finishing board, and separate the fixes from the baselines in a table.
- File tool friction against our own repo as a barnacle, and publish the count. See below.
The reason step 5 exists: a green board proves nothing on its own. It can mean the repo was already in good shape, or that we disabled gates and lowered thresholds until the screen turned green — and those look identical from the outside. So every study carries a fixed-versus-baselined table, a suppression count, and the anti-gaming meta-gates left switched on.
| Refit · one-time | Onboarding, and what these studies document. The goal is a repo with no known issues and a committed baseline, so that afterwards anything flagged is new slop rather than years of accumulated noise. |
|---|---|
| Maintenance · every watch | sm swab → sm scour → sm buff. The steady state. Not what these studies measure. |
The register
Two runs so far, at opposite ends of the size range, most recent first.
| Run | Scope | Start | Finish | Suppressed | Barnacles |
|---|---|---|---|---|---|
| rulebook-ai Aug 2026 |
8.5k lines Python |
8 gates failing 155 findings |
A+ 0 findings |
9 7 are placeholders |
10 |
Mostly real fixes. Two latent crashes, a CI pipeline dead since GitHub retired upload-artifact@v3, a dependency pin that will not build, and a pytest config that stopped the suite booting. Coverage was the only thing baselined; strict typing was satisfied rather than downgraded.
Read the run →
|
|||||
| OpenHands Jun 2026 |
322k lines Python, TS |
7 gates failing | Maintenance scour clean |
61 | 2 |
| Mostly baselining. Coverage frozen at the existing 49%, two strict-typing gates downgraded, the front-end suite scoped out. A small set of genuine fixes came with it. On a codebase this size that was the practical ceiling. Read the run → | |||||
Barnacles · what each run cost us
A barnacle is friction in slop-mop itself — a false positive, a misleading message, a gate that fails for the wrong reason. We file them against our own repo and publish the count per run.
-
The worst was a security scanner that never ran being reported as a finding: on a checkout without
pip-audit, the gate announced “1 security scanner(s) found issues” — naming a vulnerability that did not exist while concealing that nothing had been audited. The guard for exactly that already existed in our code and was never called from anywhere.Also: a gate that could not tell code from prose, refit blaming the wrong gate, and two path bugs. All ten fixed. Our first attempt at fixing the scanner bug was worse than the bug, and review caught it.
-
refit reformatted 94 applied database migrations — historical records that must never be rewritten — and separately re-formatted 417 files in a repo that already pinned its own formatter, which then disagreed and demanded the work be redone.
One fixed the next day; #263 is still open at the time of writing. The lower count is not a better result. This run drove fewer gates to green, so there were fewer opportunities to hit a defect — though we have not measured that, and two runs cannot separate the two explanations.
Twelve barnacles across two runs. We have no baseline to compare that against — no other run, and no equivalent figure published by comparable tools — so we are reporting the count, not characterising it as good or bad.
The loop · runs feed back into the tool
Each run is also a test of slop-mop. When the tool gets in the way, that friction is filed against our own repo as a barnacle and fixed there, so the next run uses a tool that no longer has that defect. The table records what that has actually cost so far.
| Run | Filed | Barnacles | Still open | Churn to fix them |
|---|---|---|---|---|
| OpenHands | 9 Jun 2026 | 2 | 1 | +714/−30 · 4 files |
| rulebook-ai | 10 Aug 2026 | 10 | 0 | +4,811/−1,319 · 32 files |
The intended effect of that loop is that later runs hit less friction. These two runs do not show it. The count went from 2 in June to 10 in August, and the remediation churn went up by roughly a factor of seven.
We can think of three explanations and cannot currently separate them. The June run stopped at a baseline with a number of gates disabled or scoped out, while the August run drove all 21 gates to green — more gates exercised is more surface on which to hit a defect. The two repositories are different enough that the runs may not be comparable. And the August run was more diligent about filing friction rather than working around it, which would raise the count without the tool being any worse.
That last one matters most: a barnacle count measures friction noticed and recorded, not defects present. It can rise because we looked harder. A third run, or a repeat run against a repository already onboarded, would say more than these two do — until then the trend line is one segment pointing the wrong way, and we are not going to describe that as the process working.
Scope of these numbers. Each finish state is slop-mop's own board, not the repository's CI. The two are separate, and a green slop-mop board says nothing about whether the project's own pipeline passes. Neither run has been merged upstream: both live on branches we control.