AI Slop Code RIsk Monitor

TagStudioDev/TagStudio

A User-Focused Photo & File Management System

15.1 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for TagStudioDev/TagStudio, a Python project with 7,238 GitHub stars. SynthScan examined 55,794 lines of code across 283 source files, recording 399 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 15.1 (Elevated pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

15.1
Adjusted Signal
15.1
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
7.2K
Stars
Python
Language
55.8K
Lines of Code
283
Files
399
Pattern Hits
2026-10-12
Scan Date
0.14
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 21.4/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 254 finding(s).

Hallucinated Dependency & Supply Chain Risk 30.8/100 · MEDIUM

Are imports declared and package/API names verified? 39 finding(s).

Agent Over-Engineering Ratio 24.8/100 · LOW

Are wrappers, guards, and repeated structures necessary? 263 finding(s).

PR Review Velocity Impact 49.7/100 · MEDIUM

Which changes need focused human review? 399 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 33HIGH 7MEDIUM 18LOW 341

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 399 distinct pattern matches across 16 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.

Hallucination Indicators33 hits · 395 pts
SeverityFileLineSnippetContext
CRITICAL⚡src/tagstudio/qt/qt_driver.py431 self.main_window.menu_bar.open_library_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py439 self.main_window.menu_bar.save_library_backup_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py444 self.main_window.menu_bar.settings_action.triggered.connect(self.open_settings_modal)CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py455 self.main_window.menu_bar.open_on_start_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py460 self.main_window.menu_bar.refresh_dir_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py465 self.main_window.menu_bar.close_library_action.triggered.connect(self.close_library)CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py470 self.main_window.menu_bar.new_tag_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py474 self.main_window.menu_bar.select_all_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py478 self.main_window.menu_bar.select_inverse_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py482 self.main_window.menu_bar.clear_select_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py488 self.main_window.menu_bar.copy_fields_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py492 self.main_window.menu_bar.paste_fields_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py496 self.main_window.menu_bar.add_tag_to_selected_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py500 self.main_window.menu_bar.delete_file_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py504 self.main_window.menu_bar.tag_manager_action.triggered.connect(self.tag_manager.show)CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py506 self.main_window.menu_bar.color_manager_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py510 self.main_window.menu_bar.field_template_manager_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py523 self.main_window.menu_bar.library_info_action.triggered.connect(create_library_info_window)CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py530 self.main_window.menu_bar.show_filenames_action.triggered.connect(on_show_filenames_action)CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py540 self.main_window.menu_bar.decrease_thumbnail_size_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py549 self.main_window.menu_bar.increase_thumbnail_size_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py562 self.main_window.menu_bar.fix_unlinked_entries_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py571 self.main_window.menu_bar.fix_ignored_entries_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py580 self.main_window.menu_bar.fix_dupe_files_action.triggered.connect(create_dupe_files_modal)CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py583 self.main_window.menu_bar.clear_thumb_cache_action.triggered.connect(CODE
CRITICAL⚡src/tagstudio/qt/qt_driver.py595 self.main_window.menu_bar.folders_to_tags_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py607 self.main_window.menu_bar.about_action.triggered.connect(create_about_modal)CODE
CRITICALsrc/tagstudio/qt/qt_driver.py608 self.main_window.menu_bar.changelog_action.triggered.connect(self.show_changelog)CODE
CRITICALsrc/tagstudio/qt/qt_driver.py759 self.main_window.menu_bar.ignore_modal_action.triggered.disconnect()CODE
CRITICALsrc/tagstudio/qt/qt_driver.py771 self.main_window.menu_bar.ignore_modal_action.triggered.connect(self.ignore_modal.show)CODE
CRITICALsrc/tagstudio/qt/mixed/tag_color_manager.py129 else self.driver.main_window.preview_panel.containers.update_from_entry( # noqa: E501CODE
CRITICALsrc/tagstudio/qt/mixed/tag_color_manager.py146 else self.driver.main_window.preview_panel.containers.update_from_entry( # noqa: E501CODE
CRITICALsrc/tagstudio/qt/mixed/item_thumb.py502 self.driver.main_window.preview_panel.containers.update_toggled_tag(CODE
Hyper-Verbose Identifiers153 hits · 153 pts
SeverityFileLineSnippetContext
LOWtests/core/test_decompression.py31def test_unsupported_compression_format(tmp_path: Path):CODE
LOWtests/core/test_decompression.py53def test_inner_and_display_ext(filename: str, inner_ext: str | None, display_ext: str):CODE
LOWtests/core/test_decompression.py70def test_decompressed_uncompressed_file(tmp_path: Path):CODE
LOWtests/core/test_decompression.py78def test_decompressed_compressed_file(tmp_path: Path):CODE
LOWtests/core/test_decompression.py90def test_decompressed_too_large(tmp_path: Path):CODE
LOWtests/core/test_decompression.py98def test_decompressed_corrupt_file(tmp_path: Path):CODE
LOWtests/core/test_base_driver.py23def test_verify_library_path_missing():CODE
LOWtests/core/test_base_driver.py41def test_verify_library_path_not_a_library(tmp_path: Path):CODE
LOWtests/core/test_base_driver.py60def test_verify_library_path_allow_creation(tmp_path: Path):CODE
LOWtests/core/test_base_driver.py71def test_verify_library_path_existing_library(library_dir: Path):CODE
LOWtests/core/test_media_types.py12def test_register_and_contains():CODE
LOW⚡tests/core/test_media_types.py27def test_contains_missing_group_raises_error():CODE
LOW⚡tests/core/test_media_types.py32def test_dot_notation_chains_to_parents():CODE
LOW⚡tests/core/test_media_types.py40def test_explicit_chain_group():CODE
LOW⚡tests/core/test_media_types.py47def test_equivalent_extensions():CODE
LOW⚡tests/core/test_media_types.py56def test_get_equivalent_exts_defaults_to_itself():CODE
LOWtests/core/test_media_types.py89def test_add_name_aliases_and_lookup():CODE
LOWtests/core/library/test_library.py51def test_library_update_alias(library: Library, generate_tag: Callable[..., Tag]):CODE
LOWtests/core/library/test_library.py175def test_search_library_case_insensitive(library: Library):CODE
LOWtests/core/library/test_library.py205def test_remove_text_field_entry_with_multiple_fields(library: Library, entry_full: Entry):CODE
LOWtests/core/library/test_library.py232def test_update_entry_with_multiple_identical_text_fields(library: Library, entry_full: Entry):CODE
LOWtests/core/library/test_library.py356def test_remove_tags_from_entries(library: Library, entry_full: Entry):CODE
LOW⚡tests/core/library/test_library.py393def test_path_search_default_with_sep(library: Library):CODE
LOW⚡tests/core/library/test_library.py399def test_path_search_glob_after(library: Library):CODE
LOW⚡tests/core/library/test_library.py405def test_path_search_glob_in_front(library: Library):CODE
LOW⚡tests/core/library/test_library.py411def test_path_search_glob_both_sides(library: Library):CODE
LOW⚡tests/core/library/test_library.py418def test_path_search_ilike_glob_equality(library: Library):CODE
LOWtests/core/library/test_library.py441def test_path_search_like_glob_equality(library: Library):CODE
LOWtests/core/library/test_library.py470def test_filetype_return_one_filetype(CODE
LOWtests/core/library/test_migrations.py61def test_migration_with_existing_field_template_tables(tmp_path: Path):CODE
LOWtests/core/library/test_refresh.py34def test_refresh_multi_byte_filenames(library: Library):CODE
LOWtests/core/library/test_unlinked_entries.py20def test_refresh_unlinked_entries(library: Library):CODE
LOWtests/qt/test_flow_widget.py11def test_flow_layout_happy_path():CODE
LOWtests/qt/test_field_containers.py15def test_update_selection_empty(qt_driver: QtDriver):CODE
LOWtests/qt/test_field_containers.py28def test_update_selection_single(qt_driver: QtDriver, entry_full: Entry):CODE
LOWtests/qt/test_field_containers.py40def test_update_selection_multiple(qt_driver: QtDriver):CODE
LOWtests/qt/test_field_containers.py55def test_add_tag_to_selection_single(qt_driver: QtDriver, entry_full: Entry):CODE
LOWtests/qt/test_field_containers.py72def test_add_same_tag_to_selection_single(qt_driver: QtDriver, entry_full: Entry):CODE
LOWtests/qt/test_field_containers.py89def test_add_tag_to_selection_multiple(qt_driver: QtDriver):CODE
LOW⚡tests/qt/test_field_containers.py190def test_exclude_tag_category(CODE
LOWtests/qt/test_field_containers.py213def test_exclude_self_from_tag_category(CODE
LOWtests/qt/test_field_containers.py236def test_exclude_self_from_tag_category_without_parent(CODE
LOWtests/qt/test_theme_system.py23def test_theme_colorscheme_handling(theme: Theme, expected_call):CODE
LOW⚡tests/qt/test_edit_tag_panel.py186def test_edit_tag_panel_set_tag(qtbot: QtBot, library: Library, generate_tag: Callable[..., Tag]):CODE
LOW⚡tests/qt/test_edit_tag_panel.py195def test_edit_tag_panel_build_tag(qtbot: QtBot, library: Library):CODE
LOW⚡tests/qt/test_edit_tag_panel.py204def test_edit_tag_panel_show_category_from_parent(CODE
LOWtests/qt/test_edit_tag_panel.py28def test_edit_tag_panel_add_tag_callback(qt_driver: QtDriver):CODE
LOWtests/qt/test_edit_tag_panel.py45def test_edit_tag_panel_add_sub_tag_callback(CODE
LOWtests/qt/test_edit_tag_panel.py59def test_edit_tag_panel_remove_subtag_callback(CODE
LOWtests/qt/test_edit_tag_panel.py82def test_edit_tag_panel_add_alias_callback(CODE
LOWtests/qt/test_edit_tag_panel.py95def test_edit_tag_panel_remove_alias_callback(CODE
LOWtests/qt/test_edit_tag_panel.py120def test_edit_tag_panel_set_parent_tags(CODE
LOWtests/qt/test_edit_tag_panel.py137def test_edit_tag_panel_add_aliases(CODE
LOWtests/qt/test_edit_tag_panel.py168def test_edit_tag_panel_set_aliases(CODE
LOWtests/qt/test_edit_tag_panel.py218def test_edit_tag_panel_show_category_from_grandparent(CODE
LOWtests/qt/test_edit_tag_panel.py233def test_edit_tag_panel_add_category_through_parent(CODE
LOWtests/qt/test_edit_tag_panel.py252def test_edit_tag_panel_add_category_through_grandparent(CODE
LOWtests/qt/test_edit_tag_panel.py272def test_edit_tag_panel_remove_category_through_parent(CODE
LOWtests/qt/test_edit_tag_panel.py290def test_edit_tag_panel_remove_category_through_grandparent(CODE
LOWtests/qt/test_edit_tag_panel.py309def test_edit_tag_panel_exclude_from_category(CODE
93 more matches not shown…
Modern Structural Boilerplate53 hits · 56 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/json/library.py1694 def update_tag(self, tag: Tag) -> None:CODE
LOWsrc/tagstudio/core/library/json/library.py1833 def update_entry_path(self, entry_id: int, path: str | Path) -> None:CODE
LOWsrc/tagstudio/core/library/json/library.py1837 def update_entry_filename(self, entry_id: int, filename: str | Path) -> None:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1629 def update_color(self, old_color_group: TagColorGroup, new_color_group: TagColorGroup) -> None:CODE
LOWsrc/tagstudio/core/library/alchemy/migrations.py160 def _set_version(self, key: str, value: int) -> None:CODE
LOWsrc/tagstudio/qt/qt_driver.py1355 def update_completions_list(self, text: str) -> None:CODE
LOWsrc/tagstudio/qt/qt_driver.py1480 def update_browsing_state(self, state: BrowsingState | None = None) -> None:CODE
LOW⚡src/tagstudio/qt/mixed/field_widget.py116 def set_copy_callback(self, callback: Callable[[], None] | None = None) -> None:CODE
LOW⚡src/tagstudio/qt/mixed/field_widget.py124 def set_edit_callback(self, callback: Callable[[], None] | None = None) -> None:CODE
LOW⚡src/tagstudio/qt/mixed/field_widget.py132 def set_remove_callback(self, callback: Callable[[], None] | None = None) -> None:CODE
LOW⚡src/tagstudio/qt/mixed/field_widget.py140 def set_inner_widget(self, widget: FieldWidget) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py155 def set_title(self, title: str) -> None:CODE
LOWsrc/tagstudio/qt/mixed/file_attributes.py96 def update_date_label(self, filepath: Path | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/media_player.py277 def set_tint_opacity(self, opacity: int) -> None:CODE
LOWsrc/tagstudio/qt/mixed/media_player.py458 def _update_controls(self, size: QSize) -> None:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py339 def set_mode(self, mode: ItemType | None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py365 def set_extension(self, filename: Path) -> None:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py398 def set_count(self, count: str) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py103 def update_from_entry(self, entry_id: int, update_badges: bool = True) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py139 def update_toggled_tag(self, tag_id: int, toggle_value: bool) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py460 def update_datetime_field(self, field: DatetimeField, name: str, value: str) -> None:CODE
LOWsrc/tagstudio/qt/controllers/tag_box.py36 def set_entries(self, entries: list[int]) -> None:CODE
LOWsrc/tagstudio/qt/controllers/file_opener_label.py30 def set_file_path(self, filepath: Path) -> None:CODE
LOW⚡src/tagstudio/qt/controllers/capsule.py61 def set_edit_enabled(self, enabled: bool) -> None:CODE
LOW⚡src/tagstudio/qt/controllers/capsule.py65 def set_text(self, text: str) -> None:CODE
LOW⚡src/tagstudio/qt/controllers/capsule.py68 def set_color_group(self, color_group: TagColorGroup | None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/info_button.py126 def _set_opacity(self, opacity: float) -> None:CODE
LOWsrc/tagstudio/qt/controllers/info_button.py136 def _update_icon(self, hovered: bool) -> None:CODE
LOW…/tagstudio/qt/controllers/edit_field_template_modal.py45 def set_field_template(self, field_template: BaseFieldTemplate | None = None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/field_suggest_box.py93 def _update_hint_icon(self) -> None:CODE
LOWsrc/tagstudio/qt/controllers/field_suggest_box.py106 def _set_item_widget(self, item: BaseFieldTemplate | None, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/inspector.py163 def _set_selection_callback(self) -> None:CODE
LOWsrc/tagstudio/qt/controllers/inspector.py227 def set_selection(self, selected: list[int], update_preview: bool = True) -> None:CODE
LOWsrc/tagstudio/qt/controllers/tag_suggest_box.py111 def _update_hint_icon(self) -> None:CODE
LOWsrc/tagstudio/qt/controllers/tag_suggest_box.py137 def _set_item_widget(self, item: Tag | None, index: int) -> None:CODE
LOW…agstudio/qt/controllers/field_template_search_panel.py115 def set_item_widget(self, item: BaseFieldTemplate | None, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/edit_tag_panel.py182 def _set_color_button(self, color_group: TagColorGroup | None) -> None:CODE
LOW⚡src/tagstudio/qt/controllers/edit_tag_panel.py268 def update_category_exclusion(category_tag: Tag, checked: bool) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel.py92 def set_limit_items(self, limit_items: list[tuple[str, int]]) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel.py103 def set_limit_index(self, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel.py191 def update_items(self, query: str | None = None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel.py240 def set_item_widget(self, item: T | None, index: int) -> None: # pyright: ignore[reportUnusedParameter]CODE
LOWsrc/tagstudio/qt/controllers/tag_search_panel.py114 def set_item_widget(self, item: Tag | None, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py111 def set_placeholder_text(self, text: str) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py134 def set_hint_icon(self, icon: Image.Image | None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py256 def _update_hint_icon(self) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py259 def _update_items(self, query: str | None = None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py319 def _update_search_field_style(self) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py331 def _set_item_widget(self, item: T | None, index: int) -> None: # pyright: ignore[reportUnusedParameter]CODE
LOWsrc/tagstudio/qt/controllers/horizontal_scroll_area.py19 def set_inverted(self, is_inverted: bool) -> None:CODE
LOWsrc/tagstudio/qt/views/thumb_button.py93 def set_selected(self, value: bool) -> None:CODE
LOWsrc/tagstudio/qt/views/tag_box_view.py36 def set_tags(self, tags: Iterable[Tag]) -> None:CODE
LOWsrc/tagstudio/qt/views/styles/palette.py29 def set_palette(palette: QPalette) -> None:CODE
Deep Nesting55 hits · 53 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/media_types.py190CODE
LOWsrc/tagstudio/core/query_lang/tokenizer.py71CODE
LOWsrc/tagstudio/core/query_lang/tokenizer.py99CODE
LOWsrc/tagstudio/core/query_lang/ast.py101CODE
LOWsrc/tagstudio/core/library/ignore.py198CODE
LOWsrc/tagstudio/core/library/alchemy/library.py231CODE
LOWsrc/tagstudio/core/library/alchemy/library.py858CODE
LOWsrc/tagstudio/core/library/alchemy/library.py943CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1004CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1222CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1317CODE
LOWsrc/tagstudio/core/library/alchemy/visitors.py58CODE
LOWsrc/tagstudio/core/library/alchemy/visitors.py175CODE
LOW…o/core/library/alchemy/registries/unlinked_registry.py70CODE
LOW…core/library/alchemy/registries/dupe_files_registry.py29CODE
LOWsrc/tagstudio/qt/cache_manager.py150CODE
LOWsrc/tagstudio/qt/qt_driver.py959CODE
LOWsrc/tagstudio/qt/qt_driver.py1274CODE
LOWsrc/tagstudio/qt/qt_driver.py1355CODE
LOWsrc/tagstudio/qt/qt_driver.py1433CODE
LOWsrc/tagstudio/qt/mixed/folders_to_tags.py104CODE
LOWsrc/tagstudio/qt/mixed/drop_import_modal.py103CODE
LOWsrc/tagstudio/qt/mixed/drop_import_modal.py185CODE
LOWsrc/tagstudio/qt/mixed/file_attributes.py129CODE
LOWsrc/tagstudio/qt/mixed/media_player.py327CODE
LOWsrc/tagstudio/qt/mixed/pagination.py122CODE
LOWsrc/tagstudio/qt/utils/file_opener.py18CODE
LOWsrc/tagstudio/qt/controllers/autofill_line_edit.py41CODE
LOWsrc/tagstudio/qt/controllers/field_suggest_box.py93CODE
LOWsrc/tagstudio/qt/controllers/inspector.py171CODE
LOWsrc/tagstudio/qt/controllers/inspector.py227CODE
LOWsrc/tagstudio/qt/controllers/tag_suggest_box.py111CODE
LOWsrc/tagstudio/qt/controllers/preview_thumb.py40CODE
LOWsrc/tagstudio/qt/controllers/preview_thumb.py119CODE
LOWsrc/tagstudio/qt/controllers/changelog_modal.py153CODE
LOWsrc/tagstudio/qt/controllers/changelog_modal.py173CODE
LOWsrc/tagstudio/qt/controllers/edit_tag_panel.py213CODE
LOWsrc/tagstudio/qt/helpers/mnemonics.py38CODE
LOWsrc/tagstudio/qt/helpers/mnemonics.py126CODE
LOWsrc/tagstudio/previews/file_renderer.py514CODE
LOWsrc/tagstudio/previews/file_renderer.py706CODE
LOWsrc/tagstudio/previews/renderers/ebook.py60CODE
LOWsrc/tagstudio/previews/renderers/paint_dot_net.py45CODE
LOWsrc/tagstudio/previews/renderers/archive.py145CODE
LOWsrc/tagstudio/previews/renderers/medibang_paint.py44CODE
LOWsrc/tagstudio/previews/renderers/audio.py69CODE
LOWsrc/tagstudio/previews/renderers/audio.py110CODE
LOWsrc/tagstudio/previews/renderers/video.py56CODE
LOWsrc/tagstudio/previews/vendored/blender_thumbnailer.py16CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py181CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py491CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py647CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py857CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py1082CODE
LOWsrc/tagstudio/previews/vendored/pydub/utils.py17CODE
Decorative Section Separators14 hits · 52 pts
SeverityFileLineSnippetContext
MEDIUMsrc/tagstudio/qt/mixed/pagination.py36 # --------------------------------------COMMENT
MEDIUMsrc/tagstudio/qt/views/edit_tag_panel_view.py127 # ----------------------------------------------------------------------COMMENT
MEDIUMsrc/tagstudio/previews/vendored/blender_thumbnailer.py48 # --------------------------------------------------------------COMMENT
MEDIUMsrc/tagstudio/previews/vendored/blender_thumbnailer.py60 # --------------------------------------------------------------COMMENT
MEDIUM⚡src/tagstudio/previews/vendored/blender_thumbnailer.py79 # ----------------------------------------------------------COMMENT
MEDIUM⚡src/tagstudio/previews/vendored/blender_thumbnailer.py89 # ----------------------------------------------------------COMMENT
MEDIUM⚡src/tagstudio/previews/vendored/blender_thumbnailer.py96 # --------------------------------------------------------------COMMENT
MEDIUMsrc/tagstudio/previews/vendored/blender_thumbnailer.py110 # --------------------------------------------------------------COMMENT
MEDIUM⚡src/tagstudio/previews/vendored/blender_thumbnailer.py146 # ----------------------------------------------------------COMMENT
MEDIUM⚡src/tagstudio/previews/vendored/blender_thumbnailer.py150 # ----------------------------------------------------------COMMENT
MEDIUM⚡src/tagstudio/previews/vendored/blender_thumbnailer.py154 # ----------------------------------------------------------COMMENT
MEDIUM⚡src/tagstudio/previews/vendored/blender_thumbnailer.py162 # ----------------------------------------------------------COMMENT
MEDIUMsrc/tagstudio/previews/vendored/blender_thumbnailer.py180 # --------------------------------------------------------------COMMENT
MEDIUMsrc/tagstudio/previews/vendored/blender_thumbnailer.py186 # --------------------------------------------------------------COMMENT
Excessive Try-Catch Wrapping35 hits · 36 pts
SeverityFileLineSnippetContext
LOWtests/core/library/test_migrations.py54 except Exception as e:CODE
LOWsrc/tagstudio/__main__.py65 except Exception:CODE
LOWsrc/tagstudio/core/ts_core.py34 except Exception as e:CODE
LOWsrc/tagstudio/core/library/refresh.py110 except Exception as e:CODE
LOWsrc/tagstudio/core/library/json/library.py397 except Exception:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py321 except Exception as e:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py479 except Exception as e:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1809 except Exception as e:CODE
LOWsrc/tagstudio/core/library/alchemy/migrations.py132 except Exception as e:CODE
LOWsrc/tagstudio/qt/qt_driver.py1675 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/migration_modal.py379 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/migration_modal.py423 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py57 except Exception:CODE
LOWsrc/tagstudio/qt/utils/file_opener.py99 except Exception:CODE
LOWsrc/tagstudio/qt/utils/file_deleter.py41 except Exception as e:CODE
LOWsrc/tagstudio/qt/utils/file_deleter.py55 except Exception as e:CODE
LOWsrc/tagstudio/qt/controllers/inspector.py275 except Exception as e:CODE
LOWsrc/tagstudio/qt/controllers/edit_tag_panel.py432 except Exception as e:CODE
LOWsrc/tagstudio/previews/file_renderer.py597 except Exception as e:CODE
LOWsrc/tagstudio/previews/file_renderer.py753 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/clip_studio.py65 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/ebook.py82 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/raster_image.py121 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/blender.py63 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/paint_dot_net.py75 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/archive.py174 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/medibang_paint.py80 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/audio.py193 except Exception as e:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py25except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py191 except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py286 except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py406 except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py531 except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py690 except Exception:CODE
MEDIUMsrc/tagstudio/previews/vendored/pydub/audio_segment.py283def __eq__(self, other):CODE
Empty Error Handlers4 hits · 18 pts
SeverityFileLineSnippetContext
HIGHsrc/tagstudio/qt/qt_driver.py129except RuntimeError:CODE
HIGHsrc/tagstudio/qt/controllers/preview_thumb.py58except (CODE
HIGHsrc/tagstudio/qt/views/layouts/thumb_grid_layout.py210except ValueError:CODE
HIGHsrc/tagstudio/previews/file_renderer.py668except TypeError:CODE
Structural Annotation Overuse10 hits · 16 pts
SeverityFileLineSnippetContext
LOW⚡src/tagstudio/core/library/json/library.py493 # Step 1: Verify default built-in tags are present.COMMENT
LOW⚡src/tagstudio/core/library/json/library.py497 # Step 2: Create a Tag object and append it to the internal Tags list,COMMENT
LOWsrc/tagstudio/core/library/json/library.py532 # Step 3: Map each Tag's subtags together now that all Tag objects in it.COMMENT
LOWsrc/tagstudio/core/library/json/library.py633 # Step 1: Create a Collation object and append it toCOMMENT
LOWsrc/tagstudio/core/library/json/library.py1934 # NOTE: The following commented-out code enables the abilityCOMMENT
LOWsrc/tagstudio/previews/file_renderer.py132 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
LOWsrc/tagstudio/previews/file_renderer.py156 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
LOWsrc/tagstudio/previews/file_renderer.py218 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
LOWsrc/tagstudio/previews/file_renderer.py249 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
LOWsrc/tagstudio/previews/file_renderer.py477 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
Over-Commented Block18 hits · 14 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/json/library.py61 # self.mask: list[id] = NoneCOMMENT
LOWsrc/tagstudio/core/library/json/library.py301COMMENT
LOWsrc/tagstudio/core/library/json/library.py341 self.ext_list: list[str] = []COMMENT
LOWsrc/tagstudio/core/library/json/library.py681 self.filename_to_entry_id_map[(entry.path / entry.filename)] = entry.idCOMMENT
LOWsrc/tagstudio/core/library/json/library.py1161COMMENT
LOWsrc/tagstudio/core/library/json/library.py1421 # Assume that this ID from the cluster is not in the Entry.COMMENT
LOWsrc/tagstudio/core/library/json/library.py1441 # Since this term could technically map to multiple IDs, iterate over itCOMMENT
LOWsrc/tagstudio/core/library/json/library.py1501 context: list[str] = None,COMMENT
LOWsrc/tagstudio/core/library/json/library.py1521 # # print(COMMENT
LOW…tudio/resources/templates/ts_ignore_template_blank.txt1# This is a '.ts_ignore' file for TagStudio.COMMENT
LOW…c/tagstudio/resources/templates/ts_ignore_template.txt1# This is a '.ts_ignore' file for TagStudio.COMMENT
LOWsrc/tagstudio/qt/mixed/item_thumb.py141COMMENT
LOWsrc/tagstudio/qt/mixed/item_thumb.py161 self.top_layout.setObjectName("topLayout")COMMENT
LOWsrc/tagstudio/qt/mixed/item_thumb.py221 # self.item_type_badge.setPixmap(COMMENT
LOWsrc/tagstudio/previews/vendored/blender_thumbnailer.py41COMMENT
LOWsrc/tagstudio/previews/vendored/blender_thumbnailer.py81 #COMMENT
LOWsrc/tagstudio/previews/vendored/blender_thumbnailer.py101 # 7 pointer sizeCOMMENT
LOWsrc/tagstudio/previews/vendored/blender_thumbnailer.py141 if len(bhead) < sizeof_bhead:COMMENT
Cross-Language Confusion3 hits · 12 pts
SeverityFileLineSnippetContext
HIGHsrc/tagstudio/qt/qt_driver.py1487 self.browsing_history.push(state)CODE
HIGHsrc/tagstudio/qt/controllers/changelog_modal.py206 span = (fragment.position(), fragment.length())CODE
HIGHsrc/tagstudio/qt/controllers/changelog_modal.py291 self._image_widths[url.toString()] or image.width(),CODE
Redundant / Tautological Comments5 hits · 9 pts
SeverityFileLineSnippetContext
LOWtests/qt/test_field_containers.py144 # Check if the container is the Meta Tags categoryCOMMENT
LOWtests/qt/test_field_containers.py148 # Check if the container is the Tags categoryCOMMENT
LOW⚡tests/qt/test_field_containers.py177 # Check if the container is the Meta Tags categoryCOMMENT
LOW⚡tests/qt/test_field_containers.py181 # Check if the container is the custom "foo" categoryCOMMENT
LOWsrc/tagstudio/previews/file_renderer.py658 # Check if the file is supposed to be ignored and render an overlay if neededCOMMENT
Self-Referential Comments3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMsrc/tagstudio/core/library/ignore.py61 # Create a version of a prefix-less pattern that starts with "**/"COMMENT
MEDIUMsrc/tagstudio/previews/renderers/vector_image.py57 # Create an image to draw the svg to and a painter to do the drawingCOMMENT
MEDIUMsrc/tagstudio/previews/renderers/vector_image.py61 # Create an svg renderer, then render to the painterCOMMENT
Verbosity Indicators4 hits · 8 pts
SeverityFileLineSnippetContext
LOW⚡src/tagstudio/core/library/json/library.py493 # Step 1: Verify default built-in tags are present.COMMENT
LOW⚡src/tagstudio/core/library/json/library.py497 # Step 2: Create a Tag object and append it to the internal Tags list,COMMENT
LOWsrc/tagstudio/core/library/json/library.py532 # Step 3: Map each Tag's subtags together now that all Tag objects in it.COMMENT
LOWsrc/tagstudio/core/library/json/library.py633 # Step 1: Create a Collation object and append it toCOMMENT
AI Structural Patterns4 hits · 4 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/alchemy/models.py137CODE
LOWsrc/tagstudio/core/utils/silent_subprocess.py15CODE
LOWsrc/tagstudio/core/utils/silent_subprocess.py92CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py857CODE
AI Slop Vocabulary2 hits · 3 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/qt/views/underlined_widget_view.py18 # HACK: I don't know why I can't just use a QFrame for the outline.COMMENT
LOWsrc/tagstudio/previews/vendored/pydub/utils.py54 # If ffprobe didn't give any information, just return itCOMMENT
Unused Imports3 hits · 2 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/alchemy/fields.py5CODE
LOWsrc/tagstudio/qt/qt_driver.py43CODE
LOWsrc/tagstudio/previews/renderers/raster_image.py27CODE