The ignore rule landed with a comment naming the private product, its storage provider, the private rule file, and the size of the customer set. That text is the disclosure the rule exists to prevent, so it says what a public reader needs instead: these trees are local-only and not publication-cleared. `data/research/` gets the same tracked rule as `data/spaces/`. It held 68 GB behind `.git/info/exclude` alone, which no clone has, so a fresh checkout could commit the whole corpus with nothing to stop it, and a test now pins both entries. A first draft of that test also carried a denylist of private identifiers, which published six of them into a tracked file to keep two out, and only its own self-exclusion hid that. The mechanized half is now the one that discloses nothing: no cloud GPU harness under `scripts/`. Reading the ignore entries rather than the file text matters too, because a comment naming `data/research/README.md` satisfied the first assertion with the rule deleted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Repository data
Tracked data is organized by purpose:
data/
fixtures/
provenance/ Real format and provenance fixtures used by tests
(source records live in fixtures/README.md)
visible/ Per-mark example gallery: one synthetic canonical example per
registered mark plus documented provider originals where available
(see fixtures/visible/README.md)
calibration/
<vendor>/ Minimal controlled inputs needed to rebuild detector assets
synthid/
originals/ Canonical provider-oracle fixtures, stored once
manifest.csv Provenance and verification record for each original
full-pipeline-quality.csv
Reusable full-pipeline evaluation selection
evaluations/
engine-selection/
Prompt-matched, publication-cleared AI content matrix for
deterministic auto-engine and watermark benchmark research
fidelity/ Evaluation instructions and hand-verified ground truth
video-synthid-oracle.csv
Reproducible full-clip Gemini SynthID verdicts
image-watermark-examples.csv and
video-watermark-examples.csv are the coverage
indexes for real carriers. They point to each canonical binary instead of
duplicating it and record unsupported gaps and source-specific licensing.
Storage rules
Large local-only research data (the 211 GB private research corpus and the frozen
checkpoints, research corpora, and campaign reports) lives under gitignored
paths documented in data/research/README.md (local-only, like the tree it
describes). data/research/ and data/spaces/ are ignored by the tracked
.gitignore, so a fresh clone carries the rule rather than relying on a local
.git/info/exclude; test_local_only_data_stays_ignored pins both entries.
Worktree .local-eval/ directories are scratch copies; the durable store is
data/research/ in the main checkout.
- Store each binary image once. Evaluation manifests and documentation point to its canonical location.
- Put executable test fixtures in
fixtures/. - Put only the minimal reproducible detector inputs in
calibration/. - Put externally verified SynthID originals in
synthid/originals/and keep both CSV files synchronized. - Keep evaluation outputs outside the repository. Record reproducible
commands, hashes, and oracle verdicts instead of committing another corpus
copy. A small curated before-and-after example may live in
docs/images/when it is part of the public documentation. Local benchmark manifests may point to these canonical inputs or to an untracked corpus; every artifact and reference must carry its SHA-256 digest.evaluations/engine-selection/is the bounded exception for ORIGINAL study inputs: its manifest tracks a prompt-matched OpenAI/Meta content matrix, not generated model outputs or watermark-oracle evidence. - Keep third-party fixture license notices in
licenses/, outside directories that tests enumerate as media inputs. - Runtime detector assets belong in
src/remove_ai_watermarks/assets/. Unregistered research candidates belong inscripts/assets/visible-mark-candidates/so they are not shipped in the wheel.
The source distribution excludes data/; the wheel contains only package
runtime assets.
Video SynthID oracle manifest
evaluations/video-synthid-oracle.csv is the only evidence that the shipped
video removal profile works, so it is also the source of truth for three shipped
defaults: tests/test_video_invisible.py asserts that noise_std, long_side,
and fps together match a row this manifest records as certified. Changing one
of those three without adding the row that certifies it fails the suite. Both
historical rows mark vae as unrecorded: the repository must not infer a model
identity from the current default. Add it to the assertion in the same commit as
the first oracle row that records and verifies one.
| Column | Meaning |
|---|---|
date, source_url, source_sha256 |
Identify the carrier. |
source_width, source_height, source_fps |
Carrier geometry. Without it the actual downscale factor of a row cannot be recovered later. |
duration_seconds, source_verdict |
Clip length submitted and the verifier's reading of the untouched carrier. |
vae, noise_std, long_side, fps, seed |
The run configuration. unrecorded means the historical run did not preserve the VAE identity. |
output_sha256 |
Identifies the exact submitted file. |
output_verdict |
One of detected, not_detected, indeterminate, refused. |
output_verdict_text |
The verifier's wording, verbatim. |
output_detected_range |
Time range the verifier reported for the output. |
track |
visual, audio, both, or empty. The verifier scores tracks separately and this path copies source audio unchanged. |
session_id |
Groups rows submitted in one oracle session, so per-session drift stays visible. |
stratum |
Content class of the carrier, for stratified certification. |
psnr_db, temporal_residual_ratio |
Fidelity measurements. Neither is a watermark verdict. |
Record indeterminate when the verifier answers with its unclear state rather
than a negative: an unclear reading logged as not_detected is exactly the
silent regression this manifest exists to prevent. Leave a field empty when it
was not recorded, and never backfill it with a plausible value.
psnr_db is measured against the already-resized frame and before the encode,
so it excludes the downscale, the decimation, and the codec. Rows stay
comparable to each other only while that definition holds.
The two 2026-07-31 rows predate this schema; their empty fields were never recorded and are not recoverable from the row.