A privacy-first app that strips AI watermarks from content you own.
This report summarizes scanner evidence for guillaumemeyer/watermarks-remover, a Python project with 23,858 GitHub stars. SynthScan examined 53,738 lines of code across 267 source files, recording 1489 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 40.6 (High 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? 1131 finding(s).
Are imports declared and package/API names verified? 119 finding(s).
Are wrappers, guards, and repeated structures necessary? 1218 finding(s).
Which changes need focused human review? 1489 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 1489 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_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 | 204 | def test_codex_targets_install_both_skills(tmp_path, target, skill): | CODE |
| LOW⚡ | tests/test_install_skill.py | 264 | def test_cowork_bundle_has_one_top_level_directory_named_after_the_skill(tmp_path, skill): | CODE |
| LOW⚡ | tests/test_install_skill.py | 330 | def test_list_reports_every_shipped_skill(tmp_path): | CODE |
| LOW⚡ | tests/test_install_skill.py | 336 | 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 | 216 | def test_codex_force_backs_up_existing_skill(tmp_path, target, skill): | CODE |
| LOW | tests/test_install_skill.py | 238 | def test_codex_targets_link_repository_skill(tmp_path, target, skill): | CODE |
| LOW | tests/test_install_skill.py | 276 | def test_cowork_bundle_default_path_is_dist(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 288 | def test_cowork_bundle_is_reproducible(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 298 | def test_cowork_bundle_refuses_to_overwrite_without_force(tmp_path): | CODE |
| LOW | tests/test_install_skill.py | 310 | def test_cowork_bundle_scripts_stay_executable(tmp_path): | CODE |
| LOW⚡ | tests/test_unscanned_file_accounting.py | 50 | def test_aggregate_separates_read_from_unrecognized(tmp_path): | CODE |
| LOW⚡ | tests/test_unscanned_file_accounting.py | 59 | def test_aggregate_on_read_files_only_reports_nothing_unrecognized(tmp_path): | CODE |
| LOW⚡ | tests/test_unscanned_file_accounting.py | 67 | def test_scanned_line_counts_only_the_files_that_were_read(tmp_path, capsys): | CODE |
| LOW⚡ | tests/test_unscanned_file_accounting.py | 77 | def test_precommit_gate_names_the_files_it_did_not_read(tmp_path, monkeypatch, capsys): | CODE |
| LOW | tests/test_unscanned_file_accounting.py | 93 | def test_precommit_gate_reports_unread_files_alongside_findings(tmp_path, monkeypatch, capsys): | CODE |
| LOW | tests/test_unscanned_file_accounting.py | 107 | def test_precommit_gate_stays_quiet_when_every_file_was_read(tmp_path, monkeypatch, capsys): | CODE |
| LOW | tests/test_website_zip_container_routing.py | 21 | def test_extensionless_docx_classified_as_docx(): | CODE |
| LOW⚡ | tests/test_website_zip_container_routing.py | 37 | def test_extensionless_xlsx_classified_as_xlsx(): | CODE |
| LOW⚡ | tests/test_website_zip_container_routing.py | 44 | def test_extensionless_pptx_classified_as_pptx(): | CODE |
| LOW⚡ | tests/test_website_zip_container_routing.py | 54 | def test_extensionless_odt_classified_as_odt(): | CODE |
| LOW⚡ | tests/test_website_zip_container_routing.py | 64 | def test_extensionless_epub_classified_as_epub(): | CODE |
| LOW⚡ | tests/test_website_zip_container_routing.py | 74 | def test_ambiguous_zip_with_lone_manifest_not_misrouted(): | CODE |
| LOW⚡ | tests/test_website_zip_container_routing.py | 82 | def test_ambiguous_zip_with_lone_opf_not_misrouted(): | CODE |
| LOW⚡ | tests/test_capabilities_tooling.py | 30 | def test_ffmpeg_version_flag_is_declared(): | CODE |
| LOW⚡ | tests/test_capabilities_tooling.py | 35 | def test_ffmpeg_on_path_is_reported_usable(): | CODE |
| LOW⚡ | tests/test_capabilities_tooling.py | 40 | def test_core_image_installs_every_advertised_tool(): | 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_website_format_routing.py | 82 | def test_extensionless_zip_classified_by_container_magic(): | CODE |
| LOW⚡ | tests/test_source_extensions_scanned.py | 26 | def test_source_extensions_classify_as_text(tmp_path): | CODE |
| LOW⚡ | tests/test_source_extensions_scanned.py | 33 | def test_zero_width_in_source_is_found(tmp_path): | CODE |
| LOW⚡ | tests/test_source_extensions_scanned.py | 43 | def test_unknown_binary_still_unknown(tmp_path): | CODE |
| LOW | tests/conftest.py | 26 | def _noop_layer_b_for_non_strategy_tests(monkeypatch: pytest.MonkeyPatch, request): | CODE |
| LOW⚡ | tests/test_space_confidence_parity.py | 34 | def test_container_space_finding_is_informational(): | CODE |
| LOW⚡ | tests/test_space_confidence_parity.py | 39 | def test_container_invisible_finding_stays_probable(): | CODE |
| LOW⚡ | tests/test_space_confidence_parity.py | 44 | def test_same_bytes_same_confidence(tmp_path): | CODE |
| LOW | tests/test_space_confidence_parity.py | 56 | def test_real_carrier_in_markdown_is_still_actionable(tmp_path): | CODE |
| LOW⚡ | tests/test_frontmatter_false_positives.py | 53 | def test_agent_tools_value_naming_claude_is_not_provenance() -> None: | CODE |
| LOW⚡ | tests/test_frontmatter_false_positives.py | 57 | def test_agent_frontmatter_survives_clean_untouched() -> None: | CODE |
| LOW⚡ | tests/test_frontmatter_false_positives.py | 65 | def test_prose_merely_mentioning_a_vendor_is_not_provenance() -> None: | CODE |
| LOW | tests/test_frontmatter_false_positives.py | 85 | def test_provenance_keys_still_caught(key_line: str) -> None: | CODE |
| LOW | tests/test_frontmatter_false_positives.py | 90 | def test_watermark_inside_an_agent_definition_is_still_caught() -> None: | CODE |
| LOW | tests/test_frontmatter_false_positives.py | 107 | def test_agent_shape_requires_all_three_keys() -> None: | 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 |
| 916 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | install_skill.py | 64 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 66 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 192 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 194 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 266 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 268 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 305 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | install_skill.py | 307 | # -------------------------------------------------------------------------- | 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 | 258 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 260 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 325 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_install_skill.py | 327 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 343 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 345 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 645 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 647 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 723 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_av_meta.py | 725 | # --------------------------------------------------------------------------- | 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_container_meta.py | 1087 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_container_meta.py | 1089 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_isobmff_truncated_bytescan.py | 70 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_isobmff_truncated_bytescan.py | 72 | # --------------------------------------------------------------------------- | 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 | 162 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 164 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 312 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 314 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 379 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 381 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 916 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 918 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 1041 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 1043 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 1387 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_bench_synthid_text.py | 1389 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_bench_synthid_text.py | 763 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_bench_synthid_text.py | 792 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_precommit_hooks.py | 279 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_precommit_hooks.py | 283 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_rewrite_text.py | 263 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_rewrite_text.py | 265 | # --------------------------------------------------------------------------- | COMMENT |
| 72 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | README.md | 1148 | - **[Google DeepMind: SynthID](https://deepmind.google/models/synthid/)** — Google's watermarking technology for AI-gene | CODE |
| HIGH | tests/test_truncated_id3v2.py | 16 | partial_payload = b"COMM\x00\x00\x00\x10\x00\x00\x00engGenerated by ChatGPT" | CODE |
| 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 | 651 | data = _wav(_wav_fmt_chunk(), _wav_list_info(b"Generated by AI"), _wav_data_chunk(8)) | CODE |
| HIGH⚡ | tests/test_av_meta.py | 731 | _id3v2_frame(b"TSSE", b"\x00Generated by AI"), | CODE |
| HIGH⚡ | tests/test_av_meta.py | 745 | _id3v2_frame(b"TSSE", b"\x00Generated by AI"), | CODE |
| HIGH⚡ | tests/test_av_meta.py | 753 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH⚡ | tests/test_av_meta.py | 762 | _id3v2_frame(b"TSSE", b"\x00Generated by AI"), | CODE |
| HIGH⚡ | tests/test_av_meta.py | 770 | assert b"Generated by AI" not in cleaned # flagged frame is gone | CODE |
| HIGH⚡ | tests/test_av_meta.py | 777 | _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 | 663 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH | tests/test_av_meta.py | 691 | data = _wav(_wav_fmt_chunk(), _wav_list_info(b"Generated by AI"), _riff_chunk(b"data", audio)) | CODE |
| HIGH | tests/test_av_meta.py | 789 | assert b"Generated by AI" not in cleaned | CODE |
| HIGH | tests/test_av_meta.py | 808 | body = b"TT2\x00\x00\x10\x00Generated by AI" | CODE |
| HIGH | tests/test_av_meta.py | 820 | 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 | 1094 | "<html><body><!-- generated by ChatGPT --><p>Hi</p>" | CODE |
| HIGH⚡ | tests/test_container_meta.py | 1140 | "```html\n<!-- generated by ChatGPT: example code -->\n```\n\n" | CODE |
| HIGH⚡ | tests/test_container_meta.py | 1149 | assert "<!-- generated by ChatGPT: example code -->" in cleaned | CODE |
| HIGH | tests/test_container_meta.py | 619 | assert "Generated by AI" not in core | CODE |
| HIGH | tests/test_container_meta.py | 531 | <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 | 78 | <dc:description>Generated by AI</dc:description> | CODE |
| HIGH | tests/test_latex_meta.py | 30 | % Generated by Claude | CODE |
| HIGH⚡ | tests/test_latex_meta.py | 114 | assert "% Generated by Claude" not in out | STRING |
| HIGH⚡ | tests/test_security_hardening.py | 462 | text = b"x" * 1000 + b"Generated by AI" | CODE |
| HIGH⚡ | tests/test_security_hardening.py | 476 | text = b"x" * 1000 + b"Generated by AI" | CODE |
| HIGH⚡ | tests/test_security_hardening.py | 505 | payload = b"Comment\x00\x00" + zlib.compress(b"Generated by AI") | 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 | 629 | # says the content is AI-generated. A bare "generated by" is not enough, so | COMMENT |
| HIGH | service/scripts/container_meta.py | 2062 | # 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 |
|---|---|---|---|---|
| HIGH | tests/test_audit.py | 486 | except OSError: | CODE |
| HIGH | skills/clean-user-facing-text/scripts/common.py | 395 | except (ImportError, OSError, ValueError): | CODE |
| HIGH | skills/clean-user-facing-text/scripts/common.py | 334 | except OSError: | CODE |
| HIGH | service/scripts/markdiffusion_harness.py | 95 | except Exception: # noqa: S110 - optional torch device detection | CODE |
| HIGH | service/scripts/markdiffusion_harness.py | 178 | except Exception: # noqa: S110 - optional numpy import | CODE |
| HIGH | service/scripts/markdiffusion_harness.py | 185 | except Exception: # noqa: S110 - optional torch import | CODE |
| HIGH | service/scripts/text_watermark.py | 420 | except (ImportError, ModuleNotFoundError): | CODE |
| HIGH | service/scripts/image_meta.py | 59 | except (ImportError, OSError, ValueError): | CODE |
| HIGH | service/scripts/clean_ctrlregen.py | 55 | except Exception: # noqa: S110 - optional torch device detection | CODE |
| HIGH | service/scripts/audit_website.py | 502 | except Exception: # noqa: S110 - robots.txt is optional; fall through to None | CODE |
| HIGH | service/scripts/detect_text_watermark.py | 88 | except Exception: # noqa: S110 - optional torch device detection | CODE |
| HIGH | service/scripts/container_meta.py | 2369 | except _ZIP_PARSE_ERRORS: | CODE |
| HIGH | service/scripts/container_meta.py | 341 | except _ZIP_PARSE_ERRORS: | CODE |
| HIGH | service/scripts/container_meta.py | 4383 | except zipfile.BadZipFile: | CODE |
| HIGH | service/scripts/container_meta.py | 2546 | except Exception: # noqa: S110 - malformed embedded media; keep original part | CODE |
| HIGH | service/scripts/container_meta.py | 3051 | except Exception: # noqa: S110 - malformed embedded media; keep original | CODE |
| HIGH | service/scripts/container_meta.py | 327 | except (UnicodeDecodeError, AttributeError): | CODE |
| HIGH | service/scripts/common.py | 395 | except (ImportError, OSError, ValueError): | CODE |
| HIGH | service/scripts/common.py | 334 | except OSError: | CODE |
| HIGH | service/scripts/bench_synthid_text.py | 219 | except (OSError, subprocess.SubprocessError): | CODE |
| HIGH | service/scripts/bench_synthid_text.py | 241 | except (OSError, subprocess.SubprocessError): | CODE |
| HIGH | service/scripts/clean_staged.py | 98 | except OSError: | CODE |
| HIGH | stealer/download_prompts.py | 118 | except (ValueError, json.JSONDecodeError): | CODE |
| HIGH | stealer/download_prompts.py | 226 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install_skill.py | 18 | CODE | |
| LOW | tests/test_install_skill.py | 3 | CODE | |
| LOW | tests/test_unscanned_file_accounting.py | 15 | CODE | |
| LOW | tests/test_capabilities_tooling.py | 15 | CODE | |
| LOW | tests/test_website_format_routing.py | 8 | CODE | |
| LOW | tests/test_source_extensions_scanned.py | 9 | CODE | |
| LOW | tests/conftest.py | 11 | CODE | |
| LOW | tests/test_space_confidence_parity.py | 15 | CODE | |
| LOW | tests/test_frontmatter_false_positives.py | 18 | 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_stealer.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 | 12 | 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_pdf_attachments.py | 9 | 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_watermark_endpoint.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_humanize_pass.py | 3 | CODE | |
| LOW | tests/test_single_quoted_attributes.py | 10 | CODE | |
| LOW | tests/test_synthid_text_server.py | 3 | CODE | |
| LOW | tests/test_source_extension_coverage.py | 8 | 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_clean_strategy.py | 3 | CODE | |
| LOW | tests/test_json_exit_code.py | 3 | CODE | |
| LOW | tests/test_synthid_score.py | 3 | CODE | |
| LOW | tests/test_latex_meta.py | 8 | 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 | |
| 51 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 | 178 | except Exception as e: | CODE |
| LOW | service/scripts/clean_file.py | 214 | except Exception as e: | CODE |
| LOW | service/scripts/clean_file.py | 251 | 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 | 163 | except Exception as e: | CODE |
| LOW | service/scripts/text_watermark.py | 463 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 252 | except Exception: | CODE |
| LOW | service/scripts/image_meta.py | 1494 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 1530 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 1652 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 1757 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 1834 | except Exception as e: | CODE |
| LOW | service/scripts/image_meta.py | 2280 | except Exception as e: | CODE |
| LOW | service/scripts/server.py | 150 | except Exception: | CODE |
| LOW | service/scripts/server.py | 194 | except Exception: | CODE |
| LOW | service/scripts/server.py | 1512 | except Exception as e: | CODE |
| LOW | service/scripts/server.py | 1661 | 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 | 479 | except Exception: # noqa: S112 - try next candidate sitemap on any failure | CODE |
| LOW | service/scripts/audit_website.py | 502 | except Exception: # noqa: S110 - robots.txt is optional; fall through to None | CODE |
| LOW | service/scripts/audit_website.py | 607 | except Exception as e: | CODE |
| LOW | service/scripts/audit_website.py | 619 | except Exception as e: | CODE |
| LOW | service/scripts/audit_website.py | 624 | except Exception as e: | CODE |
| LOW | service/scripts/detect_text_watermark.py | 88 | except Exception: # noqa: S110 - optional torch device detection | CODE |
| LOW | service/scripts/detect_text_watermark.py | 158 | except Exception: | CODE |
| LOW | service/scripts/detect_text_watermark.py | 288 | except Exception as e: | CODE |
| LOW | service/scripts/detect_text_watermark.py | 346 | except Exception as e: | CODE |
| LOW | service/scripts/detect_text_watermark.py | 419 | except Exception as e: # a bad request must not kill the worker | CODE |
| LOW | service/scripts/detect_text_watermark.py | 460 | except Exception as e: | CODE |
| LOW | service/scripts/rewrite_text.py | 256 | except Exception as e: # defensive: the detector contract is fail-soft | CODE |
| LOW | service/scripts/rewrite_text.py | 439 | except Exception: # torch absent; run on CPU/auto | CODE |
| LOW | service/scripts/rewrite_text.py | 453 | except Exception as e: # fail-soft: optional dependency | CODE |
| LOW | service/scripts/container_meta.py | 456 | except Exception: # noqa: S112 - malformed data URI; skip to next match | CODE |
| LOW | service/scripts/container_meta.py | 504 | except Exception: | CODE |
| LOW | service/scripts/container_meta.py | 527 | except Exception: | CODE |
| LOW | service/scripts/container_meta.py | 1705 | except Exception as e: | CODE |
| LOW | service/scripts/container_meta.py | 2546 | except Exception: # noqa: S110 - malformed embedded media; keep original part | CODE |
| LOW | service/scripts/container_meta.py | 3051 | except Exception: # noqa: S110 - malformed embedded media; keep original | CODE |
| LOW | service/scripts/container_meta.py | 3272 | except Exception as e: | CODE |
| LOW | service/scripts/container_meta.py | 3450 | except Exception as e: | CODE |
| LOW | service/scripts/container_meta.py | 3538 | except Exception as e: | CODE |
| LOW | service/scripts/container_meta.py | 3620 | except Exception: | CODE |
| LOW | service/scripts/container_meta.py | 3626 | except Exception: | CODE |
| LOW | service/scripts/container_meta.py | 3720 | except Exception: | CODE |
| LOW | service/scripts/container_meta.py | 4009 | except Exception: | CODE |
| LOW | service/scripts/text_detectors.py | 204 | except Exception as e: | CODE |
| 18 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install_skill.py | 87 | CODE | |
| LOW | tests/test_container_meta.py | 321 | 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 | 30 | CODE | |
| LOW | service/scripts/text_watermark.py | 183 | CODE | |
| LOW | service/scripts/text_watermark.py | 337 | CODE | |
| LOW | service/scripts/image_meta.py | 279 | CODE | |
| LOW | service/scripts/image_meta.py | 376 | CODE | |
| LOW | service/scripts/image_meta.py | 428 | CODE | |
| LOW | service/scripts/image_meta.py | 520 | CODE | |
| LOW | service/scripts/image_meta.py | 633 | CODE | |
| LOW | service/scripts/image_meta.py | 900 | CODE | |
| LOW | service/scripts/image_meta.py | 959 | CODE | |
| LOW | service/scripts/image_meta.py | 1173 | CODE | |
| LOW | service/scripts/image_meta.py | 1258 | CODE | |
| LOW | service/scripts/image_meta.py | 1294 | CODE | |
| LOW | service/scripts/image_meta.py | 1323 | CODE | |
| LOW | service/scripts/image_meta.py | 1861 | CODE | |
| LOW | service/scripts/image_meta.py | 1940 | CODE | |
| LOW | service/scripts/image_meta.py | 2004 | CODE | |
| LOW | service/scripts/image_meta.py | 2129 | CODE | |
| LOW | service/scripts/image_meta.py | 2219 | CODE | |
| LOW | service/scripts/av_meta.py | 101 | CODE | |
| LOW | service/scripts/av_meta.py | 297 | CODE | |
| LOW | service/scripts/av_meta.py | 426 | CODE | |
| LOW | service/scripts/av_meta.py | 502 | CODE | |
| LOW | service/scripts/av_meta.py | 531 | CODE | |
| LOW | service/scripts/server.py | 829 | CODE | |
| LOW | service/scripts/server.py | 1135 | CODE | |
| LOW | service/scripts/server.py | 1178 | CODE | |
| LOW | service/scripts/server.py | 1226 | CODE | |
| LOW | service/scripts/server.py | 1465 | CODE | |
| LOW | service/scripts/server.py | 1601 | CODE | |
| LOW | service/scripts/audit_website.py | 328 | CODE | |
| LOW | service/scripts/audit_website.py | 384 | CODE | |
| LOW | service/scripts/audit_website.py | 461 | CODE | |
| LOW | service/scripts/audit_website.py | 508 | CODE | |
| LOW | service/scripts/audit_website.py | 524 | CODE | |
| LOW | service/scripts/detect_text_watermark.py | 380 | CODE | |
| LOW | service/scripts/container_meta.py | 285 | CODE | |
| LOW | service/scripts/container_meta.py | 437 | CODE | |
| LOW | service/scripts/container_meta.py | 486 | CODE | |
| LOW | service/scripts/container_meta.py | 744 | CODE | |
| LOW | service/scripts/container_meta.py | 783 | CODE | |
| LOW | service/scripts/container_meta.py | 924 | CODE | |
| LOW | service/scripts/container_meta.py | 1004 | CODE | |
| LOW | service/scripts/container_meta.py | 1104 | CODE | |
| LOW | service/scripts/container_meta.py | 1524 | CODE | |
| LOW | service/scripts/container_meta.py | 1776 | CODE | |
| LOW | service/scripts/container_meta.py | 2012 | CODE | |
| LOW | service/scripts/container_meta.py | 2335 | CODE | |
| LOW | service/scripts/container_meta.py | 2496 | CODE | |
| LOW | service/scripts/container_meta.py | 2690 | CODE | |
| LOW | service/scripts/container_meta.py | 2725 | CODE | |
| LOW | service/scripts/container_meta.py | 2863 | CODE | |
| LOW | service/scripts/container_meta.py | 2995 | CODE | |
| LOW | service/scripts/container_meta.py | 3158 | CODE | |
| LOW | service/scripts/container_meta.py | 3668 | CODE | |
| 14 more matches not shown… | ||||
| 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 | compose.yaml | 33 | # Optional SynthID text watermark generator sidecar (harness profile). | 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 | 247 | # No RLIMIT_AS here: every child is the MarkLLM harness or rewrite_text.py, | COMMENT |
| MEDIUM | service/scripts/bench_synthid_text.py | 1561 | # A clear by a hair is not a robust removal: require the | COMMENT |
| MEDIUM | service/scripts/bench_synthid_text.py | 1995 | # best robust clear rate, independent of whether a recommendable full | COMMENT |
| MEDIUM | service/scripts/bench_synthid_text.py | 1996 | # pipeline was published. A removal tactic that clears (best robust % > 0) | COMMENT |
| MEDIUM | service/scripts/bench_synthid_text.py | 2315 | """Population robust clear rate for a candidate, optionally preferring holdout. | STRING |
| 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 | compose.yaml | 1 | # Whole-infra bring-up for watermarks-remover. | COMMENT |
| LOW | tests/test_prose_values_not_provenance.py | 321 | 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/container_meta.py | 4141 | # exiftool writes PDFs *incrementally*: it appends a | COMMENT |
| LOW | service/scripts/container_meta.py | 4201 | "(embedded image suspected); running deep image pass" | 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 |
|---|---|---|---|---|
| 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 |
|---|---|---|---|---|
| MEDIUM | tests/test_clean_video.py | 202 | # remux orchestration is exercised without a GPU checkout. | COMMENT |
| MEDIUM⚡ | service/scripts/bench_synthid_text.py | 547 | # 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 | 2219 | CODE | |
| LOW | service/scripts/rewrite_text.py | 730 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | service/scripts/container_meta.py | 4171 | def _settle(ran: bool) -> None: | CODE |
| LOW | stealer/__init__.py | 18 | __all__ = ["__version__"] | CODE |