Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ jobs:
run: |
python3 scripts/validate_repo.py
python3 scripts/validate_cases.py
python3 scripts/test_ticket_score.py

- name: Run static security checks
shell: bash
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ check: validate security benchmark

validate:
python3 scripts/validate_repo.py
python3 scripts/test_ticket_score.py

security:
bash scripts/security_scan.sh .
Expand Down
78 changes: 60 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ The skill loads only the references needed for the material under review.
### Audit without rewriting

```text
$slop-cop Audit this draft. List the evidence, severity, and recommended fixes without rewriting it.
$slop-cop Audit this draft without rewriting it.
```

### Grade a post
Expand All @@ -115,27 +115,65 @@ $slop-cop Review this landing page for generic generated-UI defaults, unsupporte
$slop-cop Review this diff for happy-path-only logic, swallowed failures, unsafe boundaries, unnecessary abstractions, and missing tests.
```

Compatible agents may select Slop Cop when a request matches its description. Explicit invocation is the most reliable way to request a particular review.
### Slop Cop this

## Output
```text
$slop-cop This.
```

Slop Cop supports three modes:
Every request returns a Slop Cop report-card ticket: a deterministic 0–100
score, letter grade, evidence-backed charge, fixed slogan, and recommended next
step. It targets the work, not the person. It does not message anyone unless
you explicitly ask it to send the ticket through a connected service.

- **Audit:** findings, quoted evidence, severity, and fixes
- **Grade:** a scored review using calibration anchors
- **Rewrite:** the smallest useful revision, followed by a self-audit
Compatible agents may select Slop Cop when a request matches its description. Explicit invocation is the most reliable way to request a particular review.

For prose, it scores five dimensions from 1–10:
## Output

| Dimension | Review question |
|---|---|
| Directness | Does it state the point without empty setup or stacked hedging? |
| Specificity | Are material claims concrete and supportable? |
| Rhythm | Are sentence and paragraph shapes varied for a reason? |
| Voice | Does it preserve a consistent, identifiable voice? |
| Density | Is every remaining sentence doing useful work? |
Slop Cop supports four modes, but the report-card ticket is always included:

A score below 35 normally needs revision. The score is an editorial aid, not an authorship detector or a substitute for judgment.
- **Audit:** emphasize findings, quoted evidence, severity, and fixes
- **Grade:** emphasize the score and penalty arithmetic
- **Rewrite:** the smallest useful revision, followed by a self-audit
- **Ticket:** emphasize the funny, evidence-backed citation

Scoring starts at 100 and uses fixed deductions:

| Violation | Deduction |
|---|---:|
| Blocker | −30 |
| Major | −15 |
| Minor | −5 |
| Note | −1 |

Each violation is counted once at its highest severity. The report always shows
the arithmetic, so identical findings produce the same score.

| Grade | Score | Grade | Score |
|---|---:|---|---:|
| A+ | 97–100 | C | 73–76 |
| A | 93–96 | C- | 70–72 |
| A- | 90–92 | D+ | 67–69 |
| B+ | 87–89 | D | 63–66 |
| B | 83–86 | D- | 60–62 |
| B- | 80–82 | F | 0–59 |
| C+ | 77–79 | | |

The scale runs from **0 = total slop** to **100 = damn, you're not a
robot?** Scores below C+ draw from 30 fixed bad-grade slogans; C+ and above
draw from 30 fixed good-grade slogans. Selection is rules-based, not random,
and Slop Cop never invents a new slogan. The joke is not an authorship claim:
the score measures observable quality problems only.

Recommended next steps are fixed by score band:

- 97–100: ship
- 90–96: tweak optional notes
- 80–89: tweak minor violations
- 77–79: revise the highest-impact violation
- 70–76: revise material violations
- 60–69: rewrite affected sections
- 0–59: start over from the strongest factual core

<!-- slop-cop-brand:outcomes:start -->
<p align="center">
Expand Down Expand Up @@ -176,15 +214,19 @@ slop-cop/
│ └── openai.yaml
├── assets/
│ └── brand/
── references/
── references/
├── calibration-anchors.md
├── code.md
├── design.md
├── prose-examples.md
├── prose-phrases.md
├── prose-structures.md
├── report-template.md
└── research-sources.md
├── research-sources.md
├── ticket-slogans.json
└── tickets.md
└── scripts/
└── score_ticket.py
```

