stop-me-check
Run the stop-me gates backwards over code that already exists. Report only what would have failed all three.
Method
- Read
.stop-me.ymlif present, else inferhorizonfrom the repo (deploy targets, tenancy columns, contributor count) and say which you assumed. - Read
DECISIONS.mdif present. Anything already logged there is settled — never report it. - Sweep the irreversible surfaces from the stop-me skill — that list lives there and only there; never keep a second copy here. For each, gather evidence before you claim anything:
migrations/— drops, renames, narrowing types, missing down-path- money paths — charge/refund/quota, and whether an idempotency key and a test exist
- secrets — literals in tracked files;
git log -Sfor the commit that introduced them - auth — password hashing, token expiry, permission checks on write paths
- tenancy — tables missing a tenant column that siblings have
- published shapes — unversioned endpoints,
anyon exported types, CLI flags - deletes —
DELETE/drop/rm -rfwithout a restore path - data not collected — events and audit rows with no actor or timestamp
- Rank by blast radius, not by count.
Output
stop-me check · <repo> · horizon: <h> (<inferred|from .stop-me.yml>)
<n> findings on irreversible surfaces
🛑 <file:line> — <one line>
[evidence] <what you actually read>
[cost] <what undoing this now requires>
...
Clean: <surfaces you checked and found nothing on>
End with the Clean: line every time. A list of what you checked and cleared is what makes the findings above it believable.
Rules
- Cite
file:linefor every finding. No citation, no finding. - Report what the code does, never what the author was thinking.
- Reversible problems are not findings. A slow query, an ugly name, a missing type on an internal function — all silence.
- Zero findings is a real result. Print the
Clean:line and stop. Do not pad.