humanizer-pro 4.15.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.
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Siqi Chen
4
+ Copyright (c) 2026 eddyplolz
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
@@ -0,0 +1,424 @@
1
+ Metadata-Version: 2.4
2
+ Name: humanizer-pro
3
+ Version: 4.15.0
4
+ Summary: Deterministic, zero-dependency audit for AI-writing tells, leaked chatbot artifacts, and rewrite fidelity.
5
+ Author: Humanizer Pro contributors
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/eddyplolz/humanizer-pro
8
+ Project-URL: Changelog, https://github.com/eddyplolz/humanizer-pro/blob/main/CHANGELOG.md
9
+ Project-URL: Issues, https://github.com/eddyplolz/humanizer-pro/issues
10
+ Keywords: ai-writing,linter,prose,markdown,sarif
11
+ Classifier: Environment :: Console
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Topic :: Text Processing :: Linguistic
15
+ Requires-Python: >=3.10
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Dynamic: license-file
19
+
20
+ # Humanizer Pro
21
+
22
+ [![CI](https://github.com/eddyplolz/humanizer-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/eddyplolz/humanizer-pro/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) ![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg) ![False positives: 0.2%](https://img.shields.io/badge/false_positives-0.2%25_measured-green.svg) ![Runs locally](https://img.shields.io/badge/runs-locally-lightgrey.svg)
23
+
24
+ **Finds the habits that make text read as machine-written, removes them, and checks that every fact survived.** Runs on your computer with no account, no API key, and no network connection. Measured false-positive rate on 1,264 human-written documents: 0.2%.
25
+
26
+ | Before | After | What changed |
27
+ |---|---|---|
28
+ | In today's rapidly evolving digital landscape, effective collaboration serves as a crucial cornerstone for organizations seeking to unlock their full potential. | Good collaboration depends less on the tool than on whether people know what decisions they own, where work is tracked, and how quickly blockers get resolved. | Stock opener cut; "serves as a cornerstone" became a plain claim; the vague promise became three concrete conditions. |
29
+ | It is important to note that this approach is not just about tools, but about creating a vibrant culture of innovation. | *(folded into the sentence above)* | "It is important to note" and "not just X, but Y" are formulas, and "vibrant culture of innovation" said nothing the first sentence did not. |
30
+
31
+ Three ways to use it:
32
+
33
+ ```bash
34
+ # 1. As a skill in Claude Code (then type /humanizer-pro)
35
+ git clone https://github.com/eddyplolz/humanizer-pro.git ~/.claude/skills/humanizer-pro
36
+
37
+ # 2. As a skill in Codex and other agents
38
+ git clone https://github.com/eddyplolz/humanizer-pro.git ~/.agents/skills/humanizer-pro
39
+
40
+ # 3. As a command-line checker (Python 3.10+)
41
+ pip install humanizer-pro && humanizer-audit draft.md
42
+ ```
43
+
44
+ Windows paths and the GitHub Action are in [Install the skill](#install-the-skill) and [Check files automatically](#check-files-automatically).
45
+
46
+ **Who it is for:** anyone cleaning up an AI draft before it goes out; editors and docs teams who want a check in CI; Wikipedia and wiki editors, since it knows wikitext and neutral tone; and coding agents auditing their own prose.
47
+
48
+ **What makes it different from a "humanizer" website:** your text never leaves your machine, every flag comes with the reason and the line, a compare mode proves the rewrite kept your numbers, names, dates, and links, and the error rates are measured on public data you can rebuild yourself.
49
+
50
+ ## Contents
51
+
52
+ 1. [What it does](#what-it-does)
53
+ 2. [What it does not do](#what-it-does-not-do)
54
+ 3. [Your privacy](#your-privacy)
55
+ 4. [Install the skill](#install-the-skill)
56
+ 5. [Use the skill](#use-the-skill)
57
+ 6. [Check files from the command line](#check-files-from-the-command-line)
58
+ 7. [Check files automatically](#check-files-automatically)
59
+ 8. [How well it works](#how-well-it-works)
60
+ 9. [How it decides](#how-it-decides)
61
+ 10. [Help improve it](#help-improve-it)
62
+ 11. [Credits and license](#credits-and-license)
63
+ 12. [Version history](#version-history)
64
+
65
+ ## What it does
66
+
67
+ AI drafts repeat the same habits: stock phrases, inflated importance, and filler that sounds complete but says little. Readers notice, and then they stop trusting the text.
68
+
69
+ Humanizer Pro:
70
+
71
+ - finds those habits and explains each one
72
+ - rewrites the draft in plain language, if you ask it to
73
+ - checks that a rewrite kept the numbers, dates, full names, links, and quotes it can detect
74
+ - flags text that a chatbot left behind, such as citation codes and placeholder fields
75
+
76
+ Here is an example.
77
+
78
+ Before:
79
+
80
+ > In today's rapidly evolving digital landscape, effective collaboration serves as a crucial cornerstone for organizations seeking to unlock their full potential. It is important to note that this approach is not just about tools, but about creating a vibrant culture of innovation.
81
+
82
+ After:
83
+
84
+ > Good collaboration depends less on the tool than on whether people know what decisions they own, where work is tracked, and how quickly blockers get resolved.
85
+
86
+ The command-line checker explains the first version line by line (shortened):
87
+
88
+ ```text
89
+ $ humanizer-audit eval/fixtures/ai-slop-general.md
90
+ eval/fixtures/ai-slop-general.md — risk 60
91
+ WARNING L3:C1 family3.filler_framing — Filler framing or superficial analysis [In today's]
92
+ WARNING L3:C37 family4.ai_vocab_cluster — AI-vocabulary cluster [cornerstone, crucial, enhance, foster, landscape, robust, unlock, vibrant]
93
+ WARNING L6:C29 family5.syntactic_tell — Syntactic tell or hedged construction [It is important to note]
94
+ WARNING L6:C75 family7.rhetorical_formula — Rhetorical formula or forced cadence [not just about tools, but]
95
+ WARNING L7:C80 family3.filler_framing — Filler framing or superficial analysis [In conclusion]
96
+ ```
97
+
98
+ ## What it does not do
99
+
100
+ This project makes no claims about AI detectors.
101
+
102
+ It does not add a fake personality. Swapping one stock phrase for a casual one trades one habit for another, so the skill avoids both.
103
+
104
+ It does not rewrite text that is already clean. A built-in restraint check returns good writing close to how it arrived.
105
+
106
+ > [!IMPORTANT]
107
+ > A high score shows writing habits. It does not prove that a machine wrote the text, and it proves nothing about a person. Research has found that AI detectors wrongly flag more than 60% of essays by people writing in English as a second language (Liang et al., Stanford, *Patterns*, 2023). Do not use this tool as the only basis for an academic, hiring, or authorship decision.
108
+
109
+ ## Your privacy
110
+
111
+ The command-line checker reads files on your computer and sends nothing anywhere. It makes no network connections and keeps no logs.
112
+
113
+ The skill runs inside your coding agent, such as Claude Code or Codex. Your text goes wherever your agent already sends it, and nowhere else.
114
+
115
+ Two features can put your text somewhere else, and only when you choose them:
116
+
117
+ - SARIF results contain short quotes from your text. If you upload them to GitHub code scanning, those quotes are stored with your repository's code scanning results.
118
+ - The GitHub Action runs in your own GitHub Actions workflow, so your files are read on GitHub's servers, as with any other check you run there.
119
+
120
+ ## Install the skill
121
+
122
+ ### Before you start
123
+
124
+ You need [git](https://git-scm.com/downloads). To use the command-line checker as well, you also need [Python](https://www.python.org/downloads/) 3.10 or newer.
125
+
126
+ ### Install for Claude Code
127
+
128
+ On a Mac or Linux computer, run these commands in Terminal:
129
+
130
+ ```bash
131
+ mkdir -p ~/.claude/skills
132
+ git clone https://github.com/eddyplolz/humanizer-pro.git ~/.claude/skills/humanizer-pro
133
+ ```
134
+
135
+ On Windows, run these commands in Command Prompt:
136
+
137
+ ```bat
138
+ mkdir "%USERPROFILE%\.claude\skills"
139
+ git clone https://github.com/eddyplolz/humanizer-pro.git "%USERPROFILE%\.claude\skills\humanizer-pro"
140
+ ```
141
+
142
+ To check it worked, open the new `humanizer-pro` folder and look for a file called `SKILL.md`. Claude Code loads the skill the next time you start it. You can then type `/humanizer-pro`.
143
+
144
+ ### Install for Codex and other agents
145
+
146
+ On a Mac or Linux computer:
147
+
148
+ ```bash
149
+ mkdir -p ~/.agents/skills
150
+ git clone https://github.com/eddyplolz/humanizer-pro.git ~/.agents/skills/humanizer-pro
151
+ ```
152
+
153
+ On Windows:
154
+
155
+ ```bat
156
+ mkdir "%USERPROFILE%\.agents\skills"
157
+ git clone https://github.com/eddyplolz/humanizer-pro.git "%USERPROFILE%\.agents\skills\humanizer-pro"
158
+ ```
159
+
160
+ If you use Codex and have set `CODEX_HOME`, install into `$CODEX_HOME/skills` instead. Otherwise `~/.codex/skills` also works.
161
+
162
+ ## Use the skill
163
+
164
+ Paste your text after a request in plain words. You do not need to learn any commands.
165
+
166
+ | What you want | What to say |
167
+ |---|---|
168
+ | A cleaned-up draft | "Humanize this" or "make this less AI" |
169
+ | A score and reasons, with no changes | "AI check," "score this," or "do not rewrite" |
170
+ | A score, reasons, and a rewrite | "Full audit" |
171
+ | Tighter sentences | "Style edit" or "tighten this" |
172
+ | Neutral, encyclopedia-style writing | "Wiki mode," or mention wikitext or citations |
173
+
174
+ The full audit rates the draft on 6 qualities: directness, rhythm, trust, authenticity, density, and restraint. It shows its reasoning before the rewrite.
175
+
176
+ Wiki mode removes promotional tone, keeps citations, and flags claims that have no source.
177
+
178
+ Style edits use a short checklist based on *The Elements of Style*. The full 1918 text is included, and the skill only loads it when you ask.
179
+
180
+ ## Check files from the command line
181
+
182
+ The checker reads text files and lists each problem with its line number and the words that triggered it. It never changes your files.
183
+
184
+ ### Install the checker
185
+
186
+ Install it with [pipx](https://pipx.pypa.io/):
187
+
188
+ ```bash
189
+ pipx install git+https://github.com/eddyplolz/humanizer-pro
190
+ ```
191
+
192
+ You can also run it from a downloaded copy of this repository, without installing anything:
193
+
194
+ ```bash
195
+ python3 scripts/humanizer_audit.py path/to/draft.md
196
+ ```
197
+
198
+ On Windows, use `py -3` instead of `python3`.
199
+
200
+ ### Check a file
201
+
202
+ ```bash
203
+ humanizer-audit path/to/draft.md
204
+ ```
205
+
206
+ You can:
207
+
208
+ - check several files or folders at once (a folder means every `.md` and `.txt` file inside it)
209
+ - add `--json` to get results a program can read
210
+ - add `--sarif results.sarif` to save results in SARIF, the format GitHub uses to show problems on pull requests
211
+ - add `--include-code` to check code samples as well (they are skipped by default, but leaked chatbot text inside code is always caught)
212
+ - use `--compare original.md revised.md` to check that a rewrite kept the numbers, dates, names of 2 or more words, links, citations, quotes, and code samples in the original (it does not catch every change: a one-word name or a changed fact, such as "delayed" becoming "canceled," can pass)
213
+
214
+ ### Understand the result
215
+
216
+ The checker ends with an exit code that scripts can act on.
217
+
218
+ | Code | Meaning | What to do |
219
+ |---|---|---|
220
+ | 0 | Pass | Nothing. |
221
+ | 1 | Review: the risk score reached the threshold (60 unless you set `--fail-score`) | Read the findings and decide. |
222
+ | 2 | Block: leaked chatbot text, a placeholder, or hidden characters | Fix before you publish. |
223
+ | 3 | The checker could not run, for example a wrong option or a missing file | Check the command. |
224
+
225
+ ## Check files automatically
226
+
227
+ ### Before each commit
228
+
229
+ [pre-commit](https://pre-commit.com/) is a tool that runs checks every time you commit. To add this check, put the following in a file called `.pre-commit-config.yaml` at the top of your project:
230
+
231
+ ```yaml
232
+ repos:
233
+ - repo: https://github.com/eddyplolz/humanizer-pro
234
+ rev: v4.15.0
235
+ hooks:
236
+ - id: humanizer-audit
237
+ ```
238
+
239
+ The check runs on Markdown and text files. A review or block result stops the commit.
240
+
241
+ ### In GitHub Actions
242
+
243
+ This repository is also a GitHub Action. To check your writing on every pull request:
244
+
245
+ 1. In your project, create the file `.github/workflows/writing.yml`.
246
+ 2. Paste in the workflow below.
247
+ 3. Change `paths` to the files or folders you want checked.
248
+ 4. Commit the file.
249
+
250
+ ```yaml
251
+ name: Writing check
252
+ on: pull_request
253
+
254
+ permissions:
255
+ contents: read
256
+ security-events: write # needed to show results on the pull request
257
+
258
+ jobs:
259
+ audit:
260
+ runs-on: ubuntu-latest
261
+ steps:
262
+ - uses: actions/checkout@v4
263
+ - uses: eddyplolz/humanizer-pro@v4.15.0
264
+ with:
265
+ paths: docs README.md
266
+ fail-on: block
267
+ - uses: github/codeql-action/upload-sarif@v3
268
+ if: always()
269
+ with:
270
+ sarif_file: humanizer-audit.sarif
271
+ ```
272
+
273
+ The last step shows each finding on the pull request, next to the line it refers to.
274
+
275
+ You can set these options:
276
+
277
+ | Option | What it does | Default |
278
+ |---|---|---|
279
+ | `paths` | Files or folders to check, separated by spaces or new lines | `.` (everything) |
280
+ | `fail-on` | When the step fails: `block`, `review`, or `never` | `block` |
281
+ | `fail-score` | Risk score that counts as a review | `60` |
282
+ | `sarif-file` | Where to save the SARIF results (leave empty to skip) | `humanizer-audit.sarif` |
283
+ | `include-code` | Set to `true` to check code samples too | `false` |
284
+
285
+ The action needs Python 3 on the runner. GitHub's Ubuntu and macOS runners have it.
286
+
287
+ ## How well it works
288
+
289
+ This project measures its error rates instead of only describing them. It counts errors in both directions:
290
+
291
+ - false positives: how often it flags writing by people
292
+ - catch rate: how often it flags writing by AI
293
+
294
+ | What is measured | Writing used | Result |
295
+ |---|---|---|
296
+ | False positives | 1,264 test documents written before ChatGPT existed: Stack Exchange answers, Wikipedia articles, newspapers, essays, and Python Enhancement Proposals | 0.2% overall; 0.0% to 0.7% by type of writing ([full results](corpus/RESULTS.md)) |
297
+ | Catch rate | 638 test documents from 2023 AI models (RAID) and real ChatGPT replies (WildChat) | 3.1% overall; 0.0% to 5.5% by type of writing |
298
+
299
+ ### False positives
300
+
301
+ Every document in the human set was written before ChatGPT was released, so any flag on one is a mistake by definition. The latest rates, at the default threshold, are:
302
+
303
+ | Type of writing | Documents | False-positive rate |
304
+ |---|---|---|
305
+ | Stack Exchange answers | 450 | 0.0% |
306
+ | Python Enhancement Proposals | 303 | 0.7%, including 1 blocked |
307
+ | Essays | 250 | 0.0% |
308
+ | Newspapers | 257 | 0.4% |
309
+ | Wikipedia articles | 4 | 0.0% |
310
+
311
+ By the period the text was written in:
312
+
313
+ | Period | Documents | False-positive rate |
314
+ |---|---|---|
315
+ | Before 1930 | 507 | 0.2% |
316
+ | 1930 to 2017 | 567 | 0.4% |
317
+ | 2018 to 2022 | 190 | 0.0% |
318
+
319
+ These rates come from the current rules, measured on the test group only (1,264 documents). A block counts as a false positive. The Wikipedia slice is small, so its rate says little yet.
320
+
321
+ Every document comes from a public source. The project publishes a fingerprint of each one (a unique code), with its date, word count, and a public pointer such as a Wikipedia revision id or a Stack Exchange answer id, so anyone can rebuild the collection and check the numbers. It never publishes the text.
322
+
323
+ ### Catch rate
324
+
325
+ The AI text comes from 2 public sources, labeled by model:
326
+
327
+ - text from [RAID](https://github.com/liamdugan/raid), a research benchmark of 2023 AI models
328
+ - first replies from [WildChat](https://huggingface.co/datasets/allenai/WildChat-1M), a public collection of real ChatGPT conversations
329
+
330
+ A pool of answers from current Claude models to [60 published prompts](corpus/machine_prompts.json) can be added with `scripts/generate_machine.py`; it is not part of the published numbers.
331
+
332
+ The catch rate at the default threshold is 3.1% overall (20 of 638 test documents): 5.5% on chat replies, 0.0% on news and encyclopedia text. The full table by model is in the [results](corpus/RESULTS.md). 2 limits apply:
333
+
334
+ - it describes those AI models only
335
+ - the human essays and newspapers are about 100 years old, so part of any gap there reflects the era, not the author
336
+
337
+ ### How the results stay honest
338
+
339
+ Every document goes into one of 2 groups, chosen by its fingerprint. About a quarter go into a tuning group, and the rest into a test group.
340
+
341
+ Rules are adjusted using the tuning group only. Every published rate uses the test group only, so a rule cannot be tuned to make its own results look better.
342
+
343
+ This project also checks its own documentation with the same rules, using `scripts/self_scan.py`. It publishes 2 scores: one that counts every phrase this page quotes as a bad example, and one that leaves quotes and code out.
344
+
345
+ ## How it decides
346
+
347
+ The checker looks for 9 families of habits, learned from cleanup work on Wikipedia and elsewhere. For example:
348
+
349
+ - inflated importance, such as "stands as a testament" or "pivotal moment"
350
+ - stock rhetorical patterns, such as "not just X, but Y" or lists that always come in threes
351
+ - text left behind by a chatbot, such as "I hope this helps," knowledge-cutoff notes, or citation codes like `oaicite`
352
+
353
+ The full list, with examples, is in the [catalog of habits](reference/tell-catalog.md).
354
+
355
+ 2 principles guide every edit:
356
+
357
+ - a single instance proves nothing (one "crucial" is a coincidence, but a cluster is a pattern)
358
+ - over-editing is a failure (if a change makes good writing worse, the original goes back)
359
+
360
+ The checker is stricter for some kinds of writing than others. A chat message, an essay, a news story, and an encyclopedia article each have their own [rules for strictness](reference/registers.md).
361
+
362
+ ## Help improve it
363
+
364
+ New rules go through a review process before they are added. A proposed rule is rejected if it:
365
+
366
+ - encourages over-editing
367
+ - repeats an existing rule
368
+ - reflects one person's taste
369
+ - takes more than about 80 words to state
370
+
371
+ The full process is in the [improvement guide](reference/improvement-loop.md).
372
+
373
+ Before you open a pull request, run these 2 checks. Both must pass.
374
+
375
+ ```bash
376
+ python3 -m pytest -q tests
377
+ python3 scripts/self_scan.py
378
+ ```
379
+
380
+ On Windows, use `py -3` instead of `python3`.
381
+
382
+ <details>
383
+ <summary>What each file and folder is for</summary>
384
+
385
+ | Path | What it is |
386
+ |---|---|
387
+ | `SKILL.md` | The skill itself: routing, principles, checklists, and scoring |
388
+ | `reference/` | Detailed guides: the catalog of habits, worked examples, style and wiki guides, strictness rules, and the improvement process |
389
+ | `scripts/humanizer_audit.py` | The checker |
390
+ | `scripts/self_scan.py` | Checks this project's own documentation |
391
+ | `scripts/corpus.py`, `scripts/fp_measure.py` | Build the test collection and measure error rates |
392
+ | `scripts/generate_machine.py` | Creates AI-written samples for the catch rate (maintainers only; needs an Anthropic API key) |
393
+ | `corpus/` | Document fingerprints, the published prompts, and measured results |
394
+ | `eval/` | Sample texts and the expected results for each |
395
+ | `tests/` | Automated tests |
396
+ | `pyproject.toml`, `action.yml`, `.pre-commit-hooks.yaml` | Packaging, the GitHub Action, and the pre-commit check |
397
+ | `agents/openai.yaml` | Display name and default prompt for Codex |
398
+ | `CHANGELOG.md` | Every change, by version |
399
+ | `WARP.md` | Guide for maintainers |
400
+
401
+ </details>
402
+
403
+ ## Credits and license
404
+
405
+ This project uses the [MIT License](LICENSE).
406
+
407
+ It is a rebuild of [blader/humanizer](https://github.com/blader/humanizer) by Siqi Chen (MIT, copyright 2025). It adds a catalog of habits, detection of leaked chatbot text, a fact-checking compare mode, wiki and style modes, and measured error rates. The `LICENSE` file includes both copyright notices.
408
+
409
+ It draws on these sources:
410
+
411
+ - [blader/humanizer](https://github.com/blader/humanizer) by Siqi Chen (MIT)
412
+ - [Stop Slop](https://github.com/hardikpandya/stop-slop) by Hardik Pandya (MIT)
413
+ - [avoid-ai-writing](https://github.com/conorbronsdon/avoid-ai-writing) by Conor Bronsdon (MIT): the vocabulary tiers, strictness rules, self-check, and error-rate measurement design
414
+ - [humanize](https://github.com/harshaneel/humanize) by Harshaneel Gokhale (MIT): rhythm counts and several patterns
415
+ - [Wikipedia: Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing) by WikiProject AI Cleanup ([CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/))
416
+ - [Project Gutenberg #37134](https://www.gutenberg.org/ebooks/37134): the public-domain text of *The Elements of Style* by William Strunk Jr.
417
+ - [US-PD-Newspapers](https://huggingface.co/datasets/PleIAs/US-PD-Newspapers) by PleIAs: public-domain newspapers in the human test set
418
+ - [RAID](https://github.com/liamdugan/raid) by Dugan and others (MIT): AI-written test set
419
+ - [WildChat-1M](https://huggingface.co/datasets/allenai/WildChat-1M) by Ai2 (ODC-BY): AI-written test set
420
+ - [Python Enhancement Proposals](https://github.com/python/peps) (public domain): technical writing in the human test set
421
+
422
+ ## Version history
423
+
424
+ Current release: **v4.15.0**. It puts the package on PyPI, rebuilds the measurement corpus from public sources only, publishes error rates in both directions, adds four editing principles and several new checks to the audit, and tests on Windows and macOS. Every change is listed in the [changelog](CHANGELOG.md).