Przejdź do głównej zawartości

Skille anty-slop: unslop, miodkuj i co mówią ewaluacje

Unslop (theclaymethod/unslop) to Agent Skill, który wykrywa i usuwa wzorce sprawiające, że tekst brzmi maszynowo. Opiera się na trzech skanerach w Pythonie bez zależności zewnętrznych, działających też w CI bez agenta. Własny benchmark nie wykazał jeszcze przewagi nad zwykłą redakcją (wynik no-ship, czyli „nie wydawać”). Polszczyznę obsługuje bartekpucek/miodkuj: urzędowy styl i kalki, których angielskie katalogi nie znają.

Ta strona jest dla programistów i liderów technicznych, którzy publikują dokumentację, release notes albo README pisane z Claude Code, Codeksem lub Cursorem. Sytuacja: recenzent pisze w pull requeście „to brzmi jak ChatGPT” i nikt nie umie wskazać zdania, które to powoduje. Prośba „napisz to naturalniej” nie działa, bo model, który przepisuje tekst, ma te same domyślne odruchy co model, który go napisał.

Co skill anty-slop daje twojemu procesowi dokumentacji

Dział zatytułowany „Co skill anty-slop daje twojemu procesowi dokumentacji”
  • Nazwane znalezisko zamiast mglistej uwagi: „negatywny paralelizm w linii 12, fałszywa sprawczość w linii 30” zamiast „coś tu nie gra”.
  • Twardą bramkę w CI bez agenta: skaner fraz unslopa kończy się kodem różnym od zera przy trafieniu i zwraca JSON z numerami linii.
  • Tryb samego audytu, który raportuje i niczego nie zmienia. Tego trybu używaj, dopóki nie zaufasz regułom.
  • Kontrolę zachowania treści, która oblewa przeróbkę gubiącą liczbę, nazwę albo zastrzeżenie. Dzięki niej weryfikujesz przeróbkę bez czytania jej linia po linii.
  • Dla tekstów polskich: reguły zbudowane pod polską nowomowę urzędową, a nie przetłumaczoną angielską listę słów.

Unslop dzieli pracę na dwie części. Detekcja jest deterministyczna i działa w Pythonie. Naprawa i głos są generatywne i działają w agencie, pod bramkami, których pilnują skanery. README stawia granicę produktu wprost: „Scanners suggest candidates; the agent checks each use in context”.

  1. Warstwa fraz (scripts/banned_phrase_scan.py). Kompaktowy pakiet uruchomieniowy ma 16 dosłownych wyzwalaczy, każdy z ochroną przed fałszywymi alarmami zależną od kontekstu. Cytaty, bloki cytatu i bloki kodu są najpierw maskowane, więc poradnik cytujący zły tekst nie oznacza własnych przykładów. Każde trafienie ma severity równe hard albo soft.

  2. Warstwa struktury (scripts/structure_scan.py). 36 wzorców strukturalnych plus metryki całego dokumentu, np. sentence_burstiness, triad_density, connective_paragraph_openers i conclusion_coda. Ta warstwa łapie rytm: jednakową długość zdań, serie krótkich linijek i akapity zaczynające się od „However,”. --genre docs dopuszcza listy z pogrubionymi etykietami, typowe dla dokumentacji referencyjnej.

  3. Warstwa sylwetki (scripts/silhouette_scan.py). Ocenia układ myśli: zapowiedzi, które treść potem odhacza punkt po punkcie, nagłówki powtarzające konspekt ze wstępu (heading_preview) i słownictwo z otwarcia, które wraca na końcu jako podsumowanie (callback_content, według README najmocniejszy pojedynczy sygnał). Na korpusie z repozytorium oznacza 12 z 12 dokumentów AI i 0 z 8 ludzkich. README zaznacza też, że usunięcie wskaźników dyskursu rozbraja metrykę rusztowania, więc sylwetkę traktuj jako jeden sygnał obok skanera struktury.

Po stronie agenta są cztery komendy. Samo /unslop <tekst> domyślnie oznacza rewrite.

KomendaCo robi
cleanupSugestie do przejrzenia z zakresem, wagą i uzasadnieniem. Wariant tylko do raportu („flag it, change nothing”) niczego nie edytuje.
rewriteDiagnozuje szkic, przebudowuje go z zachowaniem zabezpieczeń i sprawdza wynik.
teachBuduje profil głosu z próbek twoich tekstów.
mimicPisze nauczonym głosem, a potem przechodzi pełny zestaw bramek.

