Files
remove-ai-watermarks/docs/index.md
T
Victor KuznetsovandClaude Opus 5 8fe0b0110f Make the video SynthID operating point measurable and hard to move silently
The shipped profile was certified by one oracle row, but only noise_std was
pinned: long_side and fps -- two thirds of what the verifier was actually shown
-- could move with a green suite. The test now derives the pin from
data/evaluations/video-synthid-oracle.csv, so a default without a certifying row
fails.

The certified profile is a perturbation-to-signal ratio, not a bare noise_std.
sd-vae-ft-mse publishes no scaling_factor key, so 0.18215 comes from the
AutoencoderKL class default under an upper-unbounded diffusers pin. The loader
now gates that value, carries it on VideoVaeRuntime, and passes it into encode
and decode so the validated value is the applied value. video_synthid_sweep.py
loads through the same function: the harness producing the certified rows was
the one path exempt from the gate it exists to feed.

psnr_db is measured against the already-resized frame and before the encoder, so
it cannot see the downscale, the decimation, or the codec, and no in-loop metric
can. scripts/video_fidelity_probe.py scores the delivered file end to end,
streaming the way the engine does and sharing its frame-selection rule rather
than copying it -- a frame-count check cannot catch a rule that reorders frames
without changing how many.

The manifest gains source geometry, vae, track, verbatim verdict and session
fields. The two 2026-07-31 rows keep them empty: they were never recorded and
are not recoverable. Verdicts now have four states, because the verifier's
unclear reading logged as not_detected is the silent regression the manifest
exists to prevent.

docs/video-synthid-quality-research.md records the research behind this: the
noise axis is worth about 2 dB and is nearly exhausted, resolution is the real
prize but is an uncertified destruction axis rather than a free win, and every
proposed autoencoder swap was refuted. First local measurements included.

Verified: engine output is byte-identical before and after the refactor on a
locally built clip, at noise_std 0.00 and 0.15.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 11:17:38 -07:00

2.4 KiB

Documentation

This documentation is split by purpose. Start with the user guides if you want to run the tool. Use the maintainer references only when changing the code.

User guides

Page Use it when
Installation You need the CLI, an optional model backend, or a development environment.
CLI guide You want a command for an image, video metadata or visible marks, a directory, or a specific watermark type.
Python API You want to call the package from Python.
Supported signals You need to know which visible marks, metadata formats, and invisible signals are covered.
Known limitations You need the quality, device, format, or verification boundaries.
Scope, safety, and legal notes You need the intended use and legal context.

Maintainer references

Page Purpose
Module internals Current architecture, invariants, and regression guards by module.
Development Environment setup, dependency recovery, CI behavior, and fixture policy.
Code provenance Required notices for licensed derivative work.
Verification plan Verification methods, completed measurements, and remaining validation gaps.
Release and distribution PyPI, Homebrew, Hugging Face Space, and release workflow.
Watermarking landscape Vendor signals and detection approaches.
SynthID technical reference Mechanism, detector access, robustness, and implications for this project.

Research archive

These pages record experiments and the evidence behind past decisions. They are not command references and may describe prototypes that were later removed. The current behavior is defined by the code, tests, README, and user guides.