Remove visible and invisible AI watermarks and provenance metadata from images and video. Python library and CLI for SynthID, C2PA, EXIF, IPTC, XMP, and common generative-AI marks.
This report summarizes scanner evidence for wiltodelta/remove-ai-watermarks, a Python project with 5,948 GitHub stars. SynthScan examined 130,382 lines of code across 426 source files, recording 2784 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 23.1 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 2191 finding(s).
Are imports declared and package/API names verified? 358 finding(s).
Are wrappers, guards, and repeated structures necessary? 2273 finding(s).
Which changes need focused human review? 2784 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 2784 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_cpu_offload.py | 64 | def test_loaded_profile_or_preload_fallback_reports_support(self, profile: str, expected: bool) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 67 | def test_cases_cover_every_profile(self) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 70 | def test_the_underscore_spelling_resolves(self) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 73 | def test_the_set_names_a_profile_that_exists(self) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 79 | def test_it_names_the_profile_and_the_flag(self, caplog: pytest.LogCaptureFixture) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 88 | def test_a_profile_that_streams_its_global_stack_is_quiet( | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 95 | def test_a_run_that_did_not_ask_for_offload_is_quiet(self, caplog: pytest.LogCaptureFixture) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 100 | def test_preloaded_auto_uses_qwen_offload_without_warning( | CODE |
| LOW | tests/test_cpu_offload.py | 122 | def test_the_load_path_asks_before_building_the_stack(self, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_cpu_offload.py | 161 | def test_request_wins_and_the_card_decides_otherwise( | CODE |
| LOW | tests/test_cpu_offload.py | 184 | def enable_sequential_cpu_offload(self, *, device: str, gpu_id: int | None = None) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 219 | def test_a_small_card_streams_the_fused_stack_instead_of_moving_it(self, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 224 | def test_a_large_card_keeps_the_stack_resident_as_before(self, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 228 | def test_cpu_offload_streams_even_on_a_large_card(self, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/test_cpu_offload.py | 235 | def test_streaming_uses_the_current_cuda_device( | CODE |
| LOW | tests/test_cpu_offload.py | 247 | def test_cpu_offload_reaches_the_sdxl_stack(self, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/test_liblib_engine.py | 53 | def _compose_with_compact_pill(w: int = 1200, h: int = 1200) -> np.ndarray: | CODE |
| LOW⚡ | tests/test_liblib_engine.py | 62 | def test_box_horizontally_centered(self): | CODE |
| LOW⚡ | tests/test_liblib_engine.py | 69 | def test_box_scales_with_width(self): | CODE |
| LOW⚡ | tests/test_liblib_engine.py | 80 | def test_strict_only_no_provenance_relaxation(self): | CODE |
| LOW⚡ | tests/test_liblib_engine.py | 83 | def test_gate_above_clean_arm_max(self): | CODE |
| LOW⚡ | tests/test_liblib_engine.py | 87 | def test_small_image_size_floor(self): | CODE |
| LOW⚡ | tests/test_liblib_engine.py | 104 | def test_detects_composed_mark(self): | CODE |
| LOW⚡ | tests/test_liblib_engine.py | 110 | def test_clean_frame_stays_quiet(self): | CODE |
| LOW⚡ | tests/test_liblib_engine.py | 115 | def test_mask_covers_logo_and_wordmark(self): | CODE |
| LOW | tests/test_liblib_engine.py | 128 | def test_mask_also_covers_a_compact_top_left_pill(self): | CODE |
| LOW | tests/test_liblib_engine.py | 144 | def test_current_provider_pill_is_removed_with_liblib_metadata(self): | CODE |
| LOW | tests/test_liblib_engine.py | 160 | def test_no_mask_on_clean_frame(self): | CODE |
| LOW | tests/test_liblib_engine.py | 165 | def test_force_masks_the_whole_locate_box_on_a_clean_frame(self): | CODE |
| LOW⚡ | tests/test_classify.py | 164 | def test_definitely_is_the_and_of_ridge_and_mlp() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 171 | def test_only_definitely_is_ai() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 177 | def test_provider_requires_margin_over_no_ai() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 184 | def test_bytedance_names_the_shared_bytedance_renderer_lineage() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 192 | def test_older_snapshots_without_bytedance_keep_working() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 212 | def test_definitely_plus_openai_is_ai_openai() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 221 | def test_definitely_without_provider_scores_stays_ai_with_no_provider() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 227 | def test_definitely_plus_no_ai_head_has_no_provider() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 233 | def test_possibly_does_not_run_provider() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 240 | def test_likely_human_does_not_run_provider() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 247 | def test_shipped_receipt_gate_asset_matches_the_pinned_threshold() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 255 | def test_receipt_gate_downgrades_definitely_to_unknown() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 262 | def test_receipt_gate_below_threshold_keeps_ai_and_provider() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 277 | def test_receipt_gate_never_touches_non_definitely(ridge: float, mlp: float, expected: str) -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 282 | def test_receipt_gate_score_is_deterministic_and_bounded() -> None: | CODE |
| LOW⚡ | tests/test_classify.py | 289 | def test_receipt_gate_prefers_the_weights_directory(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_classify.py | 56 | def test_hub_snapshot_is_the_freeze_revision() -> None: | CODE |
| LOW | tests/test_classify.py | 61 | def test_runtime_requests_only_the_selected_backend_model(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_classify.py | 97 | def test_backend_requires_its_own_model_file(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_classify.py | 108 | def test_onnx_backend_is_cpu_only() -> None: | CODE |
| LOW | tests/test_classify.py | 118 | def test_onnx_backend_names_its_install_extra(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_classify.py | 129 | def test_embed_dispatches_to_the_selected_backend(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_classify.py | 144 | def test_shipped_operating_point_matches_the_runtime_defaults() -> None: | CODE |
| LOW | tests/test_classify.py | 315 | def test_receipt_gate_stable_name_beats_the_legacy_spelling(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_classify.py | 351 | def test_receipt_threshold_defaults_to_the_artifact_value() -> None: | CODE |
| LOW | tests/test_classify.py | 368 | def test_receipt_gate_falls_back_to_the_package_asset() -> None: | CODE |
| LOW | tests/test_classify.py | 379 | def _patch_definitely_runtime(monkeypatch: pytest.MonkeyPatch, *, forensic_calls: list[int]) -> None: | CODE |
| LOW | tests/test_classify.py | 428 | def test_provenance_paths_do_not_import_classify(tmp_path: Path, caller: str) -> None: | CODE |
| LOW | tests/test_classify.py | 484 | def test_operating_point_prefers_the_sidecar(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_classify.py | 494 | def test_missing_extra_raises_the_install_hint(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: | CODE |
| LOW | tests/test_classify.py | 509 | def test_cli_classify_without_extra_prints_the_install_hint(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: | CODE |
| 1972 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_cpu_offload.py | 13 | CODE | |
| LOW | tests/test_liblib_engine.py | 9 | CODE | |
| LOW | tests/test_classify.py | 3 | CODE | |
| LOW | tests/test_gemini_engine.py | 3 | CODE | |
| LOW | tests/test_metadata_internals.py | 4 | CODE | |
| LOW | tests/test_synthid_ensemble_detector.py | 1 | CODE | |
| LOW | tests/test_watermark_benchmark_audio_cohort.py | 3 | CODE | |
| LOW | tests/test_maintenance.py | 3 | CODE | |
| LOW | tests/test_pill_engine.py | 7 | CODE | |
| LOW | tests/test_c2pa_registry_sync.py | 3 | CODE | |
| LOW | tests/test_tc260_producers.py | 3 | CODE | |
| LOW | tests/conftest.py | 3 | CODE | |
| LOW | tests/test_baidu_engine.py | 11 | CODE | |
| LOW | tests/test_publish_photo_classify_hf.py | 3 | CODE | |
| LOW | tests/test_forensic_metadata.py | 3 | CODE | |
| LOW | tests/test_synthid_research_manifest.py | 3 | CODE | |
| LOW | tests/test_synthid_pixel_probe.py | 9 | CODE | |
| LOW | tests/test_perth_oracle.py | 3 | CODE | |
| LOW | tests/test_synthid_detector.py | 3 | CODE | |
| LOW | tests/test_registered_mark_calibrate.py | 3 | CODE | |
| LOW | tests/test_kling_engine.py | 9 | CODE | |
| LOW | tests/test_publish_source_classify_hf.py | 3 | CODE | |
| LOW | tests/test_packaging.py | 3 | CODE | |
| LOW | tests/test_cli_robustness.py | 20 | CODE | |
| LOW | tests/test_watermark_benchmark_report.py | 3 | CODE | |
| LOW | tests/test_openai_provenance.py | 3 | CODE | |
| LOW | tests/test_provider_oracles.py | 3 | CODE | |
| LOW | tests/test_jimeng_engine.py | 8 | CODE | |
| LOW | tests/test_security_clamp.py | 17 | CODE | |
| LOW | tests/test_source_pipeline_classifier.py | 3 | CODE | |
| LOW | tests/test_microsoft_engine.py | 9 | CODE | |
| LOW | tests/test_designer_synthid_suppression.py | 11 | CODE | |
| LOW | tests/test_trustmark_detector.py | 9 | CODE | |
| LOW | tests/test_video_synthid_sweep.py | 3 | CODE | |
| LOW | tests/test_watermark_benchmark_real_cohort.py | 3 | CODE | |
| LOW | tests/test_synthid_corpus.py | 3 | CODE | |
| LOW | tests/test_source_classify.py | 3 | CODE | |
| LOW | tests/test_synthid_pixel_attack.py | 1 | CODE | |
| LOW | tests/test_tiling.py | 9 | CODE | |
| LOW | tests/test_synthid_runtime_expert_scores.py | 1 | CODE | |
| LOW | tests/test_forensic_124d.py | 3 | CODE | |
| LOW | tests/test_video_temporal.py | 3 | CODE | |
| LOW | tests/test_spectral_pipeline_probe.py | 3 | CODE | |
| LOW | tests/test_synthid_research_inventory.py | 3 | CODE | |
| LOW | tests/test_synthid_routed_detector.py | 1 | CODE | |
| LOW | tests/test_generic_ai_label_engine.py | 11 | CODE | |
| LOW | tests/test_qwen_zimage_pipeline.py | 3 | CODE | |
| LOW | tests/test_fidelity_matching.py | 12 | CODE | |
| LOW | tests/test_watermark_registry.py | 3 | CODE | |
| LOW | tests/test_invisible_watermark.py | 7 | CODE | |
| LOW | tests/test_visible_examples.py | 14 | CODE | |
| LOW | tests/test_region_eraser.py | 3 | CODE | |
| LOW | tests/test_video_fidelity_probe.py | 8 | CODE | |
| LOW | tests/test_evaluation_audit_regressions.py | 3 | CODE | |
| LOW | tests/test_synthid_periodic_tile_ablation.py | 1 | CODE | |
| LOW | tests/test_synthid_confound_probe.py | 3 | CODE | |
| LOW | tests/test_metadata.py | 3 | CODE | |
| LOW | tests/test_synthid_ensemble_attack.py | 1 | CODE | |
| LOW | tests/test_video.py | 3 | CODE | |
| LOW | tests/test_synthid_routed_expert_bank.py | 1 | CODE | |
| 293 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_gemini_engine.py | 20 | # ── WatermarkSize / config helpers ────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_gemini_engine.py | 59 | # ── Alpha map ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_gemini_engine.py | 89 | # ── GeminiEngine ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_gemini_engine.py | 113 | # ── Removal: localize -> fill ─────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_gemini_engine.py | 171 | # ── Detection ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_metadata_internals.py | 47 | # ── Constants ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_metadata_internals.py | 81 | # ── Extractor ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_metadata_internals.py | 582 | # ── ISOBMFF (AVIF / HEIF / JPEG-XL container stripping) ────────────── | COMMENT |
| MEDIUM | tests/test_metadata_internals.py | 118 | # ── Cleaner ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_metadata_internals.py | 137 | # ── C2PA ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_metadata_internals.py | 472 | # ── CBOR text extraction (parser internals) ───────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_metadata.py | 69 | # ── Key detection ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_metadata.py | 97 | # ── has_ai_metadata / get_ai_metadata ─────────────────────────────── | COMMENT |
| MEDIUM | tests/test_metadata.py | 551 | # ── SynthID-source detection (metadata proxy) ──────────────────────── | COMMENT |
| MEDIUM | tests/test_metadata.py | 648 | # ── remove_ai_metadata ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_doubao_engine.py | 61 | # ── Detection: alpha-template NCC ─────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_doubao_engine.py | 164 | # ── Alpha asset + footprint mask + localize -> fill removal ───────── | COMMENT |
| MEDIUM⚡ | tests/test_identify.py | 1123 | # ── Local diffusion parameters (Stable Diffusion / ComfyUI) ───────── | COMMENT |
| MEDIUM⚡ | tests/test_identify.py | 1229 | # ── Visible-sparkle fallback (mocked detector) ────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_identify.py | 1435 | # ── Caveats and serialization ─────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_identify.py | 369 | # ── Pure attribution logic (no file IO) ───────────────────────────── | COMMENT |
| MEDIUM | tests/test_identify.py | 793 | # ── End-to-end verdicts on real fixtures ──────────────────────────── | COMMENT |
| MEDIUM | tests/test_identify.py | 1157 | # ── China TC260 AIGC label as a PNG text chunk (Doubao) ───────────── | COMMENT |
| MEDIUM | tests/test_identify.py | 1184 | # ── Higgsfield job marker, hf-job-id (medium confidence) ─────────── | COMMENT |
| MEDIUM | tests/test_identify.py | 1732 | # ── Open invisible watermark (SD/SDXL/FLUX) integration ───────────── | COMMENT |
| MEDIUM | tests/test_identify.py | 1799 | # ── Integrity clashes (contradictions between independent signals) ────── | COMMENT |
| MEDIUM⚡ | tests/test_platform.py | 31 | # ── Device detection ──────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_platform.py | 404 | # ── Format utilities ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_platform.py | 442 | # ── Availability checks ──────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_platform.py | 488 | # ── Platform-specific path handling ───────────────────────────────── | COMMENT |
| MEDIUM | scripts/render_visible_examples.py | 251 | # ── Video mark examples ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/fidelity_metrics.py | 73 | # ── helpers ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/fidelity_metrics.py | 95 | # ── text: PaddleOCR defaults ───────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/fidelity_metrics.py | 175 | # ── face: detection + ArcFace + texture ────────────────────────────── | COMMENT |
| MEDIUM | scripts/fidelity_metrics.py | 247 | # ── whole image: LPIPS / SSIM / PSNR ───────────────────────────────── | COMMENT |
| MEDIUM | scripts/fidelity_metrics.py | 278 | # ── reporting ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/fidelity_metrics.py | 289 | # ── CLI ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/metadata.py | 38 | # ── Known AI metadata keys ────────────────────────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/metadata.py | 2140 | # ── Per-file probe memoization ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/metadata.py | 2224 | # ── Shared with the portable metadata record ──────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/image_io.py | 148 | # ── Display-tag carry across re-encodes (issue #98) ───────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/identify.py | 1235 | # ── C2PA Content Credentials ──────────────────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/identify.py | 1354 | # ── SynthID provenance evidence ───────────────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/identify.py | 1500 | # ── Local diffusion parameters (Stable Diffusion / ComfyUI) ────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/identify.py | 1519 | # ── xAI / Grok signature scheme ─────────────────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/identify.py | 1529 | # ── Higgsfield job marker (hf-job-id PNG text chunk) ───────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/identify.py | 1543 | # ── Samsung Galaxy AI editing marker (genAIType) ───────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/identify.py | 1559 | # ── Open invisible watermark (SD / SDXL / FLUX, dwtDct) ────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/identify.py | 1578 | # ── Verdict so far (metadata + embedded watermark) ────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/humanizer.py | 91 | # ── Adaptive polish (target the input's detail level; spare text) ────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/_text_mark_engine.py | 311 | # ── Templates (delegate to the asset-keyed module cache) ──────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/_text_mark_engine.py | 358 | # ── Locate ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/_text_mark_engine.py | 552 | # ── Mask ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/_text_mark_engine.py | 596 | # ── Detect ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/remove_ai_watermarks/_text_mark_engine.py | 702 | # ── Inpaint footprint (for the inpaint-fallback removal path) ──────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_metadata_internals.py | 1057 | def outcome(fn): | CODE |
| LOW | tests/test_metadata_internals.py | 1060 | except Exception as exc: | CODE |
| LOW | tests/test_pill_engine.py | 23 | except Exception: | CODE |
| MEDIUM | tests/test_pill_engine.py | 19 | def _font_ok() -> bool: | CODE |
| LOW⚡ | tests/test_image_io.py | 182 | except Exception: | CODE |
| LOW | tests/test_image_io.py | 135 | except Exception: | CODE |
| LOW | tests/test_video_invisible.py | 55 | except Exception as exc: # pragma: no cover - mutation cleanup path | CODE |
| MEDIUM | tests/test_video_invisible.py | 51 | def write_frames() -> None: | CODE |
| LOW | scripts/detection_timing.py | 123 | except Exception: # unreadable or an unsupported container | CODE |
| LOW | scripts/detection_timing.py | 170 | except Exception as exc: | CODE |
| LOW | scripts/detection_timing.py | 179 | except Exception as exc: | CODE |
| LOW | scripts/vendor_mark_calibrate.py | 101 | except Exception: | CODE |
| LOW | scripts/vendor_mark_calibrate.py | 159 | except Exception: # noqa: S112 -- one bad file must not kill the sweep | CODE |
| LOW | scripts/vendor_mark_calibrate.py | 329 | except Exception: # noqa: S112 -- one bad file must not kill the fit | CODE |
| LOW | scripts/vendor_mark_calibrate.py | 464 | except Exception: | CODE |
| LOW | scripts/vendor_mark_calibrate.py | 504 | except Exception: # noqa: S112 -- one bad file must not kill the pool | CODE |
| LOW | scripts/pill_gate_audit.py | 93 | except Exception as e: | CODE |
| LOW | scripts/pill_gate_audit.py | 172 | except Exception: # noqa: S112 | CODE |
| LOW | scripts/pill_gate_audit.py | 188 | except Exception: # noqa: S112 | CODE |
| LOW | scripts/pill_gate_audit.py | 207 | except Exception: # noqa: S112 | CODE |
| LOW | scripts/record_parity_audit.py | 93 | except Exception as exc: | CODE |
| LOW | scripts/record_parity_audit.py | 98 | except Exception as exc: | CODE |
| LOW | scripts/fill_quality.py | 102 | except Exception: # noqa: S112 -- an unreadable local file is not a candidate | CODE |
| LOW | scripts/fill_quality.py | 154 | except Exception as e: | CODE |
| LOW | scripts/visible_groundtruth.py | 68 | except Exception: | CODE |
| LOW | scripts/synthid_corpus.py | 97 | except Exception: # sips missing/odd output; dims stay unknown | CODE |
| LOW | scripts/synthid_corpus.py | 109 | except Exception as exc: # unknown/user formats can raise non-OSError; see CLAUDE.md | CODE |
| LOW | scripts/visible_removal_audit.py | 109 | except Exception as exc: | CODE |
| LOW | scripts/openai_provenance_check.py | 70 | except Exception as exc: | CODE |
| LOW | scripts/synthid_research_manifest.py | 328 | except Exception as exc: # Pillow intentionally accepts many user-controlled formats. | CODE |
| LOW | scripts/detector_response.py | 198 | except Exception: # noqa: S112 -- tolerate a torn last line | CODE |
| LOW | scripts/detector_response.py | 212 | except Exception as e: # a crashed source must not kill the sweep | CODE |
| LOW | scripts/visible_positives.py | 110 | except Exception as e: | CODE |
| LOW | scripts/metadata_removal_audit.py | 72 | except Exception: | CODE |
| LOW⚡ | scripts/metadata_removal_audit.py | 100 | except Exception as exc: | CODE |
| LOW⚡ | scripts/metadata_removal_audit.py | 110 | except Exception as exc: | CODE |
| LOW⚡ | scripts/metadata_removal_audit.py | 118 | except Exception as exc: | CODE |
| LOW | scripts/metadata_removal_audit.py | 140 | except Exception: # noqa: S112 -- skip an unreadable identify JSON, not security-relevant | CODE |
| LOW | scripts/resource_ceilings.py | 76 | except Exception as e: | CODE |
| LOW | scripts/corpus_gap_scan.py | 199 | except Exception as exc: | CODE |
| LOW | scripts/ladder_headroom.py | 135 | except Exception: | CODE |
| LOW | scripts/ladder_headroom.py | 147 | except Exception: | CODE |
| LOW | scripts/ladder_headroom.py | 219 | except Exception: # noqa: S112 -- one bad file must not kill the sweep | CODE |
| LOW | scripts/vendor_cohort_harvest.py | 76 | except Exception: | CODE |
| LOW | scripts/vendor_cohort_harvest.py | 116 | except Exception: # noqa: S112 -- one bad file must not kill the scan | CODE |
| LOW | scripts/smoke_matrix.py | 140 | except Exception as e: | CODE |
| LOW | scripts/smoke_matrix.py | 165 | except Exception as e: | CODE |
| LOW | scripts/smoke_matrix.py | 404 | except Exception: | CODE |
| LOW | scripts/sidecar_regression.py | 167 | except Exception as e: # a corrupt sidecar must not kill the sweep | CODE |
| LOW | scripts/sidecar_regression.py | 182 | except Exception as e: # record and continue; a crash IS a finding | CODE |
| LOW | scripts/sidecar_regression.py | 221 | except Exception: # noqa: S112 -- tolerate a torn last line from an interrupted run | CODE |
| LOW | scripts/watermark_benchmark.py | 792 | except Exception as exc: | CODE |
| LOW⚡ | scripts/cjk_tail_probe.py | 128 | except Exception: | CODE |
| LOW⚡ | scripts/cjk_tail_probe.py | 136 | except Exception: | CODE |
| LOW⚡ | scripts/cjk_tail_probe.py | 144 | except Exception: | CODE |
| LOW | scripts/cjk_tail_probe.py | 196 | except Exception: # noqa: S112 -- one bad file must not kill the sweep | CODE |
| LOW | scripts/controlnet_sweep.py | 279 | except Exception as exc: | CODE |
| LOW | src/remove_ai_watermarks/pixel_evidence.py | 170 | except Exception as exc: | CODE |
| LOW | src/remove_ai_watermarks/pixel_evidence.py | 284 | except Exception as exc: | CODE |
| LOW⚡ | src/remove_ai_watermarks/pixel_evidence.py | 426 | except Exception as exc: | CODE |
| 75 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_synthid_research_manifest.py | 255 | CODE | |
| LOW | tests/test_pixel_evidence.py | 167 | CODE | |
| LOW | tests/test_evaluation_data.py | 14 | CODE | |
| LOW | scripts/calibrate_generic_ai_label.py | 62 | CODE | |
| LOW | scripts/synthid_color_space_probe.py | 66 | CODE | |
| LOW | scripts/vendor_mark_calibrate.py | 470 | CODE | |
| LOW | scripts/skill_eval.py | 107 | CODE | |
| LOW | scripts/skill_eval.py | 194 | CODE | |
| LOW | scripts/pill_gate_audit.py | 102 | CODE | |
| LOW | scripts/pill_gate_audit.py | 157 | CODE | |
| LOW | scripts/selective_text_restoration.py | 344 | CODE | |
| LOW | scripts/spectral_pipeline_probe.py | 98 | CODE | |
| LOW | scripts/analyze_engine_selection_study.py | 52 | CODE | |
| LOW | scripts/synthid_conformal_cascade.py | 137 | CODE | |
| LOW | scripts/synthid_affine_lattice_probe.py | 561 | CODE | |
| LOW | scripts/synthid_affine_lattice_probe.py | 1454 | CODE | |
| LOW | scripts/audioseal_experiment.py | 712 | CODE | |
| LOW | scripts/audioseal_experiment.py | 719 | CODE | |
| LOW | scripts/fill_quality.py | 108 | CODE | |
| LOW | scripts/visible_groundtruth.py | 80 | CODE | |
| LOW | scripts/provider_oracle_web.py | 246 | CODE | |
| LOW | scripts/synthid_corpus.py | 77 | CODE | |
| LOW | scripts/visible_removal_audit.py | 75 | CODE | |
| LOW | scripts/visible_eval.py | 70 | CODE | |
| LOW | scripts/render_visible_examples.py | 261 | CODE | |
| LOW | scripts/detector_response.py | 129 | CODE | |
| LOW | scripts/detector_response.py | 176 | CODE | |
| LOW | scripts/synthid_periodic_tile_ablation.py | 100 | CODE | |
| LOW | scripts/real_examples_e2e.py | 101 | CODE | |
| LOW | scripts/metadata_removal_audit.py | 180 | CODE | |
| LOW | scripts/detection_timing_report.py | 147 | CODE | |
| LOW | scripts/fidelity_metrics.py | 137 | CODE | |
| LOW | scripts/fidelity_metrics.py | 324 | CODE | |
| LOW | scripts/corpus_gap_scan.py | 321 | CODE | |
| LOW | scripts/watermark_benchmark_report.py | 127 | CODE | |
| LOW | scripts/watermark_benchmark_report.py | 391 | CODE | |
| LOW | scripts/synthid_confound_probe.py | 101 | CODE | |
| LOW | scripts/synthid_oracle_batch.py | 321 | CODE | |
| LOW | scripts/sidecar_regression.py | 188 | CODE | |
| LOW | scripts/controlnet_sweep.py | 225 | CODE | |
| LOW | src/remove_ai_watermarks/video_invisible.py | 318 | CODE | |
| LOW | src/remove_ai_watermarks/video_invisible.py | 353 | CODE | |
| LOW | src/remove_ai_watermarks/metadata.py | 249 | CODE | |
| LOW | src/remove_ai_watermarks/metadata.py | 302 | CODE | |
| LOW | src/remove_ai_watermarks/metadata.py | 477 | CODE | |
| LOW | src/remove_ai_watermarks/metadata.py | 973 | CODE | |
| LOW | src/remove_ai_watermarks/metadata.py | 1014 | CODE | |
| LOW | src/remove_ai_watermarks/metadata.py | 1200 | CODE | |
| LOW | src/remove_ai_watermarks/metadata.py | 1343 | CODE | |
| LOW | src/remove_ai_watermarks/metadata.py | 1902 | CODE | |
| LOW | src/remove_ai_watermarks/image_io.py | 202 | CODE | |
| LOW | src/remove_ai_watermarks/image_io.py | 409 | CODE | |
| LOW | src/remove_ai_watermarks/metadata_record.py | 339 | CODE | |
| LOW | src/remove_ai_watermarks/video_visible.py | 460 | CODE | |
| LOW | src/remove_ai_watermarks/video_visible.py | 1481 | CODE | |
| LOW | src/remove_ai_watermarks/cli.py | 1399 | CODE | |
| LOW | src/remove_ai_watermarks/forensic_metadata.py | 212 | CODE | |
| LOW | src/remove_ai_watermarks/forensic_metadata.py | 265 | CODE | |
| LOW | src/remove_ai_watermarks/forensic_metadata.py | 328 | CODE | |
| LOW | src/remove_ai_watermarks/forensic_metadata.py | 415 | CODE | |
| 26 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_jimeng_engine.py | 0 | a bright blob is not the glyph shape -> low correlation, not detected. | STRING |
| HIGH | tests/test_generic_ai_label_engine.py | 0 | a bright blob is not the glyph shape -> low correlation, not detected. | STRING |
| HIGH | tests/test_doubao_engine.py | 0 | a bright blob is not the glyph shape -> low correlation, not detected. | STRING |
| HIGH | tests/test_samsung_engine.py | 0 | a bright blob is not the glyph shape -> low correlation, not detected. | STRING |
| HIGH | tests/test_openart_engine.py | 0 | a bright blob is not the glyph shape -> low correlation, not detected. | STRING |
| HIGH | tests/test_jimeng_engine.py | 0 | the rendered glyph silhouette correlates with itself, not with a filled block. | STRING |
| HIGH | tests/test_doubao_engine.py | 0 | the rendered glyph silhouette correlates with itself, not with a filled block. | STRING |
| HIGH | tests/test_samsung_engine.py | 0 | the rendered glyph silhouette correlates with itself, not with a filled block. | STRING |
| HIGH | tests/test_openart_engine.py | 0 | the rendered glyph silhouette correlates with itself, not with a filled block. | STRING |
| HIGH | tests/test_generic_ai_label_engine.py | 0 | the rendered glyph silhouette correlates with itself, not with a filled block. | STRING |
| HIGH | tests/test_jimeng_engine.py | 0 | footprint_mask must not crash on degenerate sizes or non-3-channel inputs. | STRING |
| HIGH | tests/test_generic_ai_label_engine.py | 0 | footprint_mask must not crash on degenerate sizes or non-3-channel inputs. | STRING |
| HIGH | tests/test_doubao_engine.py | 0 | footprint_mask must not crash on degenerate sizes or non-3-channel inputs. | STRING |
| HIGH | tests/test_samsung_engine.py | 0 | footprint_mask must not crash on degenerate sizes or non-3-channel inputs. | STRING |
| HIGH | tests/test_openart_engine.py | 0 | footprint_mask must not crash on degenerate sizes or non-3-channel inputs. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_metadata_internals.py | 555 | assert "synthid_watermark" not in info # procedural, not AI-generated | CODE |
| HIGH⚡ | tests/test_metadata.py | 2209 | # verdict must stay 'unknown', not 'AI-generated'. | COMMENT |
| HIGH⚡ | tests/test_identify.py | 2001 | # TC260 AIGC label) -- a genuine camera capture is not AI-generated, so | COMMENT |
| HIGH | tests/test_identify.py | 2128 | # A JUMBF-wrapped manifest from a SynthID-pairing signer on AI-generated content: | COMMENT |
| HIGH | docs/ai-generated-image-classifiers.md | 1 | # AI-generated image classifiers (research) | COMMENT |
| HIGH | docs/ai-generated-image-classifiers.md | 203 | [`Awesome-AI-generated-Image-Detection`](https://github.com/nxZhai/Awesome-AI-generated-Image-Detection). | CODE |
| HIGH | src/remove_ai_watermarks/metadata.py | 749 | # without proving the whole image is AI-generated. Scoped to the Samsung editor | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pyproject.toml | 101 | # Generation`` (its ``nucleusmoe_image`` pipeline), which only exists in | COMMENT |
| LOW | scripts/selective_text_restoration.py | 1 | # /// script | COMMENT |
| LOW | scripts/infer_text_lines.py | 1 | # /// script | COMMENT |
| LOW | scripts/render_vendor_silhouettes.py | 41 | # Yuanbao's stamp is a TWO-LINE block (元宝 over AI生成), left-aligned, tightly | COMMENT |
| LOW | scripts/fidelity_metrics.py | 1 | # /// script | COMMENT |
| LOW | scripts/qwen_scrub_prototype.py | 1 | # /// script | COMMENT |
| LOW | skills/remove-ai-watermarks/scripts/probe.py | 21 | from pathlib import Path | COMMENT |
| LOW | src/remove_ai_watermarks/jimeng_engine.py | 41 | TOPHAT_DELTA = 12 | COMMENT |
| LOW | src/remove_ai_watermarks/generic_ai_label_engine.py | 81 | WM_HEIGHT_FRAC = 0.10 | COMMENT |
| LOW | src/remove_ai_watermarks/generic_ai_label_engine.py | 101 | # 0.40 0.10 67% 96% 24 0 1 (qwen) | COMMENT |
| LOW | src/remove_ai_watermarks/generic_ai_label_engine.py | 121 | # to relax into safely. | COMMENT |
| LOW | src/remove_ai_watermarks/metadata.py | 101 | return C2PA_UUID in data or (b"jumb" in data and b"c2pa" in data.lower()) | COMMENT |
| LOW | src/remove_ai_watermarks/metadata.py | 2001 | return output_path | COMMENT |
| LOW | src/remove_ai_watermarks/metadata_record.py | 61 | # cannot disagree about a chunk type inside it. A smaller window would be cheaper but | COMMENT |
| LOW | src/remove_ai_watermarks/classify.py | 41 | # directory); the package asset is the fallback for pre-gate freezes. | COMMENT |
| LOW | src/remove_ai_watermarks/watermark_registry.py | 61 | # quality installed model -- LaMa, else MI-GAN, else cv2 (see ``resolve_backend``); the | COMMENT |
| LOW | src/remove_ai_watermarks/watermark_registry.py | 81 | # who can see the mark is better served by pointing at it (``erase --region``) or naming | COMMENT |
| LOW | src/remove_ai_watermarks/watermark_registry.py | 281 | # Which provenance regime this mark's vendor labels under, or None. "tc260" means | COMMENT |
| LOW | src/remove_ai_watermarks/watermark_registry.py | 381 | COMMENT | |
| LOW | src/remove_ai_watermarks/watermark_registry.py | 401 | COMMENT | |
| LOW | src/remove_ai_watermarks/watermark_registry.py | 421 | # band precision 95% CI population | COMMENT |
| LOW | src/remove_ai_watermarks/api.py | 741 | img_path, | COMMENT |
| LOW | src/remove_ai_watermarks/doubao_engine.py | 61 | # fires. Calibrated on the 240-image unbiased recall sample, full auto path: | COMMENT |
| LOW | src/remove_ai_watermarks/identify.py | 501 | """Aggregated provenance verdict for one image.""" | COMMENT |
| LOW | src/remove_ai_watermarks/identify.py | 521 | # confidence string. | COMMENT |
| LOW | src/remove_ai_watermarks/identify.py | 621 | byte scan recovers the same attribution (e.g. "Imagen", "DALL-E"). | COMMENT |
| LOW | src/remove_ai_watermarks/identify.py | 901 | return None | COMMENT |
| LOW | src/remove_ai_watermarks/identify.py | 1001 | COMMENT | |
| LOW | src/remove_ai_watermarks/identify.py | 1221 | # invisible watermark are deliberately excluded: the former is a fuzzy visual | COMMENT |
| LOW | src/remove_ai_watermarks/identify.py | 1241 | # by substring made the displayed reason a second, looser rule than the verdict. | COMMENT |
| LOW | src/remove_ai_watermarks/identify.py | 1341 | # when the embedded manifest is stripped, so the credentials stay recoverable | COMMENT |
| LOW | src/remove_ai_watermarks/identify.py | 1361 | # file, one reading a portable record -- and a rule that lives in only one of them | COMMENT |
| LOW | src/remove_ai_watermarks/qwen_engine.py | 81 | DETECT_MIN_COVERAGE = 0.04 # unused by the tophat front-end (kept for config parity) | COMMENT |
| LOW | src/remove_ai_watermarks/_text_mark_engine.py | 41 | # genuine mark while killing the icon/thumbnail noise band (<=96 px). Detection is | COMMENT |
| LOW | src/remove_ai_watermarks/_text_mark_engine.py | 61 | # [0.340,0.400) 91% 73-98% 23 | COMMENT |
| LOW | src/remove_ai_watermarks/_text_mark_engine.py | 101 | # glyph appearance | COMMENT |
| LOW | src/remove_ai_watermarks/_text_mark_engine.py | 121 | # TextMarkEngine.tophat_response for the measurement that motivated the split. | COMMENT |
| LOW | src/remove_ai_watermarks/kling_engine.py | 81 | TOPHAT_DELTA = 12 | COMMENT |
| LOW | src/remove_ai_watermarks/kling_engine.py | 121 | alpha_height_frac=_ALPHA_HEIGHT_FRAC, | COMMENT |
| LOW | …c/remove_ai_watermarks/_internal/watermark_profiles.py | 41 | # ``pip install remove-ai-watermarks[qwen-zimage]`` dies with "no matches found" | COMMENT |
| LOW | …c/remove_ai_watermarks/_internal/watermark_profiles.py | 61 | AUTO_PROFILE: False, | COMMENT |
| LOW | …c/remove_ai_watermarks/_internal/watermark_profiles.py | 81 | COMMENT | |
| LOW | …c/remove_ai_watermarks/_internal/watermark_profiles.py | 101 | # carriers, so 0.35 is the content-agnostic operating floor. | COMMENT |
| LOW | …c/remove_ai_watermarks/_internal/watermark_profiles.py | 121 | COMMENT | |
| LOW | …c/remove_ai_watermarks/_internal/watermark_profiles.py | 141 | COMMENT | |
| LOW | …c/remove_ai_watermarks/_internal/watermark_profiles.py | 161 | # Qwen cleared both withheld carriers at its then-existing 0.07675 operating | COMMENT |
| LOW | src/remove_ai_watermarks/_internal/constants.py | 181 | # 2026-09-24: issuer "RUNWAY AI, INC.", software agent "Runway Image/Video | COMMENT |
| LOW | src/remove_ai_watermarks/_internal/isobmff.py | 61 | # byte-order ambiguity and stays surgical: only AI-bearing XMP is dropped, plain | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_metadata_internals.py | 539 | assert "OpenAI" in info["issuer"] # issuer byte-search still robust | CODE |
| MEDIUM⚡ | tests/test_platform.py | 385 | # The more-robust watermark wins -> safer (higher) strength. | COMMENT |
| MEDIUM | scripts/video_synthid_sweep.py | 181 | # scaling-factor gate lives there, and the harness that produces the certified | COMMENT |
| MEDIUM | scripts/skill_eval.py | 42 | # A model that recognizes the harness stops behaving like a user's agent: the first | COMMENT |
| MEDIUM | scripts/skill_eval_stub.py | 85 | # deciding the CLI was broken -- the harness measuring itself. | COMMENT |
| MEDIUM | scripts/synthid_affine_lattice_probe.py | 874 | """Select a robust cyclic phase and confirm it on disjoint patches. | STRING |
| MEDIUM | scripts/visible_eval.py | 46 | # silently vanishing from the evaluation harness. | COMMENT |
| MEDIUM | scripts/resource_ceilings.py | 71 | # cv2 figure, and it GROWS with the input, so the harness would partly manufacture | COMMENT |
| MEDIUM | src/remove_ai_watermarks/pixel_evidence.py | 59 | # Analysis resolution. Every statistic here is scale-robust, and a 2048px cap keeps | COMMENT |
| MEDIUM | src/remove_ai_watermarks/identify.py | 631 | # on real samples), and more robust than parsing the claim generator (which | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_provider_oracle_web.py | 140 | def set_input_files(self, path: str, *, timeout: int) -> None: | CODE |
| LOW | scripts/synthid_periodic_tile.py | 14 | __all__ = ["cyclic_tile_correlations", "fold_residual_template", "unit_tile"] | CODE |
| LOW | scripts/provider_oracle_web.py | 194 | def _set_upload_file(page: Page, surface: str, upload: Path, timeout_seconds: float) -> None: | CODE |
| LOW | scripts/synthid_runtime/__init__.py | 5 | __all__ = ["SynthIDDetection", "detect_synthid", "is_available"] | CODE |
| LOW | src/remove_ai_watermarks/pixel_evidence.py | 57 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/video_invisible.py | 51 | __all__ = ["build_temporal_reference", "temporal_residual_ratio"] | CODE |
| LOW | src/remove_ai_watermarks/metadata.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/gemini_engine.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/invisible_watermark.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/metadata_record.py | 58 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/invisible_engine.py | 42 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/region_eraser.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/text_draft.py | 30 | __all__ = [ | CODE |
| LOW | src/remove_ai_watermarks/__init__.py | 40 | __all__ = [ | CODE |
| LOW | src/remove_ai_watermarks/runninghub_engine.py | 58 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/watermark_registry.py | 56 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/trustmark_detector.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/cli.py | 100 | def _setup_logging(verbose: bool) -> None: | CODE |
| LOW | src/remove_ai_watermarks/forensic_metadata.py | 42 | __all__ = [ | CODE |
| LOW | src/remove_ai_watermarks/forensic_metadata.py | 257 | def _set_jpeg_trailer(result: dict[str, Any], data: bytes, eoi: int) -> None: | CODE |
| LOW | src/remove_ai_watermarks/identify.py | 87 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/_text_mark_engine.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/_internal/watermark_remover.py | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/_internal/c2pa.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/_internal/isobmff.py | 51 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/remove_ai_watermarks/_internal/tiling.py | 27 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/remove_ai_watermarks/video_encoding.py | 167 | except (ImportError, ValueError): | CODE |
| HIGH | src/remove_ai_watermarks/identify.py | 305 | except ValueError: | CODE |
| HIGH | src/remove_ai_watermarks/identify.py | 273 | except (ValueError, TypeError): | CODE |
| HIGH | src/remove_ai_watermarks/identify.py | 287 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_watermark_benchmark.py | 387 | assert output.read_text(encoding="utf-8") == '{"schema_version": 1, "value": null}\n' | CODE |
| HIGH | tests/test_release_workflows.py | 188 | script = script.replace("${{ github.event.release.name || github.ref_name }}", "test") | CODE |
| HIGH | src/remove_ai_watermarks/_internal/sm2.py | 114 | """``e = SM3(Z_A || M)``, the value an SM3withSM2 signature signs.""" | STRING |
| HIGH | src/remove_ai_watermarks/_internal/sm2.py | 133 | """Verify a raw 64-byte ``r || s`` SM3withSM2 signature over ``message``.""" | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/synthid-classifiers.md | 535 | ### Published few-shot attribution also fails the open-world gate | COMMENT |
| MEDIUM | scripts/skill_eval.py | 48 | # Language-independent hallucination check. A weak model with no pixel stack reported a | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/remove_ai_watermarks/video_invisible.py | 353 | CODE | |
| LOW | src/remove_ai_watermarks/invisible_engine.py | 201 | CODE | |
| LOW | src/remove_ai_watermarks/video.py | 579 | CODE | |
| LOW | src/remove_ai_watermarks/video.py | 664 | CODE | |
| LOW | src/remove_ai_watermarks/video.py | 836 | CODE | |
| LOW | src/remove_ai_watermarks/_internal/watermark_remover.py | 224 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_metadata.py | 1150 | assert xai_signature(_grok_jpeg(tmp_path, artist="John Doe")) is False | CODE |