## Development
Expand Down
12 changes: 6 additions & 6 deletions benchmark/cases.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ cases:
opportunity is not to move faster. It is to build a robust foundation
that actually scales. That is the point.
expected_verdict: REVISE
expected_score_range: [10, 24]
expected_score_range: [40, 76]
must_find:
- vague quantifier
- repeated antithesis
Expand All @@ -24,7 +24,7 @@ cases:
plain English instead of suspicious shell commands, which is why I kept
the manual review step.
expected_verdict: PASS
expected_score_range: [40, 49]
expected_score_range: [90, 100]
must_preserve:
- all numbers
- Sunday
Expand All @@ -37,7 +37,7 @@ cases:
to private enterprise code. A larger replication would narrow that
uncertainty.
expected_verdict: PASS
expected_score_range: [38, 48]
expected_score_range: [90, 100]
must_not_find:
- empty hedging
must_preserve:
Expand All @@ -50,7 +50,7 @@ cases:
are doing security wrong.” I removed it because it made an unsupported
claim before presenting the scan results.
expected_verdict: PASS
expected_score_range: [38, 48]
expected_score_range: [90, 100]
must_preserve:
- quoted text

Expand All @@ -61,7 +61,7 @@ cases:
streamlines the busywork, and turns evolving priorities into actionable
next steps. I'm curious how far this pivotal shift can go.
expected_verdict: REVISE
expected_score_range: [12, 26]
expected_score_range: [40, 76]
must_find:
- marketing verbs
- empty tic words
Expand All @@ -74,7 +74,7 @@ cases:
team struck a delicate balance, applying surgical precision to every
detail so the whole thing feels effortless.
expected_verdict: REVISE
expected_score_range: [12, 26]
expected_score_range: [40, 76]
must_find:
- inflated symbolism
- false-precision adjective
Expand Down
40 changes: 40 additions & 0 deletions scripts/test_ticket_score.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/usr/bin/env python3
from __future__ import annotations

import importlib.util
from pathlib import Path
import sys


ROOT = Path(__file__).resolve().parents[1]
sys.dont_write_bytecode = True
MODULE_PATH = ROOT / "skills" / "slop-cop" / "scripts" / "score_ticket.py"
SPEC = importlib.util.spec_from_file_location("score_ticket", MODULE_PATH)
assert SPEC and SPEC.loader
score_ticket = importlib.util.module_from_spec(SPEC)
SPEC.loader.exec_module(score_ticket)

assert score_ticket.score(0, 0, 0, 0) == 100
assert score_ticket.score(4, 0, 0, 0) == 0
assert score_ticket.score(0, 1, 2, 0) == 75

expected_boundaries = {
100: "A+", 97: "A+", 96: "A", 93: "A", 92: "A-", 90: "A-",
89: "B+", 87: "B+", 86: "B", 83: "B", 82: "B-", 80: "B-",
79: "C+", 77: "C+", 76: "C", 73: "C", 72: "C-", 70: "C-",
69: "D+", 67: "D+", 66: "D", 63: "D", 62: "D-", 60: "D-",
59: "F", 0: "F",
}
for value, expected in expected_boundaries.items():
assert score_ticket.letter_grade(value) == expected

slogans = score_ticket.load_slogans()
assert len(slogans["bad"]) == 30
assert len(slogans["good"]) == 30
assert len(set(slogans["bad"])) == 30
assert len(set(slogans["good"])) == 30
assert score_ticket.slogan(75, 0, 1, 2, 0) == score_ticket.slogan(75, 0, 1, 2, 0)
assert score_ticket.slogan(76, 0, 0, 0, 24) in slogans["bad"]
assert score_ticket.slogan(77, 0, 1, 1, 3) in slogans["good"]

print("Deterministic ticket scoring, grades, and 60 fixed slogans validated.")
58 changes: 31 additions & 27 deletions skills/slop-cop/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
---
name: slop-cop
description: >-
Audit, grade, and rewrite generic AI-slop patterns in prose, social posts,
UI/design, and code. Use when asked to de-slop writing, humanize AI copy,
grade a draft, review a landing page or generated interface, remove vague
claims and repetitive rhetoric, or inspect AI-written code for generic
abstractions and happy-path-only logic. Do not use to determine whether AI
Audit, grade, rewrite, and issue funny evidence-backed tickets for generic
AI-slop patterns in prose, social posts, UI/design, and code. Use when asked
to de-slop writing, humanize AI copy, grade a draft, review a landing page or
generated interface, remove vague claims and repetitive rhetoric, inspect
AI-written code for generic abstractions and happy-path-only logic, or ticket
someone for a specific quality offense. Do not use to determine whether AI
authored something.
license: MIT
compatibility: Works in Agent Skills-compatible environments that support Markdown references.
metadata:
author: howshannon
version: "0.3.0"
version: "0.4.0"
---

