Semantic search over videos using Gemini Embedding 2 or Qwen3-VL.
This report summarizes scanner evidence for ssrajadh/sentrysearch, a Python project with 4,534 GitHub stars. SynthScan examined 12,752 lines of code across 49 source files, recording 449 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 55.1 (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? 309 finding(s).
Are imports declared and package/API names verified? 21 finding(s).
Are wrappers, guards, and repeated structures necessary? 418 finding(s).
Which changes need focused human review? 449 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 449 distinct pattern matches across 9 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 | 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 | 253 | def _parse_embedding_response(resp) -> list[float]: | CODE |
| LOW | sentrysearch/cli.py | 46 | def _reject_conflicting_model_flags( | CODE |
| LOW | sentrysearch/cli.py | 111 | def _strip_private_result_fields(results: list[dict]) -> list[dict]: | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 24 | def test_hf_id_passed_through(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 28 | def test_local_path_passed_through(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 32 | def test_env_var_used_when_no_model_given(self, monkeypatch): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 36 | def test_explicit_model_beats_env_var(self, monkeypatch): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 110 | def test_video_pixels_reach_get_input_embeddings(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 116 | def test_stub_base_alone_drops_them(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 123 | def test_rope_state_reset_for_video_only_call(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 129 | def test_rope_state_untouched_without_pixels(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 134 | def test_grid_still_forwarded(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 140 | def test_pending_cleared_after_call(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 147 | def test_pending_cleared_when_call_raises(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 206 | def test_missing_chunk_file_raises(self, tmp_path): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 212 | def test_missing_image_file_raises(self, tmp_path): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 218 | def test_missing_local_dir_is_not_sent_to_the_hub(self, tmp_path): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 227 | def test_non_apple_silicon_refuses_to_load(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 235 | def test_factory_builds_mlx_backend(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 248 | def test_rerank_refuses_rather_than_falling_back_to_gemini(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 256 | def test_local_backend_still_gets_the_qwen_reranker(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 265 | def test_highlights_backend_flag_accepts_mlx(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 279 | def test_mlx_gets_its_own_collection(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 285 | def test_mlx_does_not_collide_with_local(self): | CODE |
| LOW⚡ | tests/test_mlx_embedder.py | 290 | def test_path_reduced_to_basename(self): | CODE |
| LOW | tests/test_mlx_embedder.py | 59 | def test_true_on_apple_silicon(self): | CODE |
| LOW | tests/test_mlx_embedder.py | 159 | def test_image_path_unaffected(self): | CODE |
| LOW | tests/test_mlx_embedder.py | 171 | def test_box_is_not_a_registered_type(self): | 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_chunker.py | 207 | def test_detected_from_tesla_readme(self, tmp_path): | CODE |
| LOW⚡ | tests/test_chunker.py | 215 | def test_detected_from_folder_name(self, tmp_path): | CODE |
| LOW⚡ | tests/test_chunker.py | 224 | def test_unrelated_readme_is_not_tesla(self, tmp_path): | CODE |
| LOW⚡ | tests/test_chunker.py | 232 | def test_no_readme_is_not_tesla(self, tmp_path): | CODE |
| LOW⚡ | tests/test_chunker.py | 241 | def test_reports_why_a_file_is_unreadable(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_search.py | 130 | def test_dedupe_still_fills_n_results(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 |
| 238 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | sentrysearch/store.py | 232 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/store.py | 234 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/store.py | 288 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/store.py | 290 | # ------------------------------------------------------------------ | 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/litellm_embedder.py | 109 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/litellm_embedder.py | 111 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/litellm_embedder.py | 133 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/litellm_embedder.py | 135 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | sentrysearch/_toolkit_cache.py | 122 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/_toolkit_cache.py | 126 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/gemini_embedder.py | 22 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/gemini_embedder.py | 24 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/gemini_embedder.py | 106 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/gemini_embedder.py | 108 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/gemini_embedder.py | 118 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/gemini_embedder.py | 120 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/gemini_embedder.py | 176 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/gemini_embedder.py | 178 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 766 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 768 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1123 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1125 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1261 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1263 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1441 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sentrysearch/cli.py | 1443 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 356 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 358 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 434 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 436 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1476 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1478 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1508 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1510 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1548 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1550 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1601 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | sentrysearch/cli.py | 1603 | # ----------------------------------------------------------------------- | 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 |
| 16 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | sentrysearch/overlay.py | 37 | except Exception: | CODE |
| HIGH | sentrysearch/overlay.py | 44 | except ImportError: | CODE |
| HIGH | sentrysearch/overlay.py | 191 | except Exception: | CODE |
| HIGH | sentrysearch/overlay.py | 175 | except ValueError: | CODE |
| HIGH | sentrysearch/overlay.py | 517 | except OSError: | CODE |
| HIGH | sentrysearch/_toolkit_cache.py | 47 | except OSError: | CODE |
| HIGH | sentrysearch/cli.py | 174 | except Exception: | CODE |
| HIGH | sentrysearch/cli.py | 578 | except Exception: | CODE |
| HIGH | sentrysearch/cli.py | 1432 | except OSError: | CODE |
| HIGH | sentrysearch/cli.py | 698 | except OSError: | CODE |
| HIGH | sentrysearch/cli.py | 1367 | except OSError: | CODE |
| 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 | 357 | except Exception: | CODE |
| LOW | sentrysearch/chunker.py | 397 | except Exception: | CODE |
| LOW | sentrysearch/_toolkit_cache.py | 44 | except Exception: | CODE |
| LOW | sentrysearch/gemini_embedder.py | 156 | 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 | 760 | except Exception as e: | CODE |
| LOW⚡ | sentrysearch/cli.py | 1117 | except Exception as e: | CODE |
| LOW⚡ | sentrysearch/cli.py | 1255 | except Exception as e: | CODE |
| LOW⚡ | sentrysearch/cli.py | 1435 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 76 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 104 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 174 | except Exception: | CODE |
| LOW | sentrysearch/cli.py | 224 | except Exception as exc: | CODE |
| LOW | sentrysearch/cli.py | 417 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 578 | except Exception: | CODE |
| LOW | sentrysearch/cli.py | 584 | except Exception: | CODE |
| LOW | sentrysearch/cli.py | 937 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 1423 | except Exception as e: | CODE |
| LOW | sentrysearch/cli.py | 1459 | 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 |
| LOW | sentrysearch/mlx_embedder.py | 209 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sentrysearch/reranker.py | 3 | CODE | |
| LOW | sentrysearch/litellm_embedder.py | 18 | 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_mlx_embedder.py | 4 | 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 | 109 | CODE | |
| LOW | sentrysearch/gemini_embedder.py | 150 | CODE | |
| LOW | sentrysearch/cli.py | 361 | CODE | |
| LOW | sentrysearch/cli.py | 474 | CODE | |
| LOW | sentrysearch/cli.py | 808 | CODE | |
| LOW | sentrysearch/cli.py | 1057 | CODE | |
| LOW | sentrysearch/cli.py | 1163 | CODE | |
| LOW | sentrysearch/cli.py | 1308 | 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 |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sentrysearch/gemini_embedder.py | 38 | def set_rate(self, max_per_minute: int) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sentrysearch/local_embedder.py | 204 | CODE |