anti-slop-kit 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- anti_slop_kit-0.3.0/LICENSE +21 -0
- anti_slop_kit-0.3.0/PKG-INFO +610 -0
- anti_slop_kit-0.3.0/README.md +573 -0
- anti_slop_kit-0.3.0/anti_slop_kit.egg-info/PKG-INFO +610 -0
- anti_slop_kit-0.3.0/anti_slop_kit.egg-info/SOURCES.txt +64 -0
- anti_slop_kit-0.3.0/anti_slop_kit.egg-info/dependency_links.txt +1 -0
- anti_slop_kit-0.3.0/anti_slop_kit.egg-info/entry_points.txt +3 -0
- anti_slop_kit-0.3.0/anti_slop_kit.egg-info/requires.txt +13 -0
- anti_slop_kit-0.3.0/anti_slop_kit.egg-info/top_level.txt +1 -0
- anti_slop_kit-0.3.0/pyproject.toml +114 -0
- anti_slop_kit-0.3.0/setup.cfg +4 -0
- anti_slop_kit-0.3.0/tests/test_benchmarks.py +64 -0
- anti_slop_kit-0.3.0/tests/test_cli.py +278 -0
- anti_slop_kit-0.3.0/tests/test_code_comments.py +65 -0
- anti_slop_kit-0.3.0/tests/test_common.py +426 -0
- anti_slop_kit-0.3.0/tests/test_custom_rules.py +622 -0
- anti_slop_kit-0.3.0/tests/test_de_ste_lint.py +268 -0
- anti_slop_kit-0.3.0/tests/test_detection_benchmark.py +491 -0
- anti_slop_kit-0.3.0/tests/test_documented_numbers.py +363 -0
- anti_slop_kit-0.3.0/tests/test_en_excess_vocab.py +224 -0
- anti_slop_kit-0.3.0/tests/test_es_ste_lint.py +299 -0
- anti_slop_kit-0.3.0/tests/test_evals.py +292 -0
- anti_slop_kit-0.3.0/tests/test_evals_run.py +149 -0
- anti_slop_kit-0.3.0/tests/test_examples.py +132 -0
- anti_slop_kit-0.3.0/tests/test_explain.py +200 -0
- anti_slop_kit-0.3.0/tests/test_fetch_mage_corpus.py +80 -0
- anti_slop_kit-0.3.0/tests/test_fr_ste_lint.py +178 -0
- anti_slop_kit-0.3.0/tests/test_gost_reference.py +67 -0
- anti_slop_kit-0.3.0/tests/test_hermes_tools.py +180 -0
- anti_slop_kit-0.3.0/tests/test_integration_workflows.py +158 -0
- anti_slop_kit-0.3.0/tests/test_json_findings.py +162 -0
- anti_slop_kit-0.3.0/tests/test_lint_tool.py +539 -0
- anti_slop_kit-0.3.0/tests/test_linters.py +701 -0
- anti_slop_kit-0.3.0/tests/test_markdown_structure.py +98 -0
- anti_slop_kit-0.3.0/tests/test_max_gate.py +194 -0
- anti_slop_kit-0.3.0/tests/test_mirror_close.py +112 -0
- anti_slop_kit-0.3.0/tests/test_model_signatures.py +164 -0
- anti_slop_kit-0.3.0/tests/test_only_component.py +189 -0
- anti_slop_kit-0.3.0/tests/test_performance.py +346 -0
- anti_slop_kit-0.3.0/tests/test_prose_signals.py +307 -0
- anti_slop_kit-0.3.0/tests/test_repo_integrity.py +199 -0
- anti_slop_kit-0.3.0/tests/test_rewrite_tool.py +317 -0
- anti_slop_kit-0.3.0/tests/test_ru_code_comments.py +65 -0
- anti_slop_kit-0.3.0/tests/test_ru_markdown_structure.py +102 -0
- anti_slop_kit-0.3.0/tests/test_rulepack_version.py +136 -0
- anti_slop_kit-0.3.0/tests/test_run_records.py +217 -0
- anti_slop_kit-0.3.0/tests/test_sarif.py +207 -0
- anti_slop_kit-0.3.0/tests/test_shadow_safe_import.py +155 -0
- anti_slop_kit-0.3.0/tests/test_statistical_analysis.py +176 -0
- anti_slop_kit-0.3.0/tests/test_stdin_flags.py +46 -0
- anti_slop_kit-0.3.0/tests/test_transmit_check.py +372 -0
- anti_slop_kit-0.3.0/tests/test_unit_core.py +162 -0
- anti_slop_kit-0.3.0/tests/test_visualization.py +148 -0
- anti_slop_kit-0.3.0/tools/__init__.py +1 -0
- anti_slop_kit-0.3.0/tools/aslint/__init__.py +1 -0
- anti_slop_kit-0.3.0/tools/aslint/cli.py +72 -0
- anti_slop_kit-0.3.0/tools/aslint/common.py +256 -0
- anti_slop_kit-0.3.0/tools/aslint/custom_rules.py +256 -0
- anti_slop_kit-0.3.0/tools/aslint/doc_checks.py +291 -0
- anti_slop_kit-0.3.0/tools/aslint/lint_tool.py +282 -0
- anti_slop_kit-0.3.0/tools/aslint/model_signatures.py +233 -0
- anti_slop_kit-0.3.0/tools/aslint/performance.py +153 -0
- anti_slop_kit-0.3.0/tools/aslint/prose_signals.py +211 -0
- anti_slop_kit-0.3.0/tools/aslint/rewrite_tool.py +92 -0
- anti_slop_kit-0.3.0/tools/aslint/transmit_check.py +107 -0
- anti_slop_kit-0.3.0/tools/hermes_registry.json +49 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Eliza
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: anti-slop-kit
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Detect and prevent slop in AI-generated code and documentation
|
|
5
|
+
Author: Anti-Slop Kit Contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/ameobius-ai/anti-slop-kit
|
|
8
|
+
Project-URL: Repository, https://github.com/ameobius-ai/anti-slop-kit
|
|
9
|
+
Project-URL: Documentation, https://github.com/ameobius-ai/anti-slop-kit#readme
|
|
10
|
+
Project-URL: Issues, https://github.com/ameobius-ai/anti-slop-kit/issues
|
|
11
|
+
Keywords: ai,code-quality,linting,documentation,fidelity
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
21
|
+
Classifier: Topic :: Text Processing :: Linguistic
|
|
22
|
+
Requires-Python: >=3.9
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
28
|
+
Requires-Dist: mypy<2.0.0,>=1.0.0; extra == "dev"
|
|
29
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
31
|
+
Requires-Dist: pre-commit>=3.0.0; extra == "dev"
|
|
32
|
+
Requires-Dist: bandit>=1.7.0; extra == "dev"
|
|
33
|
+
Requires-Dist: pip-audit>=2.6.0; extra == "dev"
|
|
34
|
+
Provides-Extra: hermes
|
|
35
|
+
Requires-Dist: pydantic>=2.0.0; extra == "hermes"
|
|
36
|
+
Dynamic: license-file
|
|
37
|
+
|
|
38
|
+
[](https://github.com/ameobius-ai/anti-slop-kit/actions/workflows/ci.yml)
|
|
39
|
+
[](https://www.python.org/downloads/)
|
|
40
|
+
[](https://opensource.org/licenses/MIT)
|
|
41
|
+
[](https://github.com/psf/black)
|
|
42
|
+
[](https://github.com/ameobius-ai/anti-slop-kit/network/updates)
|
|
43
|
+
|
|
44
|
+
# anti-slop-kit
|
|
45
|
+
|
|
46
|
+
Controlled-language writing skills and deterministic linters that remove AI slop
|
|
47
|
+
from technical prose. Five languages: English (ASD-STE100 mechanics), Russian
|
|
48
|
+
(GOST R 58049-2017, clause 8.2.3), Spanish, German and French.
|
|
49
|
+
|
|
50
|
+
A skill tells the model how to write. A linter proves whether the model did it.
|
|
51
|
+
The linter is the part most anti-slop advice leaves out.
|
|
52
|
+
|
|
53
|
+
## Installation
|
|
54
|
+
|
|
55
|
+
### Prerequisites
|
|
56
|
+
|
|
57
|
+
- Python 3.9 or higher
|
|
58
|
+
- pip (Python package manager)
|
|
59
|
+
|
|
60
|
+
### Quick Install
|
|
61
|
+
|
|
62
|
+
Install via pip:
|
|
63
|
+
|
|
64
|
+
pip install anti-slop-kit
|
|
65
|
+
|
|
66
|
+
### Development Install
|
|
67
|
+
|
|
68
|
+
Clone and install in development mode:
|
|
69
|
+
|
|
70
|
+
git clone https://github.com/ameobius-ai/anti-slop-kit.git
|
|
71
|
+
cd anti-slop-kit
|
|
72
|
+
pip install -e ".[dev]"
|
|
73
|
+
pip install pre-commit
|
|
74
|
+
pre-commit install
|
|
75
|
+
|
|
76
|
+
### Verify Installation
|
|
77
|
+
|
|
78
|
+
Check if package is installed:
|
|
79
|
+
|
|
80
|
+
anti-slop-check --version
|
|
81
|
+
|
|
82
|
+
The command lists every rulepack with its version and calibration date.
|
|
83
|
+
The language linters themselves ship in the source tree, so a
|
|
84
|
+
non-editable `pip install` carries only the `tools` package - install
|
|
85
|
+
editable (`pip install -e .`) to lint with the rulepacks.
|
|
86
|
+
|
|
87
|
+
Or run tests:
|
|
88
|
+
|
|
89
|
+
python -m pytest tests/
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
## Usage
|
|
93
|
+
|
|
94
|
+
See the [documentation](docs/) for detailed usage examples and API reference.
|
|
95
|
+
|
|
96
|
+
### Quick Start
|
|
97
|
+
|
|
98
|
+
1. Install the package
|
|
99
|
+
2. Import the main module
|
|
100
|
+
3. Use the analysis functions
|
|
101
|
+
4. Review the results
|
|
102
|
+
|
|
103
|
+
For more examples, check the [examples directory](examples/) and [API documentation](docs/api.md).
|
|
104
|
+
|
|
105
|
+
### Configuration
|
|
106
|
+
|
|
107
|
+
Create a configuration file to customize behavior. See [configuration guide](docs/configuration.md) for details.
|
|
108
|
+
|
|
109
|
+
### Command Line
|
|
110
|
+
|
|
111
|
+
Use the CLI tool for batch processing and automation. Run `anti-slop --help` for available commands.
|
|
112
|
+
|
|
113
|
+
## Who this is for
|
|
114
|
+
|
|
115
|
+
**Use this for:** API docs, runbooks, release notes, incident reports, onboarding
|
|
116
|
+
docs, support macros, changelogs — any text where a reader must act correctly on
|
|
117
|
+
the first read. Also useful as a gate on LLM-generated documentation.
|
|
118
|
+
|
|
119
|
+
**Do not use this for:** essays, marketing copy where voice is the point, fiction,
|
|
120
|
+
or anything where rhythm and register matter more than being parsed correctly.
|
|
121
|
+
The sentence-length and semicolon rules will fight you, and they should: they come
|
|
122
|
+
from maintenance-manual standards, not from general writing advice.
|
|
123
|
+
|
|
124
|
+
**What the score means:** violations per 100 words. A smoke alarm, not a grade.
|
|
125
|
+
The useful signal is the delta across revisions of the same text. An absolute
|
|
126
|
+
threshold means something only once a team picks one for a document class — the
|
|
127
|
+
CI samples gate at 2, and that is a convention, not a law.
|
|
128
|
+
|
|
129
|
+
## What is in here
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
AGENTS.md instructions for an agent working in this repository
|
|
133
|
+
en/SKILL.md ste-writing skill, English
|
|
134
|
+
en/ste-lint.py English linter, 11 rule groups
|
|
135
|
+
en/samples/ one slop text and one clean rewrite
|
|
136
|
+
ru/SKILL.md utrya-writing skill, Russian
|
|
137
|
+
ru/ru-ste-lint.py Russian linter, 13 rule groups + typography
|
|
138
|
+
ru/samples/ one slop text and one clean rewrite
|
|
139
|
+
es/, de/, fr/ Spanish, German, French linters and samples
|
|
140
|
+
harness/SKILL.md separate skill: how to design an agent harness
|
|
141
|
+
evals/ eval harness: 14 tasks, 4 conditions, scorer, runner
|
|
142
|
+
examples/ five before/after pairs with measured scores
|
|
143
|
+
tests/ unittest suite, standard library only
|
|
144
|
+
tools/ JSON wrappers for the five linters
|
|
145
|
+
scripts/check.sh the whole gate: tests, then the sample linters
|
|
146
|
+
hooks/pre-commit git hook that blocks a commit above the limit
|
|
147
|
+
hooks/pre-push git hook that runs the whole gate before a push
|
|
148
|
+
.pre-commit-config.example.yaml
|
|
149
|
+
RESULTS.md measured scores and their limits
|
|
150
|
+
CONTRIBUTING.md how to contribute rules, tests, and fixes
|
|
151
|
+
demo.sh one-command demo: samples, findings, tests
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Quick start
|
|
155
|
+
|
|
156
|
+
```sh
|
|
157
|
+
git clone https://github.com/ameobius-ai/anti-slop-kit
|
|
158
|
+
cd anti-slop-kit
|
|
159
|
+
|
|
160
|
+
./demo.sh
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Or step by step:
|
|
164
|
+
|
|
165
|
+
```sh
|
|
166
|
+
python3 en/ste-lint.py en/samples/baseline.md en/samples/ste.md
|
|
167
|
+
python3 ru/ru-ste-lint.py ru/samples/baseline.md ru/samples/utr.md
|
|
168
|
+
|
|
169
|
+
python3 -m unittest discover -s tests
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
No dependencies. Python 3.9 or later. The linters use the standard library only,
|
|
173
|
+
because a skill directory is copied as a unit and must keep working after the copy.
|
|
174
|
+
|
|
175
|
+
## The gate
|
|
176
|
+
|
|
177
|
+
One entry point runs everything this project checks:
|
|
178
|
+
|
|
179
|
+
```sh
|
|
180
|
+
bash scripts/check.sh # tests, then the sample linters
|
|
181
|
+
bash scripts/check.sh tests
|
|
182
|
+
bash scripts/check.sh lint
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
`.github/workflows/ci.yml` calls the same script, so a green local run and a
|
|
186
|
+
green CI run cannot disagree about what they checked.
|
|
187
|
+
|
|
188
|
+
GitHub Actions is disabled at the account level for the account that hosts this
|
|
189
|
+
repository: `POST /actions/workflows/ci.yml/dispatches` answers 422, `Actions
|
|
190
|
+
has been disabled for this user`. Until that is lifted the workflow never runs
|
|
191
|
+
here, and the local hooks are the only enforcement that exists:
|
|
192
|
+
|
|
193
|
+
```sh
|
|
194
|
+
ln -s ../../hooks/pre-commit .git/hooks/pre-commit # blocks one bad file
|
|
195
|
+
ln -s ../../hooks/pre-push .git/hooks/pre-push # blocks a bad push
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
The workflow file stays in the tree because a fork with Actions enabled runs it
|
|
199
|
+
unchanged.
|
|
200
|
+
|
|
201
|
+
## Score
|
|
202
|
+
|
|
203
|
+
The score is violations per 100 words. Lower is cleaner.
|
|
204
|
+
|
|
205
|
+
| Text | Score | Longest sentence |
|
|
206
|
+
| --- | --- | --- |
|
|
207
|
+
| `en/samples/baseline.md` | 29.94 | 49 words |
|
|
208
|
+
| `en/samples/ste.md` | 0.83 | 14 words |
|
|
209
|
+
| `ru/samples/baseline.md` | 33.33 | 27 words |
|
|
210
|
+
| `ru/samples/utr.md` | 0.00 | 11 words |
|
|
211
|
+
|
|
212
|
+
Read `RESULTS.md` before you quote these numbers. Two texts per language is a
|
|
213
|
+
smoke test, not a benchmark. `evals/` holds the harness for a real measurement
|
|
214
|
+
across seven tasks per language and four prompt conditions. First live runs were
|
|
215
|
+
executed on 2026-08-04 (EN 23/28 cells, RU 24/28, via a local OpenAI-compatible
|
|
216
|
+
gateway); see `evals/README.md` for the setup and scores. No number on this page
|
|
217
|
+
comes from it yet. A separate lane scores the detection side:
|
|
218
|
+
`evals/detection_benchmark.py` runs every kit signal over a labeled AI/human
|
|
219
|
+
corpus (public eras via the fetchers in `scripts/`, the current generation via
|
|
220
|
+
`scripts/corpus_from_evals_run.py` on top of a `run.py` run); the measured
|
|
221
|
+
tables are in `RESULTS.md`, under the era ladder.
|
|
222
|
+
|
|
223
|
+
## Russian is a first-class citizen
|
|
224
|
+
|
|
225
|
+
The RU side is not a translation of the EN side. English plain-language tooling
|
|
226
|
+
is crowded; a deterministic Russian linter is rare. It targets канцелярит,
|
|
227
|
+
отглагольные существительные, цепочки родительного падежа and причастные
|
|
228
|
+
обороты, plus typography (ёлочки, тире), against ГОСТ Р 58049-2017 §8.2.3 (УТР).
|
|
229
|
+
It carries its own lexicon, its own morphology handling (ё-folding, a participle
|
|
230
|
+
stoplist), and its own samples and scores.
|
|
231
|
+
|
|
232
|
+
## Use it in a pipeline
|
|
233
|
+
|
|
234
|
+
The linters return exit code 1 when a file scores above the limit, so they can
|
|
235
|
+
gate a build:
|
|
236
|
+
|
|
237
|
+
```sh
|
|
238
|
+
python3 en/ste-lint.py --max 5 docs/*.md
|
|
239
|
+
python3 ru/ru-ste-lint.py --max 5 --json README.ru.md
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Exit codes:
|
|
243
|
+
|
|
244
|
+
- `0`: every file is at or below the limit, or no limit was given
|
|
245
|
+
- `1`: at least one file is above the limit
|
|
246
|
+
- `2`: bad option or unreadable file
|
|
247
|
+
|
|
248
|
+
Git hook:
|
|
249
|
+
|
|
250
|
+
```sh
|
|
251
|
+
ln -s ../../hooks/pre-commit .git/hooks/pre-commit
|
|
252
|
+
chmod +x hooks/pre-commit
|
|
253
|
+
ANTI_SLOP_MAX=3 git commit # change the limit for one commit
|
|
254
|
+
git commit --no-verify # skip the hook
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
For [pre-commit](https://pre-commit.com), copy `.pre-commit-config.example.yaml`
|
|
258
|
+
and adjust the two paths.
|
|
259
|
+
|
|
260
|
+
## Explain a score
|
|
261
|
+
|
|
262
|
+
A score says where the problems are, not only how many. `--explain` prints one
|
|
263
|
+
line per finding: line number, rule, matched text, and the suggested fix.
|
|
264
|
+
|
|
265
|
+
```sh
|
|
266
|
+
python3 en/ste-lint.py --explain docs/draft.md
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
```text
|
|
270
|
+
draft.md words= 412 total= 9 per100w= 2.18 maxsent= 24
|
|
271
|
+
L14 passive_voice 'is handled' Name the actor. Use active voice.
|
|
272
|
+
L22 banned_word 'utilize' Use 'use' instead.
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Split the score
|
|
276
|
+
|
|
277
|
+
One total hides two different problems. `--breakdown` prints them apart: `slop`
|
|
278
|
+
counts banned words, marketing adjectives, AI filler and hedges; `cl` counts the
|
|
279
|
+
controlled-language mechanics, which are sentence length, passive voice,
|
|
280
|
+
nominalizations and participle chains.
|
|
281
|
+
|
|
282
|
+
```sh
|
|
283
|
+
python3 ru/ru-ste-lint.py --breakdown ru/samples/baseline.md
|
|
284
|
+
python3 en/ste-lint.py --only slop docs/draft.md
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
```text
|
|
288
|
+
baseline.md words= 117 total= 39 per100w= 33.33 maxsent= 27 slop= 15 cl= 24
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
The split changes what you do next. In `ru/samples/baseline.md`, 24 of the 39
|
|
292
|
+
findings are structural, so a search for banned words finds 15 and misses the
|
|
293
|
+
larger half. `--only slop` and `--only cl` gate on one component alone, which
|
|
294
|
+
helps when a document class tolerates long sentences but not marketing language.
|
|
295
|
+
|
|
296
|
+
## GitHub Actions annotations
|
|
297
|
+
|
|
298
|
+
`--format github` emits workflow commands, so findings appear inline on pull
|
|
299
|
+
request diffs when the linter runs in GitHub Actions:
|
|
300
|
+
|
|
301
|
+
```yaml
|
|
302
|
+
- name: Lint prose
|
|
303
|
+
run: python3 en/ste-lint.py --format github --max 5 docs/*.md
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Each finding becomes a `::warning` annotation with file, line, rule name and
|
|
307
|
+
suggested fix. Combine with `--max` to fail the job and annotate at once.
|
|
308
|
+
|
|
309
|
+
## Exclude a region
|
|
310
|
+
|
|
311
|
+
The linters skip frontmatter, code blocks, inline code, link targets, bare URLs
|
|
312
|
+
and HTML comments. To exclude prose as well:
|
|
313
|
+
|
|
314
|
+
```markdown
|
|
315
|
+
<!-- anti-slop: off -->
|
|
316
|
+
A quoted paragraph that you must not rewrite.
|
|
317
|
+
<!-- anti-slop: on -->
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## What the score does not tell you
|
|
321
|
+
|
|
322
|
+
The linters match patterns. They do not read.
|
|
323
|
+
|
|
324
|
+
- A score of 0 says nothing about whether the text is correct or complete.
|
|
325
|
+
- Every rule can produce a false positive. Passive voice is right when the actor
|
|
326
|
+
is unknown. Some long sentences are clear.
|
|
327
|
+
- Use the score to find candidates for a rewrite, not to grade a writer.
|
|
328
|
+
|
|
329
|
+
## Examples
|
|
330
|
+
|
|
331
|
+
See the [examples directory](examples/) for practical usage examples including:
|
|
332
|
+
|
|
333
|
+
- **Basic Analysis**: Analyze single text files
|
|
334
|
+
- **Batch Processing**: Process multiple files efficiently
|
|
335
|
+
- **Custom Patterns**: Add your own detection rules
|
|
336
|
+
- **Configuration**: Customize behavior with YAML
|
|
337
|
+
- **CI/CD Integration**: Use with GitHub Actions and pre-commit hooks
|
|
338
|
+
|
|
339
|
+
### Quick Start
|
|
340
|
+
|
|
341
|
+
1. Install the package
|
|
342
|
+
2. Create a configuration file (optional)
|
|
343
|
+
3. Run analysis on your files
|
|
344
|
+
4. Review results and adjust threshold
|
|
345
|
+
|
|
346
|
+
For detailed examples with code, visit the [examples directory](examples/) or check the [documentation](docs/).
|
|
347
|
+
|
|
348
|
+
### Common Use Cases
|
|
349
|
+
|
|
350
|
+
- **Code Review**: Check PR descriptions for AI patterns
|
|
351
|
+
- **Documentation**: Ensure technical writing quality
|
|
352
|
+
- **Content Creation**: Review blog posts and articles
|
|
353
|
+
- **CI/CD Pipeline**: Automatically check content quality
|
|
354
|
+
- **Pre-commit Hook**: Catch issues before committing
|
|
355
|
+
|
|
356
|
+
For more examples, see [USAGE.md](docs/USAGE.md).
|
|
357
|
+
## Performance
|
|
358
|
+
Benchmarks and optimization information for anti-slop-kit.
|
|
359
|
+
|
|
360
|
+
### Benchmarks
|
|
361
|
+
Performance varies by file size:
|
|
362
|
+
- Small files (<10KB): <0.1s, ~50MB memory
|
|
363
|
+
- Medium files (10-100KB): 0.1-1s, ~100MB memory
|
|
364
|
+
- Large files (100KB-1MB): 1-10s, ~200MB memory
|
|
365
|
+
- Very large files (>1MB): 10s+, ~500MB memory
|
|
366
|
+
|
|
367
|
+
### Optimization Tips
|
|
368
|
+
1. Exclude large directories (node_modules, .git, dist)
|
|
369
|
+
2. Enable parallel processing for multiple files
|
|
370
|
+
3. Use incremental analysis with git diff
|
|
371
|
+
4. Filter by file types to skip irrelevant files
|
|
372
|
+
5. Process in batches for better memory management
|
|
373
|
+
|
|
374
|
+
### Resource Usage
|
|
375
|
+
- CPU: 1 core for single file, multiple cores for batch
|
|
376
|
+
- Memory: 50MB base + 10-50MB per file
|
|
377
|
+
- Disk: Read-only analysis, minimal writes
|
|
378
|
+
|
|
379
|
+
### Performance Tuning
|
|
380
|
+
Configure in .anti-slop.yaml: parallel, workers, chunk_size, cache
|
|
381
|
+
|
|
382
|
+
### Known Limitations
|
|
383
|
+
- Large files (>10MB) may cause high memory usage
|
|
384
|
+
- Complex regex patterns slow down analysis
|
|
385
|
+
- Network features add latency
|
|
386
|
+
|
|
387
|
+
For more details, see performance benchmarks in the test suite.
|
|
388
|
+
## Security
|
|
389
|
+
|
|
390
|
+
### Security Features
|
|
391
|
+
|
|
392
|
+
anti-slop-kit includes several security-focused features:
|
|
393
|
+
|
|
394
|
+
- **Dependency Scanning**: Automated checks for known vulnerabilities
|
|
395
|
+
- **Code Analysis**: Detection of potentially unsafe patterns
|
|
396
|
+
- **Input Validation**: Sanitization of user-provided content
|
|
397
|
+
- **Secure Defaults**: Conservative security settings out of the box
|
|
398
|
+
|
|
399
|
+
### Best Practices
|
|
400
|
+
|
|
401
|
+
Follow these security best practices when using anti-slop-kit:
|
|
402
|
+
|
|
403
|
+
1. **Keep Dependencies Updated**: Regularly update anti-slop-kit and its dependencies
|
|
404
|
+
2. **Review Configuration**: Audit your `.anti-slop.yaml` for sensitive data
|
|
405
|
+
3. **Use Virtual Environments**: Isolate dependencies to prevent conflicts
|
|
406
|
+
4. **Monitor Logs**: Check analysis logs for suspicious patterns
|
|
407
|
+
5. **Limit Permissions**: Run with minimal required permissions
|
|
408
|
+
6. **Secure Configuration Files**: Don't commit secrets to version control
|
|
409
|
+
|
|
410
|
+
### Reporting Vulnerabilities
|
|
411
|
+
|
|
412
|
+
If you discover a security vulnerability, please report it responsibly:
|
|
413
|
+
|
|
414
|
+
1. **Do NOT open a public issue**
|
|
415
|
+
2. **GitHub Security Advisory**: create a private advisory via the [Security tab](https://github.com/ameobius-ai/anti-slop-kit/security/advisories)
|
|
416
|
+
3. Include detailed description and reproduction steps
|
|
417
|
+
4. Allow reasonable time for response and fix
|
|
418
|
+
|
|
419
|
+
We will acknowledge receipt within 48 hours and provide a timeline for fixing the issue.
|
|
420
|
+
|
|
421
|
+
### Security Considerations
|
|
422
|
+
|
|
423
|
+
- **Data Privacy**: anti-slop-kit processes text locally, no data sent to external servers
|
|
424
|
+
- **File Access**: Only reads files you explicitly specify
|
|
425
|
+
- **Network Access**: Minimal network requests (only for dependency updates if enabled)
|
|
426
|
+
- **Code Execution**: Does not execute analyzed code, only parses and analyzes
|
|
427
|
+
|
|
428
|
+
### Dependency Security
|
|
429
|
+
|
|
430
|
+
anti-slop-kit uses Dependabot for automated dependency updates:
|
|
431
|
+
|
|
432
|
+
- Weekly security scans
|
|
433
|
+
- Automatic PRs for security updates
|
|
434
|
+
- Manual review required before merging
|
|
435
|
+
|
|
436
|
+
For production use, consider:
|
|
437
|
+
- Pinning dependency versions
|
|
438
|
+
- Running `pip-audit` regularly
|
|
439
|
+
- Using lock files (requirements.txt or Pipfile.lock)
|
|
440
|
+
|
|
441
|
+
### Security Updates
|
|
442
|
+
|
|
443
|
+
Security updates are released as soon as possible after vulnerability discovery.
|
|
444
|
+
Subscribe to GitHub releases or watch the repository for security announcements.
|
|
445
|
+
|
|
446
|
+
For more information, see [SECURITY.md](SECURITY.md).
|
|
447
|
+
## FAQ
|
|
448
|
+
|
|
449
|
+
### General Questions
|
|
450
|
+
|
|
451
|
+
**Q: What does anti-slop-kit do?**
|
|
452
|
+
A: It analyzes text to detect AI-generated patterns and provides a quality score.
|
|
453
|
+
|
|
454
|
+
**Q: What languages are supported?**
|
|
455
|
+
A: English, Russian, Spanish, German and French — each linter lives in its `<lang>/` directory, and every clean sample is pinned in the gate.
|
|
456
|
+
|
|
457
|
+
**Q: Is it free to use?**
|
|
458
|
+
A: Yes, MIT license. Free for personal and commercial use.
|
|
459
|
+
|
|
460
|
+
**Q: Where can I get help?**
|
|
461
|
+
A: Check [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) or open a [GitHub issue](https://github.com/ameobius-ai/anti-slop-kit/issues).
|
|
462
|
+
|
|
463
|
+
### Usage Questions
|
|
464
|
+
|
|
465
|
+
**Q: How do I install it?**
|
|
466
|
+
A: `pip install anti-slop-kit` (see [Installation](#installation) section above)
|
|
467
|
+
|
|
468
|
+
**Q: How do I configure it?**
|
|
469
|
+
A: Create `.anti-slop.yaml` in your project root (see [Configuration](#usage) section)
|
|
470
|
+
|
|
471
|
+
**Q: Can I use it with pre-commit?**
|
|
472
|
+
A: Yes, see [Examples](#examples) section for pre-commit hook setup
|
|
473
|
+
|
|
474
|
+
**Q: Does it work in CI/CD?**
|
|
475
|
+
A: Yes, see [Examples](#examples) for GitHub Actions integration
|
|
476
|
+
|
|
477
|
+
### Technical Questions
|
|
478
|
+
|
|
479
|
+
**Q: What's the scoring system?**
|
|
480
|
+
A: 0-100 scale: 90-100 Excellent, 70-89 Good, 50-69 Fair, 0-49 Poor
|
|
481
|
+
|
|
482
|
+
**Q: Can I customize detection patterns?**
|
|
483
|
+
A: Yes, add custom patterns in configuration file (see [Examples](#examples))
|
|
484
|
+
|
|
485
|
+
**Q: How fast is it?**
|
|
486
|
+
A: See [Performance](#performance) section for benchmarks
|
|
487
|
+
|
|
488
|
+
**Q: Does it send data anywhere?**
|
|
489
|
+
A: No, all processing is local. No external API calls.
|
|
490
|
+
|
|
491
|
+
### Troubleshooting
|
|
492
|
+
|
|
493
|
+
**Q: Installation fails?**
|
|
494
|
+
A: See [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) for common solutions
|
|
495
|
+
|
|
496
|
+
**Q: Too many false positives?**
|
|
497
|
+
A: Adjust strictness level or add exclusions in configuration
|
|
498
|
+
|
|
499
|
+
**Q: Running too slow?**
|
|
500
|
+
A: See [Performance](#performance) for optimization tips
|
|
501
|
+
|
|
502
|
+
For more questions, see [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) or open a [GitHub issue](https://github.com/ameobius-ai/anti-slop-kit/issues).
|
|
503
|
+
## Contributing
|
|
504
|
+
|
|
505
|
+
See `CONTRIBUTING.md` for the ground rules (standard library only, no shared
|
|
506
|
+
modules between linters, a test in the same commit as a rule change) and how to
|
|
507
|
+
add a banned word or report a false positive.
|
|
508
|
+
|
|
509
|
+
## Sources
|
|
510
|
+
|
|
511
|
+
- ASD-STE100 Simplified Technical English, Issue 9 (15 January 2025), ASD and the
|
|
512
|
+
STEMG: https://asd-ste100.org. The specification is copyrighted. This repository
|
|
513
|
+
reproduces the mechanics and no part of the text. Request a free copy from ASD.
|
|
514
|
+
- GOST R 58049-2017, clause 8.2.3, controlled Russian technical language.
|
|
515
|
+
- The English skill follows the approach shown in
|
|
516
|
+
https://github.com/woosal1337/blog/tree/main/videos/ep01-the-cure-for-ai-slop.
|
|
517
|
+
The skill and the linter here are written from scratch and share no code with it.
|
|
518
|
+
- https://github.com/talkstream/ru-text is a larger Russian rule set (about 1044
|
|
519
|
+
rules) and works well next to this kit.
|
|
520
|
+
- `harness/SKILL.md` is built from
|
|
521
|
+
https://github.com/ai-boost/awesome-harness-engineering (CC0) and the sources it
|
|
522
|
+
lists.
|
|
523
|
+
|
|
524
|
+
## License
|
|
525
|
+
|
|
526
|
+
MIT. See `LICENSE`.
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
## Acknowledgments
|
|
530
|
+
|
|
531
|
+
### Contributors
|
|
532
|
+
|
|
533
|
+
Thanks to all contributors who have helped improve anti-slop-kit:
|
|
534
|
+
|
|
535
|
+
- [@ameobius-ai](https://github.com/ameobius-ai) - Project creator and maintainer
|
|
536
|
+
- Community contributors - Thank you for your PRs, issues, and feedback!
|
|
537
|
+
|
|
538
|
+
### Dependencies
|
|
539
|
+
|
|
540
|
+
anti-slop-kit is built on the shoulders of giants:
|
|
541
|
+
|
|
542
|
+
- [Python](https://www.python.org/) - Programming language
|
|
543
|
+
- [pytest](https://pytest.org/) - Testing framework
|
|
544
|
+
- [PyYAML](https://pyyaml.org/) - YAML parsing
|
|
545
|
+
- [GitHub Actions](https://github.com/features/actions) - CI/CD platform
|
|
546
|
+
- [mypy](http://mypy-lang.org/) - Static type checker
|
|
547
|
+
- [black](https://black.readthedocs.io/) - Code formatter
|
|
548
|
+
- [isort](https://pycqa.github.io/isort/) - Import sorter
|
|
549
|
+
- [flake8](https://flake8.pycqa.org/) - Linting
|
|
550
|
+
|
|
551
|
+
### Inspiration
|
|
552
|
+
|
|
553
|
+
This project was inspired by:
|
|
554
|
+
|
|
555
|
+
- [Write Good](https://github.com/btford/write-good) - Naive linter for English prose
|
|
556
|
+
- [Hemingway Editor](https://hemingwayapp.com/) - Writing clarity tool
|
|
557
|
+
- [Grammarly](https://www.grammarly.com/) - Writing assistant
|
|
558
|
+
- [Proselint](https://github.com/amperser/proselint/) - Linter for prose
|
|
559
|
+
|
|
560
|
+
### Special Thanks
|
|
561
|
+
|
|
562
|
+
- The open source community for amazing tools and libraries
|
|
563
|
+
- Everyone who has reported issues and suggested improvements
|
|
564
|
+
- Technical writers and editors who provided feedback on pattern definitions
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
## Citation
|
|
568
|
+
|
|
569
|
+
If you use anti-slop-kit in your research, please cite:
|
|
570
|
+
|
|
571
|
+
```
|
|
572
|
+
ameobius-ai. (2026). anti-slop-kit: Text Quality Analysis Toolkit.
|
|
573
|
+
https://github.com/ameobius-ai/anti-slop-kit
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
|
|
577
|
+
## Related Projects
|
|
578
|
+
|
|
579
|
+
Other tools for improving writing quality:
|
|
580
|
+
|
|
581
|
+
- **[Write Good](https://github.com/btford/write-good)** - Naive linter for English prose
|
|
582
|
+
- **[Proselint](https://github.com/amperser/proselint)** - Linter for prose
|
|
583
|
+
- **[Hemingway Editor](https://hemingwayapp.com/)** - Writing clarity tool
|
|
584
|
+
- **[Grammarly](https://www.grammarly.com/)** - AI writing assistant
|
|
585
|
+
- **[LanguageTool](https://languagetool.org/)** - Grammar and style checker
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
## Roadmap
|
|
589
|
+
|
|
590
|
+
### Shipped (ahead of the Q4 plan)
|
|
591
|
+
|
|
592
|
+
- Custom rule engine for user-defined patterns (`tools/aslint/custom_rules.py`,
|
|
593
|
+
`--rules rules.yaml`)
|
|
594
|
+
|
|
595
|
+
### Current Focus (Q3 2026)
|
|
596
|
+
|
|
597
|
+
- Improve test coverage to 90%+ (branch coverage tracked via `.coveragerc`)
|
|
598
|
+
- Create web interface for interactive analysis
|
|
599
|
+
|
|
600
|
+
### Planned Features (Q4 2026)
|
|
601
|
+
|
|
602
|
+
- IntelliJ IDEA plugin
|
|
603
|
+
- REST API for remote analysis
|
|
604
|
+
- Batch processing optimizations
|
|
605
|
+
|
|
606
|
+
### Future Vision (2027)
|
|
607
|
+
|
|
608
|
+
- Real-time analysis mode
|
|
609
|
+
- Integration with popular writing tools
|
|
610
|
+
- Enterprise features (team dashboards, reporting)
|