# Slop Cop
Expand Down Expand Up @@ -41,9 +41,15 @@ proof of AI authorship.
## Choose a mode

- **Audit:** list findings, evidence, severity, and fixes without rewriting.
- **Grade:** score the requested beat and explain the score.
- **Grade:** emphasize the score and its arithmetic.
- **Rewrite:** make the smallest changes that remove the problems; then audit
the rewrite before returning it.
- **Ticket:** emphasize one funny, shareable citation.

Every mode, including a bare “slop cop this,” ends with the same scored
report-card ticket. Read [report-card tickets](references/tickets.md) and use
`scripts/score_ticket.py`; never improvise the score, grade, slogan, or next
step.

Route only to the references needed:

Expand All @@ -55,6 +61,7 @@ Route only to the references needed:
- Scoring → [calibration anchors](references/calibration-anchors.md) and
[report template](references/report-template.md).
- Evidence claims → [research sources](references/research-sources.md).
- Funny citations → [ticket mode](references/tickets.md).

## The two laws

Expand Down Expand Up @@ -136,29 +143,26 @@ before deciding severity.
facts rather than inventing them.
6. Re-run the tally and verify facts, quotations, links, numbers, and tone.

## Grading prose

Score five dimensions from 1–10, total 50. A score below 35 normally needs
revision.
## Scoring every review

| Dimension | Question |
|---|---|
| Directness | Does it state the point without empty setup or stacked hedging? |
| Specificity | Are material claims concrete and supportable? |
| Rhythm | Are sentence and paragraph shapes varied for a reason? |
| Voice | Does it preserve a consistent, identifiable human voice? |
| Density | Is every remaining sentence doing useful work? |
Start at 100. Deduct 30 per blocker, 15 per major, 5 per minor, and 1 per note,
then clamp at zero. Count each observable violation once at its highest
applicable severity. Show the violation counts and full arithmetic so the same
findings always produce the same score.

Apply caps only when the tally supports them:
Map the result to the fixed A+ through F bands in
[report-card tickets](references/tickets.md). Scores under C+ use one of the 30
fixed bad-grade slogans; C+ and above use one of the 30 fixed good-grade
slogans. Select it with the documented formula—never generate a new one.

- One device used 3+ times: Rhythm may not exceed 5.
- One device used 5+ times, or two device classes used 3+ times: Rhythm and
Voice may not exceed 4.
- Fabricated attribution, quote, statistic, or experience: overall result is a
blocker regardless of total.
The displayed scale is `0 = total slop · 100 = damn, you're not a robot?`.
This is humorous editorial shorthand only. The result measures observable
quality problems and must never be presented as authorship detection.

Report the tally, quoted evidence, biggest issue, confidence, score, and the
single highest-leverage change. Use the report template.
Always report the score, letter grade, charge, evidence, penalty arithmetic,
fixed citation, recommended next step, and smallest useful fix. Use the
[report template](references/report-template.md). A clean review still gets a
100/A+ report card with “No citation-worthy violations found.”

## Design and code

Expand Down
8 changes: 4 additions & 4 deletions skills/slop-cop/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
interface:
display_name: "Slop Cop"
short_description: "Audit and fix generic AI-slop patterns."
short_description: "Score, fix, and ticket generic slop."
icon_small: "./assets/brand/slop-cop-emblem.png"
icon_large: "./assets/brand/slop-cop-emblem.png"
brand_color: "#FF2E88"
brand_color: "#FFAE4D"
default_prompt: >-
Run Slop Cop on this material. Return the verdict, score or severity,
evidence tally, biggest offense, highest-impact fix, and revised version.
Use $slop-cop to return a deterministic 0–100 report-card ticket, evidence,
and the recommended next step for this material.

policy:
allow_implicit_invocation: true
Loading