cleanup wymusza cztery bramki, dzięki którym przycisk „zaakceptuj wszystko” jest bezpieczny: każda poprawka zmienia tylko swój fragment, każdy zamiennik osobno przechodzi skanery, zastosowanie wszystkich sugestii nadal zachowuje wszystkie ograniczenia, a żadne dwie sugestie się nie nakładają.

Skrypty wymagają Pythona 3.8 lub nowszego i żadnych pakietów zewnętrznych. Sklonuj repozytorium raz, a potem uruchamiaj skanery w terminalu:

Okno terminala
git clone https://github.com/theclaymethod/unslop.git ~/dev/unslop
cd ~/dev/unslop
python3 scripts/banned_phrase_scan.py ~/work/docs/launch-post.md
python3 scripts/structure_scan.py --genre docs ~/work/docs/launch-post.md
python3 scripts/silhouette_scan.py --genre docs ~/work/docs/launch-post.md
python3 scripts/validate_preservation.py original.md rewritten.md

Na czterolinijkowym szkicu testowym skaner fraz zwrócił takie podsumowanie i zakończył się kodem 1:

{
"total_violations": 4,
"by_severity": { "hard": 4, "soft": 0 },
"by_category": {
"throat_clearing": 1,
"negative_parallelism": 1,
"false_agency": 1,
"copula_avoidance": 1
}
}

Ten sam test pokazuje granicę listy fraz: „Let that sink in.” figuruje w katalogu opisanym w README, ale w kompaktowym pakiecie się nie odpaliło. Skaner znajduje kandydatów. Nie wystawia certyfikatu czystego tekstu.

Unslop trzyma się otwartego standardu Agent Skills, więc CLI skills instaluje go we wszystkich trzech agentach. Polecenia różnią się tylko celem -a.

Okno terminala
npx skills add theclaymethod/unslop -g -a claude-code

Polecenie zapisuje ~/.claude/skills/unslop/. Skill ustawia user-invocable: true, więc pojawia się jako /unslop, z /unslop cleanup, /unslop rewrite, /unslop teach i /unslop mimic.

Koszt kontekstu. Dopóki skill się nie uruchomi, w kontekście siedzą tylko jego name i description. Treść SKILL.md ma około 6,8 KB. Katalog fraz references/taboo-phrases.md (50 KB) i katalog evals/ (2,7 MB) ładują się dopiero wtedy, gdy krok po nie sięga, a skrypty skanerów wnoszą do kontekstu swój wynik w JSON, nie kod źródłowy. Rzeczywisty koszt w swojej sesji sprawdzisz poleceniem /context w Claude Code przed pierwszym /unslop cleanup i po nim.

Prompt zostaje po angielsku, bo unslop obsługuje tylko tekst angielski, a nazwy trybów i kategorii są angielskie.

Jak blokować ślady AI w CI i weryfikować przeróbki

Dział zatytułowany „Jak blokować ślady AI w CI i weryfikować przeróbki”

Działający proces to skan, selekcja, naprawa, dowód, bramka. Nikt nie czyta całego dokumentu od nowa: dowód niosą skanery i kontrola zachowania treści, a autor zatwierdza tylko listę znalezisk.

  1. Skan w trybie audytu. Uruchom na szkicu powyższy prompt audytowy. Twarde trafienia fraz to jedyne znaleziska, które poprawiasz bez dyskusji.

  2. Selekcja miękkich flag. Flagi struktury i sylwetki są doradcze. Na starannie zredagowanej stronie z tego serwisu structure_scan.py --genre docs zgłosił jedną miękką flagę conclusion_coda, a silhouette_scan.py dwie miękkie flagi, i oba skrypty i tak zakończyły się kodem 1. Dlatego te dwa skanery należą do raportu, a nie do blokującej kontroli.

  3. Naprawa z kontraktem zachowania treści. Poproś o przeróbkę tylko oznaczonych fragmentów, a potem uruchom validate_preservation.py. Skrypt porównuje ograniczenia oryginału i przeróbki. W teście zamiana $47.3M na $47.3 billion dała "passed": false i kod wyjścia 1. Dla tekstów prawnych, medycznych i o bezpieczeństwie uruchom python3 scripts/validate_preservation.py --strict original.md rewritten.md; flaga musi stać przed nazwami plików. W trybie ścisłym zgubienie zastrzeżenia typu „does not establish causation” jest twardym błędem.

  4. Bramka przed scaleniem. W CI blokuj tylko twarde (hard) trafienia fraz w zmienionych plikach, a wyniki pozostałych skanerów publikuj dla recenzenta.

  5. Zatwierdzenie. Autor zatwierdza listę znalezisk i wynik kontroli zachowania treści, recenzent czyta diff oznaczonych fragmentów. Żaden z nich nie musi ponownie czytać niezmienionych akapitów.

