One committed example per registered mark: 12 PNG (image registry) and 6 MP4 clips (video registry), generated by scripts/render_visible_examples.py from the committed silhouettes and detector templates -- never from user uploads. The generator self-verifies (exit 1 when a mark misses its own example) and tests/test_visible_examples.py holds both sides to it: registry completeness both ways, per-engine detection on the canonical example, and the shipped temporal selection accepting each clip. Second tranche of measured-but-unregistered candidates parked under scripts/assets/visible-mark-candidates/ with a README recording why none ships yet (positives do not separate from clean negatives): samsung_en, gemini_text, notebooklm, dola, mindvideo, higgsfield, jianying, capcut, zsky, chromastudio, digenai, gendo.
Unregistered visible-mark candidates
Synthetic detection silhouettes for marks that are measured but NOT registered:
none of these separates its positives from clean negatives yet, so shipping them
would attribute and fill corners on content that carries no mark (a false fill
is the worse error). Assets are regenerated by
scripts/render_vendor_silhouettes.py; a candidate is deleted from here on the
day its mark registers (the asset moves to the package assets/).
Measurements below are local calibration snapshots. Candidate pools are
provenance cohorts, not automatically visible-mark positives; comparison controls
are independently selected no-signal images and are not adjudicated negatives.
Each needs capture-solved alphas or vendor-accurate font work before it can
ship; scripts/vendor_mark_calibrate.py is the candidate-detector harness.
| Asset | Mark | Evidence | Result |
|---|---|---|---|
samsung_en_alpha.png |
Samsung Galaxy AI label, English locale ("AI-generated content", bottom-left) | 5 corpus files | POS 0.11-0.30 vs NEG max 0.40 (binary); tophat/gray tried, no separation. The registered Italian engine scores 0.18-0.31 on the same files -- same layout class, wrong glyph template. |
gemini_text_alpha.png |
"Generated with Gemini" text label (bottom-right; the registered gemini mark is the sparkle icon) | 3 corpus files | POS 0.07-0.22 vs NEG max 0.32; coverage gate finds the blob (0.29-0.35) but the Arial silhouette misses Google's letterforms. |
notebooklm_alpha.png |
NotebookLM wordmark (bottom-right) | 12 corpus files | locate geometry not yet fitted; POS max 0.12. |
dola_alpha.png |
DolaAI on images (the video mark is registered) | 12 corpus files | POS 0.11-0.21 vs NEG max 0.30. |
mindvideo_alpha.png |
MindVideo.AI (top-right) | 11 corpus files | POS 0.29-0.32 vs NEG max 0.30 -- borderline overlap, not shippable. |
higgsfield_alpha.png |
HIGGSFIELD AI wordmark (bottom-right; the boxed AI variant shares the cohort) |
5 wordmark files (16 in the boxed-AI OCR cluster) | POS max 0.26 vs NEG max 0.22 -- no separation; the mark may be two-part (wordmark + boxed AI) and needs a composed template. |
jianying_alpha.png |
剪映AI (CapCut's CN sibling, bottom-right) | 2 corpus files | POS 0.29 vs NEG max 0.35. |
capcut_alpha.png |
CapCut AI pill (top-left; likely pill class, not plain text) | 3 corpus files | POS max 0.15 vs NEG max 0.33 -- locate geometry not yet fitted for the pill form. |
zsky_alpha.png |
MADE WITH zsky.ai (bottom-right) | 2 corpus files | POS 0.10 vs NEG max 0.27. |
chromastudio_alpha.png |
ChromaStudio.ai (bottom-right) | 2 corpus files | POS 0.11 vs NEG max 0.29. |
digenai_alpha.png |
DIGENAI (bottom-right) | 3 corpus files (one 2026-07-24 batch) | POS 0.16 vs NEG max 0.31. |
gendo_alpha.png |
GendoAI (bottom-left) | 3 corpus files | POS 0.08 vs NEG max 0.32. |
xinghui_alpha.png |
星绘AI生成 (parked before this set) | -- | prior parking, unchanged. |
qingyan_alpha.png |
清言·AI生成 (parked before this set) | -- | prior parking, unchanged. |
hailuo_alpha.png |
Hailuo AI image wordmark (parked before this set; the VIDEO label is registered) | -- | prior parking, unchanged. |
catlogo_alpha.png |
outline cat-head + AI生成 (parked before this set) | -- | prior parking, unchanged. |