A privacy-first app that strips AI watermarks from content you own.
This report presents the forensic synthetic code analysis of guillaumemeyer/watermarks-remover, a Python project with 19,171 GitHub stars. SynthScan v2.0 examined 39,305 lines of code across 177 source files, recording 1052 pattern matches distributed across 14 syntactic categories. The overall adjusted score of 40.2 places this repository in the Strong AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 1052 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_install_skill.py | 42 | def test_shipped_skills_satisfy_the_upload_spec(skill): | CODE |
| LOW⚡ | tests/test_install_skill.py | 82 | def test_validate_accepts_a_delimiter_line_with_trailing_whitespace(tmp_path): | CODE |
| LOW⚡ | tests/test_install_skill.py | 92 | def test_validate_rejects_name_directory_mismatch(tmp_path): | CODE |
| LOW⚡ | tests/test_install_skill.py | 99 | def test_validate_rejects_oversized_description(tmp_path): | CODE |
| LOW⚡ | tests/test_install_skill.py | 109 | def test_folded_description_is_joined_into_one_line(): | CODE |
| LOW⚡ | tests/test_install_skill.py | 123 | def test_claude_code_target_installs_into_claude_home(tmp_path, skill): | CODE |
| LOW⚡ | tests/test_install_skill.py | 129 | def test_claude_code_target_honours_claude_config_dir(tmp_path): | CODE |
| LOW⚡ | tests/test_install_skill.py | 203 | def test_cowork_bundle_has_one_top_level_directory_named_after_the_skill(tmp_path, skill): | CODE |
| LOW⚡ | tests/test_install_skill.py | 269 | def test_list_reports_every_shipped_skill(tmp_path): | CODE |
| LOW⚡ | tests/test_install_skill.py | 275 | def test_unknown_skill_fails_without_touching_the_filesystem(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 58 | def test_validate_rejects_non_spec_frontmatter_key(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 69 | def test_validate_rejects_a_malformed_opening_delimiter(tmp_path, opening): | CODE |
| LOW | tests/test_install_skill.py | 144 | def test_claude_code_target_preserves_existing_install_without_force(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 155 | def test_claude_code_force_backs_up_and_replaces(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 168 | def test_claude_project_target_installs_into_project_directory(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 184 | def test_link_installs_a_symlink_to_the_repository_skill(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 215 | def test_cowork_bundle_default_path_is_dist(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 227 | def test_cowork_bundle_is_reproducible(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 237 | def test_cowork_bundle_refuses_to_overwrite_without_force(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 249 | def test_cowork_bundle_scripts_stay_executable(tmp_path): | CODE |
| LOW | tests/test_website_format_routing.py | 35 | def test_webp_classified_by_content_type_suffix_and_magic(): | CODE |
| LOW | tests/test_website_format_routing.py | 48 | def test_extended_suffix_table(): | CODE |
| LOW | tests/test_website_format_routing.py | 65 | def test_webp_marker_reaches_image_scanner_not_text(): | CODE |
| LOW | tests/test_website_format_routing.py | 77 | def test_html_still_text_friendly(): | CODE |
| LOW | tests/test_c2patool_report.py | 49 | def test_no_claim_found_is_not_a_manifest(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_c2patool_report.py | 66 | def test_no_jumbf_data_is_not_a_manifest(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_c2patool_report.py | 76 | def test_real_manifest_is_detected(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_c2patool_report.py | 122 | def test_unrecognised_error_is_inconclusive(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_c2patool_report.py | 134 | def test_conclusive_runs_are_marked_ok(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_c2patool_report.py | 150 | def test_timeout_is_inconclusive(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_c2patool_report.py | 170 | def test_inconclusive_probe_is_surfaced_in_the_report(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_c2patool_report.py | 192 | def test_capabilities_rejects_a_present_but_unrunnable_tool(monkeypatch): | CODE |
| LOW⚡ | tests/test_http_server.py | 153 | def test_openapi_spec_reflects_auth(conn, monkeypatch): | CODE |
| LOW⚡ | tests/test_http_server.py | 163 | def test_inspect_text_finds_watermark(conn): | CODE |
| LOW⚡ | tests/test_http_server.py | 172 | def test_clean_text_roundtrip(conn): | CODE |
| LOW⚡ | tests/test_http_server.py | 182 | def test_clean_png_strips_metadata(conn): | CODE |
| LOW⚡ | tests/test_http_server.py | 308 | def test_binary_named_as_text_rejected(conn): | CODE |
| LOW⚡ | tests/test_http_server.py | 313 | def test_clean_unknown_format_rejected(conn): | CODE |
| LOW⚡ | tests/test_http_server.py | 320 | def test_inspect_unknown_format_reports_kind(conn): | CODE |
| LOW⚡ | tests/test_http_server.py | 329 | def test_missing_file_field_rejected(conn): | CODE |
| LOW⚡ | tests/test_http_server.py | 334 | def test_safe_name_sanitizes_traversal(): | CODE |
| LOW⚡ | tests/test_http_server.py | 344 | def test_traversal_name_does_not_escape(conn, tmp_path): | CODE |
| LOW⚡ | tests/test_http_server.py | 449 | def test_batch_empty_files_rejected(conn): | CODE |
| LOW⚡ | tests/test_http_server.py | 455 | def test_batch_missing_files_field_rejected(conn): | CODE |
| LOW⚡ | tests/test_http_server.py | 461 | def test_batch_over_limit_rejected(conn, monkeypatch): | CODE |
| LOW | tests/test_http_server.py | 122 | def test_openapi_spec_covers_all_endpoints(conn): | CODE |
| LOW | tests/test_http_server.py | 141 | def test_openapi_spec_describes_request_bodies(conn): | CODE |
| LOW | tests/test_http_server.py | 193 | def test_clean_markdown_container(conn): | CODE |
| LOW | tests/test_http_server.py | 203 | def test_clean_av_honors_remove_pixel(conn, monkeypatch): | CODE |
| LOW | tests/test_http_server.py | 223 | def test_clean_av_honors_remove_audio_watermark(conn): | CODE |
| LOW | tests/test_http_server.py | 237 | def test_clean_av_rejects_invalid_remove_pixel(conn): | CODE |
| LOW | tests/test_http_server.py | 248 | def test_unknown_option_rejected(conn): | CODE |
| LOW | tests/test_http_server.py | 256 | def test_unknown_deep_images_mode_rejected(conn): | CODE |
| LOW | tests/test_http_server.py | 267 | def test_known_deep_images_modes_accepted(conn): | CODE |
| LOW | tests/test_http_server.py | 295 | def test_option_wrong_type_rejected(conn, key, value, type_name): | CODE |
| LOW | tests/test_http_server.py | 378 | def test_openapi_spec_covers_batch_endpoints(conn): | CODE |
| LOW | tests/test_http_server.py | 387 | def test_inspect_batch_mixed_results(conn): | CODE |
| LOW | tests/test_http_server.py | 409 | def test_clean_batch_mixed_results(conn): | CODE |
| LOW | tests/test_http_server.py | 431 | def test_batch_one_bad_option_does_not_abort_others(conn): | CODE |
| LOW | tests/test_http_server.py | 472 | def test_clean_jpeg_preserves_format_extension(conn): | CODE |
| 596 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | install_skill.py | 62 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 64 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 190 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 192 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 264 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 266 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 303 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 305 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 36 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 38 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 117 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 119 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 197 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 199 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 264 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 266 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 343 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 345 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 619 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 621 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 697 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 699 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_av_meta.py | 20 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_av_meta.py | 22 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_av_meta.py | 128 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_av_meta.py | 130 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_video.py | 55 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_video.py | 57 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_video.py | 133 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_video.py | 135 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_audio.py | 49 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_audio.py | 51 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_audio.py | 69 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_audio.py | 71 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_audio.py | 116 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_clean_audio.py | 118 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 140 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 142 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 290 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 292 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 357 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 359 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 719 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 721 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 844 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 846 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_bench_synthid_text.py | 566 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_bench_synthid_text.py | 595 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_precommit_hooks.py | 280 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_precommit_hooks.py | 284 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_rewrite_text.py | 142 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_rewrite_text.py | 144 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_rewrite_text.py | 467 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_rewrite_text.py | 469 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_rewrite_text.py | 646 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_rewrite_text.py | 648 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_hook_written_file.py | 70 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_hook_written_file.py | 72 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_hook_written_file.py | 110 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_hook_written_file.py | 112 | # -------------------------------------------------------------------------- | COMMENT |
| 56 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_av_meta.py | 349 | data = _mp4_with_xmp(b"Generated by AI toolchain") | CODE |
| HIGH⚡ | tests/test_av_meta.py | 361 | assert b"Generated by AI" not in dest.read_bytes() | CODE |
| HIGH⚡ | tests/test_av_meta.py | 366 | data = _mp4_with_xmp(b"Generated by AI toolchain") | CODE |
| HIGH⚡ | tests/test_av_meta.py | 375 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH⚡ | tests/test_av_meta.py | 379 | xmp = _extended_isobmff_box(b"uuid", XMP_UUID_HEX + b"Generated by AI") | CODE |
| HIGH⚡ | tests/test_av_meta.py | 402 | data2 = _mp4_with_udta_tag(b"Generated by AI") | CODE |
| HIGH⚡ | tests/test_av_meta.py | 411 | assert b"Generated by AI" not in dest.read_bytes() | CODE |
| HIGH⚡ | tests/test_av_meta.py | 416 | data = _mp4_with_udta_tag(b"Generated by AI") | CODE |
| HIGH⚡ | tests/test_av_meta.py | 425 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH⚡ | tests/test_av_meta.py | 625 | data = _wav(_wav_fmt_chunk(), _wav_list_info(b"Generated by AI"), _wav_data_chunk(8)) | CODE |
| HIGH⚡ | tests/test_av_meta.py | 705 | _id3v2_frame(b"TSSE", b"\x00Generated by AI"), | CODE |
| HIGH⚡ | tests/test_av_meta.py | 719 | _id3v2_frame(b"TSSE", b"\x00Generated by AI"), | CODE |
| HIGH⚡ | tests/test_av_meta.py | 727 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH⚡ | tests/test_av_meta.py | 736 | _id3v2_frame(b"TSSE", b"\x00Generated by AI"), | CODE |
| HIGH⚡ | tests/test_av_meta.py | 744 | assert b"Generated by AI" not in cleaned # flagged frame is gone | CODE |
| HIGH⚡ | tests/test_av_meta.py | 751 | _id3v2_frame(b"TSSE", b"\x00Generated by AI", major=4), | CODE |
| HIGH | tests/test_av_meta.py | 272 | data = _flac(_id3v2_frame(b"COMM", b"\x00Generated by AI")) | CODE |
| HIGH | tests/test_av_meta.py | 390 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH | tests/test_av_meta.py | 441 | moov = _moov_with_udta(b" toolGenerated by OpenAI Sora") | CODE |
| HIGH | tests/test_av_meta.py | 455 | assert b"Generated by OpenAI Sora" not in cleaned | CODE |
| HIGH | tests/test_av_meta.py | 462 | moov = _moov_with_udta(b" toolGenerated by OpenAI Sora" + b"\x00" * 32) | CODE |
| HIGH | tests/test_av_meta.py | 637 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH | tests/test_av_meta.py | 665 | data = _wav(_wav_fmt_chunk(), _wav_list_info(b"Generated by AI"), _riff_chunk(b"data", audio)) | CODE |
| HIGH | tests/test_av_meta.py | 763 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH | tests/test_av_meta.py | 782 | body = b"TT2\x00\x00\x10\x00Generated by AI" | CODE |
| HIGH | tests/test_av_meta.py | 794 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH | tests/test_clean_image.py | 159 | (b"Generated by AI with OpenAI", False), | CODE |
| HIGH | tests/test_container_meta.py | 442 | assert "Generated by AI" not in core | CODE |
| HIGH | tests/test_container_meta.py | 356 | <dc:description>Generated by AI</dc:description> | STRING |
| HIGH | tests/test_zip_partial_evidence.py | 87 | zf.writestr("content.opf", "<dc:creator>Generated by OpenAI</dc:creator>") | CODE |
| HIGH⚡ | tests/test_ai_generator_hints.py | 111 | data = _minimal_png_with_text_chunk(b"tEXt", _text("Comment", "Generated by AI")) | CODE |
| HIGH⚡ | tests/test_ai_generator_hints.py | 143 | (b"zTXt", b"Comment\x00\x00" + zlib.compress(b"Generated by AI")), | CODE |
| HIGH⚡ | tests/test_ai_generator_hints.py | 146 | b"Comment\x00\x01\x00\x00\x00" + zlib.compress(b"Generated by AI"), | CODE |
| HIGH | tests/test_hook_written_file.py | 154 | udta = box(b"udta", b" toolGenerated by OpenAI Sora" + b"\x00" * 32) | CODE |
| HIGH | tests/test_ooxml_xlsx_pptx.py | 77 | <dc:description>Generated by AI</dc:description> | CODE |
| HIGH | skills/remove-ai-marks/references/how-claude-marks.md | 1 | # How Claude marks AI-generated content | COMMENT |
| HIGH | …lls/clean-user-facing-text/scripts/score_stylometry.py | 39 | # boilerplate commonly overrepresented in AI-generated text across frontier LLMs. | COMMENT |
| HIGH | service/scripts/image_meta.py | 127 | b"Generated by AI", | CODE |
| HIGH | service/scripts/container_meta.py | 874 | # vendor names such as "Claude" without being AI-generated metadata. | COMMENT |
| HIGH | service/scripts/score_stylometry.py | 39 | # boilerplate commonly overrepresented in AI-generated text across frontier LLMs. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install_skill.py | 16 | CODE | |
| LOW | tests/test_install_skill.py | 3 | CODE | |
| LOW | tests/test_website_format_routing.py | 8 | CODE | |
| LOW | tests/test_c2patool_report.py | 3 | CODE | |
| LOW | tests/test_http_server.py | 3 | CODE | |
| LOW | tests/test_av_meta.py | 3 | CODE | |
| LOW | tests/test_markllm_detect.py | 3 | CODE | |
| LOW | tests/test_binary_guard.py | 3 | CODE | |
| LOW | tests/test_clean_video.py | 3 | CODE | |
| LOW | tests/test_clean_image.py | 3 | CODE | |
| LOW | tests/test_text_detectors.py | 3 | CODE | |
| LOW | tests/test_markllm_schemes.py | 8 | CODE | |
| LOW | tests/test_backup_preserved.py | 8 | CODE | |
| LOW | tests/test_container_meta.py | 3 | CODE | |
| LOW | tests/test_isobmff_truncated_bytescan.py | 9 | CODE | |
| LOW | tests/test_clean_audio.py | 3 | CODE | |
| LOW | tests/test_zip_partial_evidence.py | 8 | CODE | |
| LOW | tests/test_inspect_file.py | 3 | CODE | |
| LOW | tests/test_bench_synthid_text.py | 9 | CODE | |
| LOW | tests/test_format_dispatch.py | 3 | CODE | |
| LOW | tests/test_gumbel_detector.py | 8 | CODE | |
| LOW | tests/test_avif_heic.py | 3 | CODE | |
| LOW | tests/test_precommit_hooks.py | 3 | CODE | |
| LOW | tests/test_audit_sarif_and_concurrency.py | 3 | CODE | |
| LOW | tests/test_lightweight_skill.py | 3 | CODE | |
| LOW | tests/test_makefile_targets.py | 10 | CODE | |
| LOW | tests/test_ai_generator_hints.py | 10 | CODE | |
| LOW | tests/test_stylometry.py | 3 | CODE | |
| LOW | tests/test_rewrite_text.py | 3 | CODE | |
| LOW | tests/test_ctrlregen_clean.py | 3 | CODE | |
| LOW | tests/test_audit.py | 3 | CODE | |
| LOW | tests/test_hook_written_file.py | 8 | CODE | |
| LOW | tests/test_embedded_data_uris.py | 3 | CODE | |
| LOW | tests/test_detect_endpoint.py | 4 | CODE | |
| LOW | tests/test_entity_encoded_watermarks.py | 10 | CODE | |
| LOW | tests/test_clean_file_quiet.py | 3 | CODE | |
| LOW | tests/test_single_quoted_attributes.py | 10 | CODE | |
| LOW | tests/test_pdf_deep_images.py | 9 | CODE | |
| LOW | tests/test_image_formats_bmp_gif_tiff.py | 3 | CODE | |
| LOW | tests/test_ooxml_xlsx_pptx.py | 3 | CODE | |
| LOW | tests/test_truncated_tail_preserved.py | 8 | CODE | |
| LOW | tests/test_json_exit_code.py | 3 | CODE | |
| LOW | tests/test_synthid_score.py | 3 | CODE | |
| LOW | tests/test_pdf_structural_rewrite.py | 11 | CODE | |
| LOW | tests/test_markdiffusion_harness.py | 3 | CODE | |
| LOW | tests/test_child_console_windows.py | 15 | CODE | |
| LOW | tests/test_clean_text.py | 3 | CODE | |
| LOW | tests/test_epub.py | 3 | CODE | |
| LOW | tests/test_stylometry_empty_sentences.py | 7 | CODE | |
| LOW | tests/test_security_hardening.py | 3 | CODE | |
| LOW | tests/test_plugin_manifest.py | 3 | CODE | |
| LOW | skills/clean-user-facing-text/scripts/clean_text.py | 4 | CODE | |
| LOW | skills/clean-user-facing-text/scripts/inspect_text.py | 4 | CODE | |
| LOW | …lls/clean-user-facing-text/scripts/score_stylometry.py | 14 | CODE | |
| LOW | skills/clean-user-facing-text/scripts/common.py | 3 | CODE | |
| LOW | skills/clean-user-facing-text/scripts/text_unicode.py | 3 | CODE | |
| LOW | service/scripts/clean_video.py | 17 | CODE | |
| LOW | service/scripts/clean_file.py | 4 | CODE | |
| LOW | service/scripts/markdiffusion_harness.py | 31 | CODE | |
| LOW | service/scripts/inspect_image.py | 4 | CODE | |
| 27 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | service/scripts/clean_video.py | 176 | except Exception as e: # surface any subprocess failure | CODE |
| LOW | service/scripts/clean_video.py | 214 | except Exception: # take the default when ffprobe is missing or odd | CODE |
| LOW | service/scripts/clean_video.py | 250 | except Exception: # probe failures fall back to uniform timing | CODE |
| LOW | service/scripts/clean_file.py | 165 | except Exception as e: | CODE |
| LOW | service/scripts/clean_file.py | 191 | except Exception as e: | CODE |
| LOW | service/scripts/clean_file.py | 212 | except Exception as e: | CODE |
| LOW | service/scripts/markdiffusion_harness.py | 95 | except Exception: # noqa: S110 - optional torch device detection | CODE |
| LOW⚡ | service/scripts/markdiffusion_harness.py | 178 | except Exception: # noqa: S110 - optional numpy import | CODE |
| LOW⚡ | service/scripts/markdiffusion_harness.py | 185 | except Exception: # noqa: S110 - optional torch import | CODE |
| LOW⚡ | service/scripts/markdiffusion_harness.py | 189 | except Exception: | CODE |
| LOW | service/scripts/markdiffusion_harness.py | 273 | except Exception as e: | CODE |
| LOW | service/scripts/markdiffusion_harness.py | 341 | except Exception as e: | CODE |
| LOW | service/scripts/markdiffusion_harness.py | 398 | except Exception as e: | CODE |
| LOW | service/scripts/clean_image.py | 159 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 242 | except Exception: | CODE |
| LOW | service/scripts/image_meta.py | 1446 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 1482 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 1596 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 1701 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 1778 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 2192 | except Exception as e: | CODE |
| LOW | service/scripts/server.py | 125 | except Exception: | CODE |
| LOW | service/scripts/server.py | 163 | except Exception: | CODE |
| LOW | service/scripts/server.py | 1029 | except Exception as e: | CODE |
| LOW | service/scripts/clean_ctrlregen.py | 55 | except Exception: # noqa: S110 - optional torch device detection | CODE |
| LOW | service/scripts/clean_ctrlregen.py | 151 | except Exception as e: | CODE |
| LOW | service/scripts/clean_ctrlregen.py | 174 | except Exception as e: | CODE |
| LOW | service/scripts/clean_audio.py | 149 | except Exception: # take the default when ffprobe is missing or odd | CODE |
| LOW | service/scripts/clean_audio.py | 186 | except Exception: | CODE |
| LOW | service/scripts/score_synthid.py | 102 | except Exception as e: | CODE |
| LOW | service/scripts/audit_website.py | 474 | except Exception: # noqa: S112 - try next candidate sitemap on any failure | CODE |
| LOW | service/scripts/audit_website.py | 497 | except Exception: # noqa: S110 - robots.txt is optional; fall through to None | CODE |
| LOW | service/scripts/audit_website.py | 602 | except Exception as e: | CODE |
| LOW | service/scripts/audit_website.py | 614 | except Exception as e: | CODE |
| LOW | service/scripts/audit_website.py | 619 | except Exception as e: | CODE |
| LOW | service/scripts/detect_text_watermark.py | 86 | except Exception: # noqa: S110 - optional torch device detection | CODE |
| LOW | service/scripts/detect_text_watermark.py | 233 | except Exception as e: | CODE |
| LOW | service/scripts/detect_text_watermark.py | 291 | except Exception as e: | CODE |
| LOW | service/scripts/detect_text_watermark.py | 364 | except Exception as e: # a bad request must not kill the worker | CODE |
| LOW | service/scripts/detect_text_watermark.py | 405 | except Exception as e: | CODE |
| LOW | service/scripts/rewrite_text.py | 228 | except Exception as e: # defensive: the detector contract is fail-soft | CODE |
| LOW | service/scripts/container_meta.py | 246 | except Exception: # noqa: S112 - malformed data URI; skip to next match | CODE |
| LOW | service/scripts/container_meta.py | 297 | except Exception: | CODE |
| LOW | service/scripts/container_meta.py | 320 | except Exception: | CODE |
| LOW | service/scripts/container_meta.py | 685 | except Exception as e: | CODE |
| LOW | service/scripts/container_meta.py | 1226 | except Exception: # noqa: S110 - malformed embedded media; keep original part | CODE |
| LOW | service/scripts/container_meta.py | 1700 | except Exception: # noqa: S110 - malformed embedded media; keep original | CODE |
| LOW | service/scripts/container_meta.py | 1890 | except Exception as e: | CODE |
| LOW | service/scripts/container_meta.py | 2067 | except Exception as e: | CODE |
| LOW | service/scripts/container_meta.py | 2154 | except Exception as e: | CODE |
| LOW | service/scripts/text_detectors.py | 204 | except Exception as e: | CODE |
| LOW | service/scripts/text_detectors.py | 319 | except Exception as e: # fail-soft contract: never raise | CODE |
| LOW | service/scripts/bench_synthid_text.py | 492 | except Exception as e: # fail-soft: optional dependency | CODE |
| LOW | service/scripts/bench_synthid_text.py | 514 | except Exception as e: | CODE |
| LOW | service/scripts/bench_synthid_text.py | 613 | except Exception as e: | CODE |
| LOW | service/scripts/bench_synthid_text.py | 637 | except Exception as e: | CODE |
| LOW | service/scripts/bench_synthid_text.py | 678 | except Exception: | CODE |
| LOW | service/scripts/bench_synthid_text.py | 713 | except Exception as e: | CODE |
| LOW | service/scripts/bench_synthid_text.py | 732 | except Exception as e: | CODE |
| LOW | service/scripts/bench_synthid_text.py | 753 | except Exception as e: | CODE |
| 3 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install_skill.py | 85 | CODE | |
| LOW | tests/test_container_meta.py | 218 | CODE | |
| LOW | tests/test_image_formats_bmp_gif_tiff.py | 80 | CODE | |
| LOW | …lls/clean-user-facing-text/scripts/score_stylometry.py | 318 | CODE | |
| LOW | skills/clean-user-facing-text/scripts/text_unicode.py | 404 | CODE | |
| LOW | service/scripts/clean_file.py | 29 | CODE | |
| LOW | service/scripts/image_meta.py | 247 | CODE | |
| LOW | service/scripts/image_meta.py | 342 | CODE | |
| LOW | service/scripts/image_meta.py | 388 | CODE | |
| LOW | service/scripts/image_meta.py | 480 | CODE | |
| LOW | service/scripts/image_meta.py | 593 | CODE | |
| LOW | service/scripts/image_meta.py | 852 | CODE | |
| LOW | service/scripts/image_meta.py | 911 | CODE | |
| LOW | service/scripts/image_meta.py | 1125 | CODE | |
| LOW | service/scripts/image_meta.py | 1210 | CODE | |
| LOW | service/scripts/image_meta.py | 1246 | CODE | |
| LOW | service/scripts/image_meta.py | 1275 | CODE | |
| LOW | service/scripts/image_meta.py | 1791 | CODE | |
| LOW | service/scripts/image_meta.py | 1857 | CODE | |
| LOW | service/scripts/image_meta.py | 1916 | CODE | |
| LOW | service/scripts/image_meta.py | 2041 | CODE | |
| LOW | service/scripts/image_meta.py | 2131 | CODE | |
| LOW | service/scripts/av_meta.py | 101 | CODE | |
| LOW | service/scripts/av_meta.py | 371 | CODE | |
| LOW | service/scripts/av_meta.py | 447 | CODE | |
| LOW | service/scripts/av_meta.py | 475 | CODE | |
| LOW | service/scripts/server.py | 676 | CODE | |
| LOW | service/scripts/server.py | 721 | CODE | |
| LOW | service/scripts/server.py | 769 | CODE | |
| LOW | service/scripts/server.py | 988 | CODE | |
| LOW | service/scripts/audit_website.py | 323 | CODE | |
| LOW | service/scripts/audit_website.py | 379 | CODE | |
| LOW | service/scripts/audit_website.py | 456 | CODE | |
| LOW | service/scripts/audit_website.py | 503 | CODE | |
| LOW | service/scripts/audit_website.py | 519 | CODE | |
| LOW | service/scripts/detect_text_watermark.py | 325 | CODE | |
| LOW | service/scripts/container_meta.py | 157 | CODE | |
| LOW | service/scripts/container_meta.py | 226 | CODE | |
| LOW | service/scripts/container_meta.py | 276 | CODE | |
| LOW | service/scripts/container_meta.py | 465 | CODE | |
| LOW | service/scripts/container_meta.py | 827 | CODE | |
| LOW | service/scripts/container_meta.py | 1184 | CODE | |
| LOW | service/scripts/container_meta.py | 1343 | CODE | |
| LOW | service/scripts/container_meta.py | 1378 | CODE | |
| LOW | service/scripts/container_meta.py | 1514 | CODE | |
| LOW | service/scripts/container_meta.py | 1646 | CODE | |
| LOW | service/scripts/container_meta.py | 2332 | CODE | |
| LOW | service/scripts/container_meta.py | 2439 | CODE | |
| LOW | service/scripts/container_meta.py | 281 | CODE | |
| LOW | service/scripts/score_stylometry.py | 318 | CODE | |
| LOW | service/scripts/bench_synthid_text.py | 872 | CODE | |
| LOW | service/scripts/bench_synthid_text.py | 1110 | CODE | |
| LOW | service/scripts/text_unicode.py | 404 | CODE | |
| LOW | service/scripts/audit_lib.py | 212 | CODE | |
| LOW | service/scripts/audit_dir.py | 58 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | compose-check.sh | 8 | # harness/heavy -> one-shot CLIs must exit 0 on --help | COMMENT |
| MEDIUM | compose.yaml | 4 | # docker compose --profile harness up --build -d # + markllm / markdiffusion harnesses | COMMENT |
| MEDIUM | compose.yaml | 8 | # (loopback-only host mapping). The heavy/harness images are one-shot CLIs: | COMMENT |
| MEDIUM | skills/clean-user-facing-text/scripts/common.py | 211 | # A replaced or non-binary stdin (pytest capture, custom harness). | COMMENT |
| MEDIUM | service/scripts/setup_markllm.sh | 5 | # harness. | COMMENT |
| MEDIUM⚡ | service/scripts/text_detectors.py | 101 | # MarkLLM (open-source research harness: KGW / SynthID schemes) | COMMENT |
| MEDIUM | service/scripts/common.py | 211 | # A replaced or non-binary stdin (pytest capture, custom harness). | COMMENT |
| MEDIUM | service/scripts/bench_synthid_text.py | 165 | # No RLIMIT_AS here: every child is the MarkLLM harness or rewrite_text.py, | COMMENT |
| MEDIUM | service/scripts/bench_synthid_text.py | 1201 | # A clear by a hair is not a robust removal: require the | COMMENT |
| MEDIUM | service/scripts/setup_markdiffusion.sh | 4 | # Bootstrap the optional MarkDiffusion image-watermark harness backend. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | service/scripts/markdiffusion_harness.py | 0 | resolve the ``auto`` device hint to a concrete torch device. | STRING |
| HIGH | service/scripts/clean_ctrlregen.py | 0 | resolve the ``auto`` device hint to a concrete torch device. | STRING |
| HIGH | service/scripts/detect_text_watermark.py | 0 | resolve the ``auto`` device hint to a concrete torch device. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_image_formats_bmp_gif_tiff.py | 351 | assert b"Acme Corp" not in cleaned | CODE |
| LOW⚡ | tests/test_image_formats_bmp_gif_tiff.py | 367 | assert b"Acme Corp" not in cleaned | CODE |
| LOW⚡ | tests/test_image_formats_bmp_gif_tiff.py | 389 | assert b"Acme Corp" in cleaned | CODE |
| LOW⚡ | tests/test_epub.py | 122 | _build_epub(creator="Jane Doe", generator="", with_c2pa_png=False, with_meta_part=False) | CODE |
| LOW⚡ | tests/test_epub.py | 194 | epub = _build_epub(creator="Jane Doe", generator="", with_c2pa_png=False, with_meta_part=False) | CODE |
| LOW⚡ | tests/test_epub.py | 198 | assert "Jane Doe" in opf | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | compose.yaml | 1 | # Whole-infra bring-up for watermarks-remover. | COMMENT |
| LOW | service/scripts/requirements-semantic.txt | 1 | # Optional dependency for the semantic-divergence metric in the SynthID-text | COMMENT |
| LOW | service/scripts/requirements-synthid-scorer.txt | 1 | # Minimal dependencies for the optional reverse-SynthID pixel scorer. | COMMENT |
| LOW | service/scripts/requirements-markllm.txt | 1 | # Minimal dependencies for the optional MarkLLM text-watermark harness. | COMMENT |
| LOW | service/scripts/setup_markllm.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | service/scripts/setup_markdiffusion.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | service/scripts/requirements-ctrlregen.txt | 1 | # Dependencies for the optional CtrlRegen pixel-removal backend | COMMENT |
| LOW | service/scripts/requirements-markdiffusion.txt | 1 | # Dependencies for the optional MarkDiffusion image-watermark harness | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_clean_video.py | 202 | # remux orchestration is exercised without a GPU checkout. | COMMENT |
| MEDIUM⚡ | service/scripts/bench_synthid_text.py | 457 | # Benchmark orchestration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …lls/clean-user-facing-text/scripts/score_stylometry.py | 231 | with words): a one-or-zero-sample CV is undefined, and reporting it as 0.0 | STRING |
| HIGH | service/scripts/score_stylometry.py | 231 | with words): a one-or-zero-sample CV is undefined, and reporting it as 0.0 | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | service/scripts/clean_video.py | 285 | CODE | |
| LOW | service/scripts/image_meta.py | 2131 | CODE | |
| LOW | service/scripts/rewrite_text.py | 459 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | service/scripts/container_meta.py | 2246 | def _settle(ran: bool) -> None: | CODE |