Ten job GitHub Actions realizuje krok 4. Działa na pull_request z tokenem tylko do odczytu i bez sekretów, traktuje pliki kontrybutora wyłącznie jako dane i przypina skanery do znanego commita:

.github/workflows/prose-lint.yml
name: prose-lint
on:
pull_request:
paths: ["docs/**/*.md", "docs/**/*.mdx"]
permissions:
contents: read
jobs:
unslop:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false
- name: Fetch unslop scanners at a pinned commit
run: |
git clone --quiet https://github.com/theclaymethod/unslop.git "$RUNNER_TEMP/unslop"
git -C "$RUNNER_TEMP/unslop" checkout --quiet 17ed39c9d0b522f44190ff0c6233867eadee192a
- name: Block hard AI tells in changed prose
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
run: |
git diff -z --name-only --diff-filter=AM "$BASE_SHA" HEAD -- ':(glob)docs/**/*.md' ':(glob)docs/**/*.mdx' > changed.txt
python3 - <<'PY'
import json, os, subprocess, sys
scan = os.path.join(os.environ["RUNNER_TEMP"], "unslop/scripts/banned_phrase_scan.py")
failed = False
for path in filter(None, open("changed.txt", encoding="utf-8").read().split("\0")):
out = subprocess.run([sys.executable, scan, path], capture_output=True, text=True).stdout
for v in json.loads(out)["violations"]:
if v["severity"] == "hard":
failed = True
print(f"::error file={path},line={v['line_number']}::{v['category']}: {v['phrase']}")
sys.exit(1 if failed else 0)
PY

Prefiks :(glob) w specyfikacji ścieżki sprawia, że ** pasuje na dowolnej głębokości, także do docs/a.md na najwyższym poziomie, a -z zachowuje ścieżki ze spacjami i polskimi znakami bez zmian. Wbudowany skrypt celowo pomija kod wyjścia skanera i czyta JSON, więc miękkie (soft) trafienie nigdy nie zablokuje scalenia. Aby zaktualizować skanery, zmień przypięty SHA w pull requeście, który ktoś przejrzy.

Unslop prowadzi trzy osobne tablice wyników, żeby maszyneria pomocnicza nie zawyżała wyniku produktu: produkt główny (wykrywanie, naprawa, zachowanie treści, szkody, poprawa netto), głos (wierność teach i mimic) oraz inżynieria (pokrycie skanerów, schematy, routing, regresje). README wyjaśnia dlaczego: „The engineering suite can show that the implementation behaves as specified. Only the core scoreboard can show that the specification improves writing”.

Główne porównanie jest parowane. Ten sam model gpt-5.6-luna dostaje ten sam nieznany tekst w obu ramionach: jedno uruchamia pipeline unslopa, drugie dostaje neutralne wskazówki redakcyjne. Wyniki porównuje zaślepiony sędzia gpt-5.6-sol. (Oba to starsze modele OpenAI z rodziny GPT-5.6; aktualne znajdziesz w przeglądzie modeli.)

Ostatni ważny publiczny wynik to no-ship: unslop „materially improved recall and repair over plain Luna”, ale nie spełnił progu precyzji, szkód i bezpieczeństwa całego dokumentu. Późniejsze przebiegi rozwojowe dały siedem wygranych, cztery remisy i żadnej wygranej samej Luny, ale poprzedzają poprawki punktacji, a świeży, wcześniej zarejestrowany korpus nie przeszedł progu składu, zanim którekolwiek ramię ruszyło. Wniosek projektu: obecna beta „does not claim a validated comparative lift”.

Ten wynik wyznacza poprzeczkę dla całej kategorii. Najpopularniejszy skill w tej kategorii, blader/humanizer, miał 30 września 2026 roku 53 072 gwiazdki i nie ma w repozytorium pakietu ewaluacji. Jego README (v3.1.0, 27 września 2026) przytacza jeden ślepy test ze zgłoszenia #229: oceniający wybrali przeróbkę zamiast surowego tekstu AI 16 razy na 16. To jedno małe porównanie z nieredagowanym tekstem AI, a nie z neutralną redakcją. Żaden z tych projektów nie pokazał w kontrolowanym porównaniu, takim jak u unslopa, że automatyczne usuwanie slopu wypada lepiej niż zwykła redakcja. Używaj tych narzędzi do znajdowania kandydatów, a pewność niech daje kontrola zachowania treści, nie sama przeróbka.

