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.