Releases: manavmishra/ZeroSlop
Release list
Zero Slop v2.8.7
Release 2.8.7 with bounded rewrite recovery
Zero Slop v2.8.6
Fix semantic repair rejection in the demo pipeline
Zero Slop v2.8.5
Ship v2.8.5 with private corpus and reliable release assets
Zero Slop v2.8.4
Fix social-stage scoring and close final verification
Zero Slop v2.8.3
Six bugs in the antithesis detector, three that silenced it and three that convicted ordinary prose.
Silenced it
- A markdown
**bold**span anywhere in a pair killed detection outright. Bolding one word moved a draft from over budget to clean. - An em-dash appositive missed, because the rule demanded a literal comma.
- "didn't" missed where "did not" was caught.
Convicted ordinary writing
- "Not all customers migrated in the first wave." Any sentence-initial "not" qualified as the figure.
- "It does not run on Windows. It runs on Linux and macOS." A shared stopword counted as a frame.
- Pricing tiers, warehouse schedules and office hours all read as antithesis.
The corpus is why none of it showed. It held 58 pairs and not one quantifier "not", not one ordinary negated sentence, and no enumeration, so precision measured 100% because the shapes that break it were absent. Those families were added first, before any fix, which put the real figure at 67.5% precision and 68.3% specificity.
On 75 pairs now: recall 91.2%, 100% on the shapes in reach, precision and specificity both 100%. Against 2.8.2 across every corpus, findings on must-not-flag, must-not-flag-shape and community-register do not move at all, and performed-register gains one that had never been caught.
The reading pass costs 6.6% more time for this, 1.37M words a second against 1.46M.
Zero Slop v2.8.2
The reading pass could not see a verbless fragment that contained a plural noun, because it took any word ending in s as a verb. Fragments are mostly noun phrases and noun phrases are mostly plural, so this was its commonest shape.
"Same compound, three identifiers. Same assay, two units." drew zero findings and scored 10.2 with no flagged phrases, so nothing anywhere in the tool remarked on it.
Adds no findings on the must-not-flag corpora and removes two false positives on performed-register.
No ZIP on this release: install v2.8.3, which supersedes it.
Zero Slop v2.8.1
Measure the antithesis detector, then make it work
2.8.0 shipped a detector for this family with no recall measurement. It fired on
four hand-picked anchors and stayed silent on the certified-human corpus, which
is not the same thing. The number nobody had was 37.5%.
bench/antithesis/ is 58 labelled adjacent-sentence pairs — 30 antithesis, 28
ordinary — and the negatives are adversarial for this detector specifically:
negation that is not a figure, anaphora, repeated subjects, shared vocabulary,
parallel technical prose.
| 2.8.0 | now | |
|---|---|---|
| Recall, all shapes | 40.0% | 90.0% |
| Recall, shapes in reach | 44.4% | 100% |
| Precision | 80.0% | 100% |
| Specificity | 89.3% | 100% |
| False positives | 3 | 0 |
Four defects, each found by measurement
Contracted negation was invisible. "Slop isn't a vibe. It's measurable." is a
documented anchor in references/tells.md and nothing matched it. The marked
figure is now matched inside the pair as well as at its ends, gated on a frame —
a repeated opening, two shared words, or a copula on both sides — because a
negation on its own is ordinary prose.
The isocolon rule keyed on the wrong thing. It blocked a repeated opening of
two raw tokens, which killed the documented "Open weights let you adapt a model.
An open stack lets you adapt the machinery that created it." while passing
"Version one shipped in March. Version two shipped in June." The test is now
whether a content word opens both halves: a repeated subject is enumeration, a
repeated article is not.
Matches could overlap. Three short consecutive sentences produced two pairs
out of one figure, and the budget reads the rate those pairs produce.
Markdown scaffolding read as prose. A heading carries no terminal
punctuation, so the splitter returned it glued to the paragraph beneath it.
Fixing prose_of instead was the obvious move and the wrong one — measured,
dropping headings moved five documents over budget on rate alone and stripping
list markers moved eleven, because the budgets are calibrated against what it
currently produces. The family rejects the glued span itself. Across 88 corpus
and documentation files: zero verdict flips in any family, zero count moves
outside this one, identical word counts.
The recall ceiling is real
Two shapes stay out of reach and count against recall rather than being excused.
Bare subject swap is a judgment call in tells.md. The weak isocolon is worse
than hard: "A meter reports a number. A reader reports a feeling." and "The
report lists every vendor. The appendix lists every contract." are identical to
every lexical statistic — 3 and 3 content words, one shared, 0.33 overlap — and
only one is the figure. A detector that caught the first would catch the second.
Reliability, performance, scale
- 14 degenerate inputs — empty, a 60,000-word single sentence, CJK, RTL, emoji,
null bytes, combining marks, mixed line endings. No crash, no catastrophic
backtracking, worst case 0.55s. register.pyhad no timing on record at all and now has its own section in
bench/performance-results.json: 1,204 documents per second, 0.136s on a
15,201-word document, worst pathological input 0.53s against a 15s CI
threshold, linear cost out to 96,000 words.
One finding left open, recorded rather than closed
No corpus in this repository has a single document at or above the register
pass's own MIN_WORDS of 300. Every rate budget it applies is exercised only by
the repository's own documentation. The code already says these budgets are
argued rather than derived; this is what that costs, and closing it needs a
long-form certified-human corpus.
The writing score is unchanged. The register pass never moves it by design.
275 tests, register --selftest, --gate clean on README, charts and records
current.
Zero Slop v2.8.0
Count the antithesis family the report never had a row for
A 479-word manifesto with five antithesis pairs in it scored 13.4 and printed
Binary contrasts: 1 found, ok. The contrast row was doing what it was built to
do. It was the wrong row.
references/eval.md separates two families and the report only carried one.
- A2, subtractive contrast — "X, not Y", "A rather than B" — judged on
density, budget 6.0 per 1,000.RX_SUBTRACTIVEimplements it correctly. - A1, antithesis pairs — two balanced statements, the second landing the
twist, budget one per piece, and "three or more under 500 words means the
register failed whatever the score said." Nothing measured it. No row, no
budget, no detector, while A2 carried the whole family's name in the report.
antithesis_pair ships the two shapes reachable without a parser: the marked
form at either end of the pair ("Not perfect. Honest.", "The draft was cheap.
The signal it sent was not.") and adjacent isocolon, one verb frame with the
arguments swapped, matched on shared content words with a trailing -s folded
away so let/lets is one frame. Bare subject swap and unmarked reversal stay
the reader's judgment, exactly as references/tells.md says. The budget is
(0.0, 2): one is a device, two is a finding, at every length.
Bare imperatives stop reading as verbless fragments
An imperative is the base form, so it carries none of the inflection or
auxiliaries FINITE_VERB looks for. "Play to win." and "Build durable growth."
were both reported as verbless fragments — two of five hits, so 40% of that
document's one finding was wrong. That check is the one zero-slop.ai puts in its
headline, so the wrong hit was reaching readers.
Measured before shipping
- 4 canonical anchors now counted —
not-perfect-honest,draft-cheap-signal,
isocolon-adapt,detection-fragile. All four were invisible before. - 0 findings across 64 clean files:
must-not-flag,must-not-flag-shape,
community-register,performed-register,must-flag, and the repo's docs. register --selftest,--gateon README, 272 tests.
The writing score is unchanged. The register pass never moves it by design; this
release makes the failure visible, not the number worse.
Release records
slopscore.py is byte-identical this release, so the RAID+ and feature-ablation
numbers are what 2.8.0 produces — both pin the scorer by content hash and both
hashes still match, so only the version label beside them moved.
bench/version-comparison.json is a real re-run against 2.7.7 over 31
interleaved runs, and the README quotes its measured direction verbatim: 1.86%
lower median throughput, machine noise on a loaded laptop, not a speed claim.
Zero Slop v2.7.8
Enterprise hardening release based on v2.7.7. Closes fail-open review paths, strengthens source protection and installer safety, restores complete single-file packaging, refreshes benchmarks and documentation, and adds regression coverage. All 269 Python tests, runtime self-tests, package checks, corpus audits, and website checks passed before release.
Zero Slop 2.7.3
The adversarial four-way audit (Zero Slop vs no-ai-slop vs humanizer vs avoid-ai-writing, three audit lenses, superset verdict) completed with all eight agents and returned FALSE by exactly two findings — both execution misses on checks the skill already carries.
What changed
- The quoted-example exemption now covers only the quoted words. The authored frame around a quotation — the label introducing it, emphasis on that label, the list geometry it sits in — stays in scope for every check. Previously a line was skipped whole if part of it was quoted, which hid bold label-periods from check 69.
- Check 17 (Weasel attribution) now names the unnamed-validator variant: "an external checker", "a third-party audit", "an independent review" — name the tool or the auditor, or flag it.
- Both misses are must-flag fixtures (
label-period-list.md,unnamed-validator.md), soregister.py --recallkeeps them caught. A fresh-eyes reading pass verified both fire correctly with the exemption properly scoped. - The README fixes its own instances: plain colon labels replace the bold label-period list format, and the external checker is named as the AIStoryHub checker.
Scorer hash unchanged (99217fff…); pinned measurement records are relabeled, not remeasured. 240 tests, register gate clean, recall 16/16.