v0.7.0 brings the Layer B statistical-mark rewrite into the /clean service itself, driven by a configurable, benchmark-tuned strategy (paraphrase@0.8,mlm@0.2). Alongside it: a black-box watermark-stealing module, destructive audio and per-frame video watermark removal, a substantially richer rewrite benchmark, and a stack of hardening, security, and tooling fixes.
Layer B rewriting in the service
/cleannow runs the Layer B rewrite for text after Layer A. The default comes fromconfig/clean_strategy.json; a per-requestoptions.strategyoverrides it, and/cleanrejects with 400 when the required backend isn't configured (#315). Config precedence:--strategy-config>WATERMARKS_CLEAN_STRATEGY_FILE>config/clean_strategy.json.- New
mlmrewrite tactic: mask a fraction of content words and infill withroberta-large— a non-autoregressive local edit, so the output mixes the original token stream with masked-LM predictions (#311). - The
humanizetactic now applies the humanizer-skill pass deterministically (straight quotes, no em/en dashes, filler collapses,utilize→use) and names the human-writer rules in the prompt (#311).rewrite_text.pygained a--strategyCLI path. - Rewrite correctness: Unicode word tokenization in lexical divergence (#305); compare raw margins before rounding and record selection metadata / ranked p-values (#249).
Benchmark
- SynthID recipe search + robust measurement (#280); renamed rewrite vocabulary, cross-input search, and humanize-last ordering (#302); recommend only strategies that still clear after the humanize polish (#307).
- Pangram bulk API as a human-likeness backend (#296); hardened minimal-rewrite-level benchmark with a 30-doc corpus (#257); validated weight grid + widened recipe search (#294); Polish benchmark corpus (#295).
Watermark stealing
- New black-box watermark-stealing module and prompt-corpus downloader (#303); clear stale state on start-over probe failure (#310).
Audio / video / image
- Destructive audio watermark removal chain for silentcipher/AudioSeal/WavMark (tempo + pitch + EQ + low-bitrate re-encode → M4A) (#266).
- Per-frame TrustMark video purification that collapses the temporal vote (#265).
- C2PA content-provenance
uuidbox recognized on MP4/MOV/AVIF/HEIC (#264). - Preserve truncated MP4 tails during stripping (#242); keep the audio re-encode dest distinct from the container-clean dest (#278).
- Skip discarded exiftool output and redundant SynthID in the post-clean scan (#261); degrade cleanly when exiftool can't process a PDF (#281).
- Cap decompressed PNG
zTXt/iTXtat 1 MiB (#308); strip SVG XML DOCTYPE/ENTITY declarations (#288); keep DOCX binary members byte-safe (#314); preserve OOXMLAppVersion(#289).
HTTP service & CLI
/cleanoption to keep exotic spaces, mirroring the CLI (#274);/inspectexposes explicit evidence classes in the suspicious payload (#277); timestamps in HTTP request logs (#256); thread payload bytes into HTTP SynthID scoring andinspect_*to avoid a redundant read-back.clean_file.pygained-q/--quiet/--only-changed(#254).
Skills, plugin & hooks
- Stylometry scoring and detector levers for
clean-user-facing-text(#258); PostToolUse hook launcher made cross-platform (#255); pre-commit hook treats byte-identical clean non-text files as changed (#238).
Audit
audit_dir.pyscans source, docs, and i18n files the router walked past (#284); scans.ts/.tsx/.jsx/.gdand aligns space confidence across formats (#273);audit_website.py --sarifsupport (#194); harden in-place backups, clean-file status, SynthID verdict, truncated ID3v2, and zip routing (#201).
Security
- Remove polynomial ReDoS in data-URI and JSON-LD scans (#306); block HTTP redirects in the SynthID scorer to prevent SSRF (#252).
CI, tooling & docs
- CI fails when optional backend requirements can't resolve (#301); Docker image reports ffmpeg as usable and installs Ghostscript (#272); dependency bumps (cython #299, scipy #298, ruff #297, docker/setup-buildx-action #237).
- Docs: Watermark Detectors section, ETH SRI "Probing SynthID" blog reference, Ecosystem policy (drop ClaudeWatermarks; require listed projects to use this repo) (#292).
A big thanks to everyone who filed issues, reviewed PRs, and ran the harnesses — this release is a team effort. 🎉
Full changelog: README