Unslop zatrzymuje się na tekście nieangielskim: skanery zwracają non_english: true. Tę lukę wypełnia miodkuj (MIT). Jego podsumowanie badań opisuje założenie wprost: miodkuj „nie tłumaczy angielskich list zakazanych słów”, tylko dostosowuje wzorce anty-slop do polszczyzny. Nazwa to hołd dla profesora Jana Miodka; README zaznacza, że profesor nie uczestniczy w projekcie ani go nie popiera.

Część rodzin pokrywa się z angielskimi katalogami: pozostałości czatbota, puste wstępy i napompowane przymiotniki. Cenniejsza połowa pochodzi z polskiej nowomowy urzędowej, której żadna angielska lista nie zna. Poniższe pary pochodzą z plików plain-polish.md i polish-patterns.md:

WzorzecPrzedPo
Urzędowośćw dniu dzisiejszymdzisiaj
Urzędowośćdokonać zakupukupić
Urzędowośćposiadać możliwośćmoże
Nominalizacjaprzeprowadzenie analizy danychprzeanalizowano dane
Bezosobowa mgłanależy złożyć wniosekzłóż wniosek
Łańcuch dopełniaczyw przypadku braku możliwości uruchomienia pojazdujeśli nie możesz uruchomić pojazdu

Większość pracy wykonują trzy reguły z SKILL.md:

  • Minimalna skuteczna poprawka. Jeśli tekst już przechodzi bramkę jakości, miodkuj zwraca go bez zmian i nie podmienia poprawnych sformułowań tylko po to, żeby pokazać edycję.
  • Drabina konkretu. Ogólnik uziemiasz faktem, który już jest w źródle, łączysz to, co jest, albo zmniejszasz twierdzenie. Nigdy nie dopisujesz liczby, przykładu ani źródła: „A plausible inference is still new information”.
  • Test przenośności. „If a sentence could move unchanged to another company, ministry, product, project, or person, it is probably filler”. Test nie dotyczy definicji, formuł prawnych ani standardowych ostrzeżeń.

Miodkuj celowo nie ma lintera ani skanera tekstu (skrypty w scripts/ tylko walidują pakiet). Podsumowanie badań argumentuje, że sama lista dopasowań nie rozstrzyga kontekstu i nie chroni głosu autora. Nie nada się więc na bramkę w CI. Ma za to ograniczony test behawioralny wersji v2.1.1 (14 września 2026): subagent Codeksa na gpt-5.6-sol przeszedł 13 przypadków, 12 zaliczył, jeden częściowo oblał, a poprzednie wydanie oblało trzy z 12 wspólnych przypadków. Raport sam wskazuje swoją granicę: przy jednej próbce na przypadek testy „establish no general reliability rate or cross-model improvement”.

W sesji Claude Code:

/plugin marketplace add bartekpucek/miodkuj
/plugin install miodkuj@miodkuj
/reload-plugins

Wywołujesz go jako /miodkuj:miodkuj, bo Claude Code poprzedza skille z wtyczek nazwą wtyczki. Co wtyczka dokłada do kontekstu, sprawdzisz w terminalu poleceniem claude plugin details miodkuj@miodkuj. Jeśli chcesz krótkiego /miodkuj, skopiuj folder skilla ręcznie:

Okno terminala
miodkuj_tmp="$(mktemp -d)"
git clone --depth 1 https://github.com/bartekpucek/miodkuj.git "$miodkuj_tmp"
mkdir -p ~/.claude/skills
cp -R "$miodkuj_tmp/plugins/miodkuj/skills/miodkuj" ~/.claude/skills/miodkuj
rm -rf "$miodkuj_tmp"

Ten prompt jest po polsku, bo wyzwalacze i nazwy ocen w miodkuju są polskie.

Gwiazdki mierzą uwagę, nie jakość. Wszystkie liczby poniżej pochodzą z API GitHuba, odczyt z 30 września 2026.

