Semantic search over videos using Gemini Embedding 2 or Qwen3-VL.
This report presents the forensic synthetic code analysis of ssrajadh/sentrysearch, a Python project with 4,400 GitHub stars. SynthScan v2.0 examined 10,527 lines of code across 45 source files, recording 345 pattern matches distributed across 7 syntactic categories. The overall adjusted score of 52.3 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 345 distinct pattern matches across 7 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 |
|---|---|---|---|---|
| MEDIUM | sentrysearch/store.py | 149 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/store.py | 151 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/store.py | 205 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/store.py | 207 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/overlay.py | 51 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/overlay.py | 53 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/overlay.py | 137 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/overlay.py | 139 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/_toolkit_cache.py | 122 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/_toolkit_cache.py | 126 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/gemini_embedder.py | 21 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/gemini_embedder.py | 23 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/gemini_embedder.py | 43 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/gemini_embedder.py | 45 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/gemini_embedder.py | 55 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/gemini_embedder.py | 57 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/gemini_embedder.py | 91 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/gemini_embedder.py | 93 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 652 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 654 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 986 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 988 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1120 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1122 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1288 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1290 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 313 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 315 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 391 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 393 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1323 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1325 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1355 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1357 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1395 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1397 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1448 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1450 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 9 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 11 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 33 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 35 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/conftest.py | 62 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/conftest.py | 64 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/conftest.py | 74 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/conftest.py | 76 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 46 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 48 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 69 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 71 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 83 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 85 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 155 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 157 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 174 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_chunker.py | 176 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_chunker.py | 21 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_chunker.py | 23 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_store.py | 148 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_store.py | 150 | # --------------------------------------------------------------------------- | COMMENT |
| 10 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sentrysearch/metadata.py | 112 | def _strip_emulation_prevention_bytes(data: bytes) -> bytes: | CODE |
| LOW | sentrysearch/chunker.py | 67 | def _parse_duration_from_ffmpeg_output(stderr_text: str) -> float: | CODE |
| LOW | sentrysearch/qwen_cloud_embedder.py | 33 | def default_dashscope_embedding_model() -> str: | CODE |
| LOW | sentrysearch/qwen_cloud_embedder.py | 68 | def _is_transient_transport_error(exc: BaseException) -> bool: | CODE |
| LOW | sentrysearch/qwen_cloud_embedder.py | 251 | def _parse_embedding_response(resp) -> list[float]: | CODE |
| LOW | sentrysearch/cli.py | 29 | def _reject_conflicting_model_flags( | CODE |
| LOW | sentrysearch/cli.py | 94 | def _strip_private_result_fields(results: list[dict]) -> list[dict]: | CODE |
| LOW⚡ | tests/test_chunker.py | 40 | def test_ffmpeg_error_message_raised(self): | CODE |
| LOW⚡ | tests/test_chunker.py | 57 | def test_falls_back_to_imageio(self, _mock_which): | CODE |
| LOW⚡ | tests/test_chunker.py | 62 | def test_raises_when_no_ffmpeg(self, _mock_which): | CODE |
| LOW⚡ | tests/test_chunker.py | 88 | def test_short_video_single_chunk(self, tiny_video): | CODE |
| LOW⚡ | tests/test_chunker.py | 97 | def test_splits_into_multiple_chunks(self, longer_video): | CODE |
| LOW⚡ | tests/test_chunker.py | 113 | def test_overlap_equal_to_chunk_duration_raises(self, tiny_video): | CODE |
| LOW⚡ | tests/test_chunker.py | 117 | def test_overlap_greater_than_chunk_duration_raises(self, tiny_video): | CODE |
| LOW⚡ | tests/test_chunker.py | 121 | def test_nonexistent_file_raises(self): | CODE |
| LOW⚡ | tests/test_chunker.py | 127 | def test_short_video_single_span(self): | CODE |
| LOW⚡ | tests/test_chunker.py | 131 | def test_matches_chunk_video_starts(self, longer_video): | CODE |
| LOW⚡ | tests/test_chunker.py | 142 | def test_invalid_overlap_raises(self): | CODE |
| LOW⚡ | tests/test_chunker.py | 146 | def test_long_video_multiple_spans(self): | CODE |
| LOW⚡ | tests/test_chunker.py | 160 | def test_creates_preprocessed_file(self, tiny_video, tmp_path): | CODE |
| LOW⚡ | tests/test_chunker.py | 167 | def test_falls_back_on_invalid_input(self, tmp_path): | CODE |
| LOW⚡ | tests/test_chunker.py | 179 | def test_finds_supported_video_files(self, tmp_path): | CODE |
| LOW | tests/test_search.py | 45 | def test_n_results_limits_output(self, tmp_store, mock_embed_query): | CODE |
| LOW | tests/test_search.py | 57 | def test_dedupe_drops_near_duplicates(self, tmp_store, mock_embed_query): | CODE |
| LOW | tests/test_search.py | 87 | def test_dedupe_none_returns_all(self, tmp_store, mock_embed_query): | CODE |
| LOW | tests/test_search.py | 122 | def test_dedupe_single_result(self, tmp_store, mock_embed_query): | CODE |
| LOW | tests/test_trimmer.py | 38 | def test_special_chars_cleaned(self): | CODE |
| LOW | tests/test_trimmer.py | 51 | def test_end_before_start_raises(self, tiny_video, tmp_path): | CODE |
| LOW | tests/test_trimmer.py | 56 | def test_creates_output_directory(self, tiny_video, tmp_path): | CODE |
| LOW | tests/test_trimmer.py | 76 | def test_empty_results_raises(self, tmp_path): | CODE |
| LOW | tests/test_trimmer.py | 82 | def test_trims_multiple_results(self, tiny_video, tmp_path): | CODE |
| LOW | tests/test_trimmer.py | 103 | def test_count_exceeding_results_trims_all(self, tiny_video, tmp_path): | CODE |
| LOW | tests/test_trimmer.py | 111 | def test_reuses_rerank_clip_path(self, tmp_path, monkeypatch): | CODE |
| LOW | tests/test_trimmer.py | 138 | def test_missing_rerank_clip_path_falls_back_to_trim( | CODE |
| LOW | tests/test_trimmer.py | 169 | def test_empty_results_raises(self, tmp_path): | CODE |
| LOW⚡ | tests/test_gemini_reranker.py | 14 | def test_raises_without_api_key(self): | CODE |
| LOW⚡ | tests/test_gemini_reranker.py | 21 | def test_creates_client_with_key(self, mock_client_cls): | CODE |
| LOW⚡ | tests/test_gemini_reranker.py | 31 | def test_score_uses_flash_json_retry_and_limiter( | CODE |
| LOW | tests/test_gemini_reranker.py | 62 | def test_score_returns_none_for_unparseable_output( | CODE |
| LOW⚡ | tests/test_local_embedder.py | 22 | def test_full_hf_id_passed_through(self): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 26 | def test_custom_model_name_passed_through(self): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 30 | def test_aliases_dict_has_expected_keys(self): | CODE |
| LOW | tests/test_local_embedder.py | 60 | def test_quantize_none_by_default(self): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 74 | def test_missing_torch_raises_local_model_error(self): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 80 | def test_load_model_called_once(self): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 88 | def test_intel_mac_points_to_gemini_backend(self, monkeypatch): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 97 | def test_linux_cpu_only_uses_general_warning(self, monkeypatch): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 106 | def test_apple_silicon_cpu_only_uses_general_warning(self, monkeypatch): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 117 | def test_alias_returned_as_is(self): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 121 | def test_full_hf_id_reversed_to_alias(self): | CODE |
| LOW⚡ | tests/test_local_embedder.py | 125 | def test_custom_model_sanitized(self): | CODE |
| LOW | tests/test_local_embedder.py | 153 | def test_embed_query_calls_load_model(self): | CODE |
| LOW | tests/test_local_embedder.py | 162 | def test_embed_video_chunk_calls_load_model(self): | CODE |
| LOW | tests/test_metadata.py | 13 | def test_removes_prevention_byte(self): | CODE |
| LOW | tests/test_metadata.py | 17 | def test_preserves_non_prevention_sequences(self): | CODE |
| LOW | tests/test_metadata.py | 28 | def test_nonexistent_file_returns_empty(self): | CODE |
| LOW | tests/test_metadata.py | 31 | def test_synthetic_video_no_sei(self, tiny_video): | CODE |
| LOW | tests/test_reranker.py | 22 | def test_prompt_is_video_generic(self): | CODE |
| LOW | tests/test_reranker.py | 27 | def test_schema_requires_score_fields(self): | CODE |
| LOW⚡ | tests/test_reranker.py | 38 | def test_accepts_json_code_fence(self): | CODE |
| 155 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sentrysearch/overlay.py | 37 | except Exception: | CODE |
| LOW | sentrysearch/overlay.py | 191 | except Exception: | CODE |
| LOW | sentrysearch/reranker.py | 134 | except Exception as exc: | CODE |
| LOW | sentrysearch/chunker.py | 39 | except Exception: | CODE |
| LOW | sentrysearch/chunker.py | 60 | except Exception as exc: # pragma: no cover - environment specific | CODE |
| LOW | sentrysearch/chunker.py | 298 | except Exception: | CODE |
| LOW | sentrysearch/chunker.py | 338 | except Exception: | CODE |
| LOW | sentrysearch/_toolkit_cache.py | 44 | except Exception: | CODE |
| LOW⚡ | sentrysearch/gemini_embedder.py | 65 | except Exception as exc: | CODE |
| LOW | sentrysearch/qwen_cloud_embedder.py | 128 | except Exception as exc: # noqa: BLE001 — narrow follow-up below | CODE |
| LOW | sentrysearch/local_embedder.py | 64 | except Exception: | CODE |
| LOW | sentrysearch/local_embedder.py | 124 | except Exception: | CODE |
| LOW | sentrysearch/local_embedder.py | 259 | except Exception as e: | CODE |
| LOW⚡ | sentrysearch/cli.py | 646 | except Exception as e: | CODE |
| LOW⚡ | sentrysearch/cli.py | 980 | except Exception as e: | CODE |
| LOW⚡ | sentrysearch/cli.py | 1114 | except Exception as e: | CODE |
| LOW⚡ | sentrysearch/cli.py | 1282 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 59 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 87 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 135 | except Exception: | CODE |
| LOW | sentrysearch/cli.py | 183 | except Exception as exc: | CODE |
| LOW | sentrysearch/cli.py | 374 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 516 | except Exception: | CODE |
| LOW | sentrysearch/cli.py | 807 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 1270 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 1306 | except Exception as e: | CODE |
| LOW | sentrysearch/qwen_reranker.py | 70 | except Exception: | CODE |
| LOW | sentrysearch/qwen_reranker.py | 147 | except Exception as e: | CODE |
| LOW | sentrysearch/qwen_reranker.py | 158 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sentrysearch/reranker.py | 3 | CODE | |
| LOW | sentrysearch/highlights.py | 8 | CODE | |
| LOW | sentrysearch/_toolkit_cache.py | 8 | CODE | |
| LOW | sentrysearch/qwen_cloud_embedder.py | 13 | CODE | |
| LOW | sentrysearch/local_embedder.py | 161 | CODE | |
| LOW | sentrysearch/qwen_reranker.py | 3 | CODE | |
| LOW | sentrysearch/qwen_reranker.py | 104 | CODE | |
| LOW | sentrysearch/search.py | 3 | CODE | |
| LOW | sentrysearch/embedder.py | 9 | CODE | |
| LOW | sentrysearch/embedder.py | 9 | CODE | |
| LOW | sentrysearch/embedder.py | 10 | CODE | |
| LOW | sentrysearch/embedder.py | 10 | CODE | |
| LOW | sentrysearch/embedder.py | 10 | CODE | |
| LOW | sentrysearch/gemini_reranker.py | 3 | CODE | |
| LOW | tests/test_search.py | 5 | CODE | |
| LOW | tests/test_metadata.py | 3 | CODE | |
| LOW | tests/test_toolkit_cache.py | 3 | CODE | |
| LOW | tests/test_toolkit_cache.py | 13 | CODE | |
| LOW | tests/test_highlights.py | 3 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sentrysearch/store.py | 41 | CODE | |
| LOW | sentrysearch/gemini_embedder.py | 59 | CODE | |
| LOW | sentrysearch/cli.py | 318 | CODE | |
| LOW | sentrysearch/cli.py | 425 | CODE | |
| LOW | sentrysearch/cli.py | 688 | CODE | |
| LOW | sentrysearch/cli.py | 921 | CODE | |
| LOW | sentrysearch/cli.py | 1022 | CODE | |
| LOW | sentrysearch/cli.py | 1158 | CODE | |
| LOW | sentrysearch/embedder.py | 19 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sentrysearch/local_embedder.py | 119 | # Check if model is already cached locally | COMMENT |
| LOW | sentrysearch/cli.py | 727 | # Check if data exists under a different model | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sentrysearch/local_embedder.py | 204 | CODE |