v0.5.3 — DivEye-style surprisal-variance proxies in stylometry
Closes the Category 15 research gap from docs/research/IMPLEMENTATION_TRACE.md. DivEye (arXiv 2509.18880, TMLR 2026) established intra-document surprisal variance — not absolute perplexity — as the primary human signal that survives paraphrase attacks. A real DivEye reading needs a local LM to score per-token log-probs; that stays out of scope for this module. Two deterministic, LM-free proxies now ship instead, priced in as "proxy" in the field names so callers do not overread a single number.
Added
sentence_length_cvinunslop.scripts.stylometry.StyleProfile: coefficient of variation (σ/μ) of sentence word-counts. Scale-invariant burstiness — ~0.3 is AI-flat; 0.5–0.8 is typical human academic.word_length_stdevinStyleProfile: per-sentence mean word-length, σ across the document. Zipf's abbreviation law makes word-length ≈ inverse rarity, so variance in that quantity is a cheap surrogate for surprisal variance.- Voice-match LLM prompt now reports
cvandword_length_stdevas DivEye-style targets, with explicit rewrite guidance. - Six new unit tests in
TestDivEyeProxies(uniform / bursty / scale-invariance / monotone / mixed-register / empty).
Changed
IMPLEMENTATION_TRACE.md: new row maps DivEye research → proxies → tests; Category 15 line in "What research we are NOT using yet" now reads "partial".
CI status
- 397 pytest passing (+1 skipped)
- ruff clean, mypy clean (13 files)
verify_repo.pygreenbenchmarks/check_regression.py: no regression (92.0% AI-ism reduction vs baseline 92.0%)
Install
pip install --upgrade unslop==0.5.3