SkillGwiazdkiCzym jestWybierz, gdy
blader/humanizer53 072Jeden skill z 25 wzorcami (v3.0.0; v3.1.0 dodaje 26. wzorzec i manifest pluginu dla Cursora) opartymi na wikipedyjnym Signs of AI writing. Bez skanera; bez pakietu ewaluacji (README przytacza jeden ślepy test 16/16). SKILL.md ma około 32 KB i ładuje się w całości przy uruchomieniu.Chcesz przeróbki jednym poleceniem i sam przejrzysz diff.
hardikpandya/stop-slop17 669Mały plik skilla usuwający ślady AI z tekstu.Chcesz krótkiego zestawu reguł do przerobienia na własny skill stylu.
petergyang/no-ai-slop11 579Skill usuwający ponad 20 wzorców slopu.Szukasz angielskiego odpowiednika podejścia miodkuja, który zaczyna od edycji.
theclaymethod/unslop493Skill, skanery w Pythonie bez zależności i pakiet ewaluacji z trzema tablicami wyników.Potrzebujesz bramki w CI i mierzalnej kontroli zachowania treści.
bartekpucek/miodkuj195Jeden skill, manifesty wtyczek dla Claude Code i Codeksa, bez skanera.Tekst jest po polsku, zwłaszcza urzędowy, prawny albo naukowy.

Humanizer instalujesz przez npx skills add blader/humanizer --global --agent claude-code (albo --agent codex) lub jako wtyczkę Claude Code poleceniami /plugin marketplace add blader/humanizer i /plugin install humanizer@humanizer w Claude Code 2.1.142 lub nowszym. Skill z wtyczki odpowiada na /humanizer:humanizer.

Do przeglądu tekstu pod kątem przewodnika stylu, a nie polowania na ślady AI, służą skill writing-guidelines od Vercela i doc-coauthoring od Anthropic, opisane na stronie o skillach do dokumentów i pisania. Oficjalne repozytorium anthropics/skills (19 skilli na main, sprawdzone 30 września 2026) nie ma osobnego skilla anty-slop do tekstu. Jeśli chcesz lintera bez agenta w pętli, JMill/deslop to pakiet stylu dla Vale, ale jest nowy i nikt go jeszcze szerzej nie używa.

Źródłem dla większości tych katalogów jest wikipedyjne Signs of AI writing. Unslop synchronizuje się z nim poleceniem python3 scripts/wiki_sync.py check, które porównuje katalog z aktualną stroną i proponuje zmiany, zaczynając od wierszy ewaluacji.

Reguła pauzy walczy z twoim stylem. Katalog unslopa mówi „Default to zero em-dashes”. Jeśli twój przewodnik stylu świadomie używa pauz (—), reguła usunie działający element rejestru. Rozwiązanie: miękkie znaleziska z założenia można nadpisać, więc zapisz decyzję we własnym skillu albo w AGENTS.md („pauzy są dozwolone, nie oznaczaj ich”) i przy selekcji traktuj te znaleziska jako zaakceptowane.

Twarde zakazy trafiają w prawdziwe terminy techniczne. load-bearing i wedge to twarde flagi, gdy są metaforą, a wyjątek dotyczy tylko dosłownego użycia w budownictwie i mechanice. „This is a load-bearing assumption” w dokumencie projektowym to właśnie ten metaforyczny sens i zarazem właściwe sformułowanie. Skaner fraz flaguje load-bearing tylko przed rzeczownikiem, takim jak assumption, claim czy decision, więc orzecznikowe „This assumption is load-bearing” przechodzi. Rozwiązanie: zostaw zdanie, zapisz termin jako kod (w backtickach), jeśli to termin branżowy, albo przyjmij udokumentowany wyjątek w review. Nie osłabiaj bramki CI dla jednego słowa.

Przeróbka gubi fakt. Generatywna naprawa potrafi zmienić $47.3M albo usunąć zastrzeżenie. Rozwiązanie: zawsze uruchamiaj validate_preservation.py (z --strict przed nazwami plików dla tekstów regulowanych) i cofaj każdą poprawkę, która go nie przechodzi, tak jak robi to prompt naprawczy powyżej.

Czysty wynik skanu zostaje uznany za dobry tekst. Szkic może przejść wszystkie skanery i nadal być konspektem bez argumentu. Wskazówki Wikipedii ostrzegają przed traktowaniem tych sygnałów jako „the problems to be fixed”, bo to „could just make detection harder”. Rozwiązanie: w review zostaw ludzką ocenę struktury i argumentacji, a skanerom tylko usuwanie mechanicznego szumu.

Polski tekst trafia do skilla tylko dla angielskiego. Unslop odrzuca tekst nieangielski, a wzorce humanizera są angielskie. Rozwiązanie: kieruj pliki polskie do miodkuja, np. po ścieżce (docs/pl/**) w instrukcjach dla agenta.

Projekt zmienia się pod tobą. Unslop przebudował się wokół nowego kontraktu 5 sierpnia 2026, zmienił go znowu 7 września i nie publikuje tagów. Rozwiązanie: przypnij SHA commita w CI, tak jak w workflow powyżej, i przeglądaj zmiany w upstreamie, zanim podbijesz przypięty SHA.