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.
Jak unslop wykrywa ślady AI
Dział zatytułowany „Jak unslop wykrywa ślady AI”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”.
-
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 maseverityrównehardalbosoft. -
Warstwa struktury (
scripts/structure_scan.py). 36 wzorców strukturalnych plus metryki całego dokumentu, np.sentence_burstiness,triad_density,connective_paragraph_openersiconclusion_coda. Ta warstwa łapie rytm: jednakową długość zdań, serie krótkich linijek i akapity zaczynające się od „However,”.--genre docsdopuszcza listy z pogrubionymi etykietami, typowe dla dokumentacji referencyjnej. -
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.
| Komenda | Co robi |
|---|---|
cleanup | Sugestie do przejrzenia z zakresem, wagą i uzasadnieniem. Wariant tylko do raportu („flag it, change nothing”) niczego nie edytuje. |
rewrite | Diagnozuje szkic, przebudowuje go z zachowaniem zabezpieczeń i sprawdza wynik. |
teach | Buduje profil głosu z próbek twoich tekstów. |
mimic | Pisze 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ą.
Uruchamianie skanerów bez agenta
Dział zatytułowany „Uruchamianie skanerów bez agenta”Skrypty wymagają Pythona 3.8 lub nowszego i żadnych pakietów zewnętrznych. Sklonuj repozytorium raz, a potem uruchamiaj skanery w terminalu:
git clone https://github.com/theclaymethod/unslop.git ~/dev/unslopcd ~/dev/unsloppython3 scripts/banned_phrase_scan.py ~/work/docs/launch-post.mdpython3 scripts/structure_scan.py --genre docs ~/work/docs/launch-post.mdpython3 scripts/silhouette_scan.py --genre docs ~/work/docs/launch-post.mdpython3 scripts/validate_preservation.py original.md rewritten.mdNa 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.
Instalacja unslopa w Claude Code, Codeksie i Cursorze
Dział zatytułowany „Instalacja unslopa w Claude Code, Codeksie i Cursorze”Unslop trzyma się otwartego standardu Agent Skills, więc CLI skills instaluje go we wszystkich trzech agentach. Polecenia różnią się tylko celem -a.
npx skills add theclaymethod/unslop -g -a claude-codePolecenie 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.
npx skills add theclaymethod/unslop -g -a codexZ -g CLI skills 1.7.0 zapisuje do ~/.codex/skills/, bez niego do .agents/skills/ w projekcie. Wywołaj skill przez $unslop albo opisz zadanie, a Codex dobierze go po opisie.
npx skills add theclaymethod/unslop -g -a cursorZ -g CLI zapisuje do ~/.cursor/skills/, instalacja w projekcie trafia do .agents/skills/. Opisz zadanie („audit this draft for AI tells, change nothing”), a opis skilla go uruchomi.
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.
-
Skan w trybie audytu. Uruchom na szkicu powyższy prompt audytowy. Twarde trafienia fraz to jedyne znaleziska, które poprawiasz bez dyskusji.
-
Selekcja miękkich flag. Flagi struktury i sylwetki są doradcze. Na starannie zredagowanej stronie z tego serwisu
structure_scan.py --genre docszgłosił jedną miękką flagęconclusion_coda, asilhouette_scan.pydwie 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. -
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.3Mna$47.3 billiondała"passed": falsei kod wyjścia 1. Dla tekstów prawnych, medycznych i o bezpieczeństwie uruchompython3 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. -
Bramka przed scaleniem. W CI blokuj tylko twarde (
hard) trafienia fraz w zmienionych plikach, a wyniki pozostałych skanerów publikuj dla recenzenta. -
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:
name: prose-linton: pull_request: paths: ["docs/**/*.md", "docs/**/*.mdx"]permissions: contents: readjobs: 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) PYPrefiks :(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.
Czego dowodzi własna ewaluacja unslopa
Dział zatytułowany „Czego dowodzi własna ewaluacja unslopa”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.
Miodkuj do tekstów po polsku
Dział zatytułowany „Miodkuj do tekstów po polsku”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:
| Wzorzec | Przed | Po |
|---|---|---|
| Urzędowość | w dniu dzisiejszym | dzisiaj |
| Urzędowość | dokonać zakupu | kupić |
| Urzędowość | posiadać możliwość | może |
| Nominalizacja | przeprowadzenie analizy danych | przeanalizowano dane |
| Bezosobowa mgła | należy złożyć wniosek | złóż wniosek |
| Łańcuch dopełniaczy | w przypadku braku możliwości uruchomienia pojazdu | jeś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-pluginsWywoł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:
miodkuj_tmp="$(mktemp -d)"git clone --depth 1 https://github.com/bartekpucek/miodkuj.git "$miodkuj_tmp"mkdir -p ~/.claude/skillscp -R "$miodkuj_tmp/plugins/miodkuj/skills/miodkuj" ~/.claude/skills/miodkujrm -rf "$miodkuj_tmp"codex plugin marketplace add bartekpucek/miodkujcodex plugin add miodkuj@miodkujRozpocznij nowe zadanie i wywołaj skill przez $miodkuj. Codex wybiera go też sam, gdy prośba pasuje do dwujęzycznego opisu.
Miodkuj nie ma gotowej instalacji dla Cursora. Skill to standardowy folder z SKILL.md, więc skopiuj go do katalogu .agents/skills/ w projekcie:
miodkuj_tmp="$(mktemp -d)"git clone --depth 1 https://github.com/bartekpucek/miodkuj.git "$miodkuj_tmp"mkdir -p .agents/skillscp -R "$miodkuj_tmp/plugins/miodkuj/skills/miodkuj" .agents/skills/miodkujrm -rf "$miodkuj_tmp"Ten prompt jest po polsku, bo wyzwalacze i nazwy ocen w miodkuju są polskie.
Który skill anty-slop wybrać?
Dział zatytułowany „Który skill anty-slop wybrać?”Gwiazdki mierzą uwagę, nie jakość. Wszystkie liczby poniżej pochodzą z API GitHuba, odczyt z 30 września 2026.
| Skill | Gwiazdki | Czym jest | Wybierz, gdy |
|---|---|---|---|
blader/humanizer | 53 072 | Jeden 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-slop | 17 669 | Mały plik skilla usuwający ślady AI z tekstu. | Chcesz krótkiego zestawu reguł do przerobienia na własny skill stylu. |
petergyang/no-ai-slop | 11 579 | Skill usuwający ponad 20 wzorców slopu. | Szukasz angielskiego odpowiednika podejścia miodkuja, który zaczyna od edycji. |
theclaymethod/unslop | 493 | Skill, 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/miodkuj | 195 | Jeden 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.
Kiedy skille anty-slop psują tekst
Dział zatytułowany „Kiedy skille anty-slop psują tekst”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.