Anki is a smart spaced repetition flashcard program
This report summarizes scanner evidence for ankitects/anki, a Rust project with 31,901 GitHub stars. SynthScan examined 198,689 lines of code across 1410 source files, recording 1241 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 7.3 (Moderate 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? 562 finding(s).
Are imports declared and package/API names verified? 386 finding(s).
Are wrappers, guards, and repeated structures necessary? 748 finding(s).
Which changes need focused human review? 1241 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 1241 distinct pattern matches across 17 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⚡ | tools/prepare_release.py | 168 | def update_version_and_commit(version: str) -> None: | CODE |
| LOW | tools/docs_converter.py | 255 | def escape_text_preserve_html(raw: str) -> str: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 36 | def test_braces_escaped_in_plain_text(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 40 | def test_double_braced_field_still_escaped(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 44 | def test_anchor_braces_not_escaped(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 49 | def test_anchor_braces_not_escaped_with_complex_name(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 56 | def test_dollar_escaped_in_plain_text(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 60 | def test_double_dollar_not_escaped(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 65 | def test_braces_not_escaped_inside_fenced_code(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 71 | def test_dollars_not_escaped_inside_fenced_code(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 77 | def test_braces_not_escaped_inside_inline_code(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 81 | def test_dollars_not_escaped_inside_inline_code(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 87 | def test_html_comment_converted_to_mdx(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 93 | def test_comment_inside_fenced_code_untouched(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 100 | def test_angle_brackets_escaped_in_plain_text(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 105 | def test_angle_brackets_not_escaped_inside_fenced_code(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 110 | def test_angle_brackets_not_escaped_inside_inline_code(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 116 | def test_br_becomes_self_closing(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 120 | def test_br_closing_tag_dropped(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 124 | def test_img_becomes_self_closing(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 128 | def test_source_becomes_self_closing(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 138 | def test_hr_becomes_self_closing(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 144 | def test_unquoted_attr_gets_quoted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 159 | def test_title_quotes_escaped(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 163 | def test_original_heading_removed(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 176 | def test_md_extension_removed(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 181 | def test_html_extension_removed(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 186 | def test_md_extension_removed_with_anchor(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 190 | def test_md_extension_removed_with_query(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 194 | def test_non_md_link_unchanged(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 198 | def test_relative_nested_link_gets_dot_slash_prefix(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 202 | def test_dot_slash_link_is_not_double_prefixed(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 206 | def test_root_relative_link_is_not_prefixed(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 210 | def test_root_relative_html_extension_removed_with_query_and_anchor(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 214 | def test_absolute_html_extension_removed_with_query_and_anchor(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 229 | def test_heading_anchor_not_escaped(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 241 | def test_url_autolink_expanded(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 245 | def test_email_autolink_gets_mailto(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 256 | def test_note_admonish_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 263 | def test_warning_admonish_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 268 | def test_danger_admonish_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 273 | def test_summary_admonish_gets_heading(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 279 | def test_info_admonish_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 284 | def test_caution_admonish_maps_to_warning(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 289 | def test_example_admonish_maps_to_info(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 301 | def test_docs_ankiweb_net_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 306 | def test_faqs_domain_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 321 | def test_ankimobile_domain_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 325 | def test_addon_docs_domain_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 329 | def test_anchor_preserved_after_conversion(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 333 | def test_language_prefix_prepended(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 337 | def test_autolink_url_also_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 350 | def test_unrecognised_domain_not_converted(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 365 | def test_toc_comment_case_insensitive(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 376 | def test_angle_brackets_not_escaped_in_indented_block(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 380 | def test_braces_escaped_in_indented_block(self) -> None: | CODE |
| LOW⚡ | tools/tests/test_docs_converter.py | 384 | def test_dollars_escaped_in_indented_block(self) -> None: | CODE |
| LOW | tools/tests/test_mintlify_hooks.py | 10 | def test_signature_includes_arguments_and_return_type() -> None: | CODE |
| LOW | tools/tests/test_mintlify_hooks.py | 22 | def test_render_hook_marks_deprecated_docstring() -> None: | CODE |
| LOW | tools/tests/test_mintlify_hooks.py | 45 | def test_render_hook_marks_obsolete_docstring() -> None: | CODE |
| 390 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/mintlify_hooks.py | 3 | CODE | |
| LOW | tools/__init__.py | 3 | CODE | |
| LOW | tools/tests/test_docs_converter.py | 3 | CODE | |
| LOW | tools/tests/test_mintlify_hooks.py | 3 | CODE | |
| LOW | pylib/hatch_build.py | 5 | CODE | |
| LOW | pylib/hatch_build.py | 6 | CODE | |
| LOW | pylib/tools/hookslib.py | 8 | CODE | |
| LOW | pylib/tests/test_stats.py | 7 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 5 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 7 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 8 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 10 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 12 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 13 | CODE | |
| LOW | pylib/tests/test_collection.py | 8 | CODE | |
| LOW | pylib/tests/test_collection.py | 12 | CODE | |
| LOW | pylib/tests/shared.py | 4 | CODE | |
| LOW | pylib/tests/test_find.py | 8 | CODE | |
| LOW | pylib/tests/test_config.py | 4 | CODE | |
| LOW | pylib/tests/test_models.py | 6 | CODE | |
| LOW | pylib/tests/test_models.py | 11 | CODE | |
| LOW | pylib/tests/test_httpclient.py | 4 | CODE | |
| LOW | pylib/tests/test_stdmodels.py | 4 | CODE | |
| LOW | pylib/anki/tags.py | 12 | CODE | |
| LOW | pylib/anki/lang.py | 4 | CODE | |
| LOW | pylib/anki/sound.py | 10 | CODE | |
| LOW | pylib/anki/db.py | 12 | CODE | |
| LOW | pylib/anki/hooks.py | 14 | CODE | |
| LOW | pylib/anki/hooks.py | 22 | CODE | |
| LOW | pylib/anki/media.py | 4 | CODE | |
| LOW | pylib/anki/media.py | 15 | CODE | |
| LOW | pylib/anki/config.py | 20 | CODE | |
| LOW | pylib/anki/httpclient.py | 8 | CODE | |
| LOW | pylib/anki/models.py | 4 | CODE | |
| LOW | pylib/anki/models.py | 19 | CODE | |
| LOW | pylib/anki/_backend.py | 4 | CODE | |
| LOW | pylib/anki/_backend.py | 14 | CODE | |
| LOW | pylib/anki/stdmodels.py | 4 | CODE | |
| LOW | pylib/anki/cards.py | 4 | CODE | |
| LOW | pylib/anki/cards.py | 17 | CODE | |
| LOW | pylib/anki/notes.py | 4 | CODE | |
| LOW | pylib/anki/consts.py | 4 | CODE | |
| LOW | pylib/anki/utils.py | 4 | CODE | |
| LOW | pylib/anki/dbproxy.py | 4 | CODE | |
| LOW | pylib/anki/dbproxy.py | 13 | CODE | |
| LOW | pylib/anki/stats.py | 5 | CODE | |
| LOW | pylib/anki/stats.py | 15 | CODE | |
| LOW | pylib/anki/collection.py | 4 | CODE | |
| LOW | pylib/anki/collection.py | 78 | CODE | |
| LOW | pylib/anki/template.py | 29 | CODE | |
| LOW | pylib/anki/find.py | 5 | CODE | |
| LOW | pylib/anki/errors.py | 4 | CODE | |
| LOW | pylib/anki/rsbackend.py | 9 | CODE | |
| LOW | pylib/anki/rsbackend.py | 10 | CODE | |
| LOW | pylib/anki/rsbackend.py | 10 | CODE | |
| LOW | pylib/anki/rsbackend.py | 11 | CODE | |
| LOW | pylib/anki/rsbackend.py | 12 | CODE | |
| LOW | pylib/anki/rsbackend.py | 13 | CODE | |
| LOW | pylib/anki/rsbackend.py | 13 | CODE | |
| LOW | pylib/anki/decks.py | 4 | CODE | |
| 320 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tools/prepare_release.py | 168 | def update_version_and_commit(version: str) -> None: | CODE |
| LOW | pylib/anki/lang.py | 186 | def set_lang(lang: str) -> None: | CODE |
| LOW | pylib/anki/db.py | 105 | def set_progress_handler(self, *args: Any) -> None: | CODE |
| LOW | pylib/anki/db.py | 121 | def set_autocommit(self, autocommit: bool) -> None: | CODE |
| LOW | pylib/anki/models.py | 104 | def _update_cache(self, notetype: NotetypeDict) -> None: | CODE |
| LOW | pylib/anki/models.py | 327 | def set_sort_index(self, notetype: NotetypeDict, idx: int) -> None: | CODE |
| LOW | pylib/anki/models.py | 537 | def set_current(self, m: NotetypeDict) -> None: | CODE |
| LOW | pylib/anki/_backend.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | pylib/anki/cards.py | 172 | def set_render_output(self, output: anki.template.TemplateRenderOutput) -> None: | CODE |
| LOW | pylib/anki/cards.py | 235 | def set_user_flag(self, flag: int) -> None: | CODE |
| LOW | pylib/anki/notes.py | 193 | def set_tags_from_str(self, tags: str) -> None: | CODE |
| LOW | pylib/anki/consts.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | pylib/anki/collection.py | 898 | def set_browser_card_columns(self, columns: list[str]) -> None: | CODE |
| LOW⚡ | pylib/anki/collection.py | 910 | def set_browser_note_columns(self, columns: list[str]) -> None: | CODE |
| LOW⚡ | pylib/anki/collection.py | 995 | def _set_load_balancer_enabled(self, value: bool) -> None: | CODE |
| LOW⚡ | pylib/anki/collection.py | 1005 | def _set_enable_fsrs_short_term_with_steps(self, value: bool) -> None: | CODE |
| LOW | pylib/anki/collection.py | 101 | logger = logging.getLogger(__name__) | CODE |
| LOW | pylib/anki/collection.py | 239 | def set_v3_scheduler(self, enabled: bool) -> None: | CODE |
| LOW | pylib/anki/collection.py | 309 | def set_schema_modified(self) -> None: | CODE |
| LOW | pylib/anki/collection.py | 1136 | def set_wants_abort(self) -> None: | CODE |
| LOW | pylib/anki/decks.py | 327 | def update_config(self, conf: DeckConfigDict, preserve_usn: bool = False) -> None: | CODE |
| LOW | pylib/anki/decks.py | 362 | def set_config_id_for_deck_dict(self, deck: DeckDict, id: DeckConfigId) -> None: | CODE |
| LOW | pylib/anki/decks.py | 557 | def set_deck(self, cids: list[anki.cards.CardId], did: DeckId) -> None: | CODE |
| LOW | pylib/anki/scheduler/legacy.py | 102 | def _updateStats(self, card: Card, type: str, cnt: int = 1) -> None: | CODE |
| LOW | qt/hatch_build.py | 36 | def _set_anki_dependency(self, version: str, build_data: Dict[str, Any]) -> None: | CODE |
| LOW | qt/aqt/package.py | 44 | def update_progress(progress: Progress, update: ProgressUpdate) -> None: | CODE |
| LOW | qt/aqt/deckchooser.py | 40 | def _setup_ui(self, show_label: bool) -> None: | CODE |
| LOW | qt/aqt/deckchooser.py | 86 | def _update_button_label(self) -> None: | CODE |
| LOW | qt/aqt/sound.py | 784 | def _setup_dialog(self) -> None: | CODE |
| LOW | qt/aqt/notetypechooser.py | 58 | def _setup_ui(self, show_label: bool) -> None: | CODE |
| LOW | qt/aqt/notetypechooser.py | 160 | def _update_button_label(self) -> None: | CODE |
| LOW | qt/aqt/theme.py | 98 | def set_night_mode(self, val: bool) -> None: | CODE |
| LOW | qt/aqt/theme.py | 329 | def _update_stat_colors(self) -> None: | CODE |
| LOW | qt/aqt/addons.py | 606 | def update_supported_versions(self, items: list[AddonInfo]) -> None: | CODE |
| LOW | qt/aqt/addons.py | 661 | def set_config_help_action(self, module: str, action: Callable[[], str]) -> None: | CODE |
| LOW | qt/aqt/addons.py | 1531 | def update_info_received(future: Future) -> None: | CODE |
| LOW | qt/aqt/addons.py | 1602 | def update_info_received(future: Future) -> None: | CODE |
| LOW | qt/aqt/schema_change_tracker.py | 38 | def set_unchanged(self) -> None: | CODE |
| LOW⚡ | qt/aqt/editor_legacy.py | 587 | def set_cloze_button(self) -> None: | CODE |
| LOW⚡ | qt/aqt/editor_legacy.py | 595 | def set_image_occlusion_button(self) -> None: | CODE |
| LOW | qt/aqt/editor_legacy.py | 1240 | def update_occlusions_field(self) -> None: | CODE |
| LOW | qt/aqt/editor_legacy.py | 1394 | def _updateForegroundButton(self) -> None: | CODE |
| LOW | qt/aqt/editor_legacy.py | 730 | def _update_duplicate_display(self, result: NoteFieldsCheckResult.V) -> None: | STRING |
| LOW | qt/aqt/mediacheck.py | 62 | def _set_progress_enabled(self, enabled: bool) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 75 | def _setup_webview(self) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 174 | def update_collection(self, on_done: Callable[[], None]) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 221 | def update_profile(self) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 255 | def update_login_status(self) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 316 | def update_network(self) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 402 | def update_global(self) -> None: | CODE |
| LOW | qt/aqt/__init__.py | 353 | def _set_windows_shutdown_block_reason(self, reason: str) -> None: | CODE |
| LOW⚡ | qt/aqt/addcards_legacy.py | 62 | def set_deck(self, deck_id: DeckId) -> None: | CODE |
| LOW⚡ | qt/aqt/addcards_legacy.py | 65 | def set_note_type(self, note_type_id: NotetypeId) -> None: | CODE |
| LOW⚡ | qt/aqt/addcards_legacy.py | 68 | def set_note(self, note: Note, deck_id: DeckId | None = None) -> None: | CODE |
| LOW | qt/aqt/deckdescription.py | 33 | def _setup_and_show(self, deck: DeckDict) -> None: | CODE |
| LOW | qt/aqt/deckdescription.py | 41 | def _setup_ui(self) -> None: | CODE |
| LOW | qt/aqt/clayout.py | 106 | def update_current_ordinal_and_redraw(self, idx: int) -> None: | CODE |
| LOW | qt/aqt/debug_console.py | 83 | def _setup_scripts(self) -> None: | CODE |
| LOW | qt/aqt/debug_console.py | 89 | def _setup_actions(self) -> None: | CODE |
| LOW | qt/aqt/debug_console.py | 243 | def _setup_context_menu(self) -> None: | CODE |
| 95 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 30 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 32 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 149 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 151 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 170 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 172 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 223 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 225 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 235 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 237 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 250 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 252 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 295 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 297 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 355 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 357 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 370 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tools/tests/test_docs_converter.py | 372 | # =========================================================================== | COMMENT |
| MEDIUM | tools/tests/test_docs_converter.py | 10 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/tests/test_docs_converter.py | 12 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | qt/aqt/mpv.py | 1 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | qt/aqt/mpv.py | 25 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | ts/tests/e2e/context-switching.spec.ts | 168 | // ─── 1. Chooser UI and session behaviour ───────────────────────────────────── | COMMENT |
| MEDIUM | ts/tests/e2e/context-switching.spec.ts | 200 | // ─── 2. addNote payload ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | ts/tests/e2e/context-switching.spec.ts | 242 | // ─── 3. Mode B: context behaviour (default) ────────────────────────────────── | COMMENT |
| MEDIUM | ts/tests/e2e/context-switching.spec.ts | 386 | // ─── 4. Mode A: reopen context (deck-centric) ──────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pylib/tests/test_collection.py | 23 | except OSError: | CODE |
| HIGH | pylib/tests/test_models.py | 401 | except NotFoundError: | CODE |
| HIGH | pylib/anki/media.py | 66 | except FileNotFoundError: | CODE |
| HIGH | pylib/anki/utils.py | 176 | except FileExistsError: | CODE |
| HIGH | pylib/anki/utils.py | 193 | except OSError: | CODE |
| HIGH | qt/runanki.py | 14 | except ImportError: | CODE |
| HIGH | qt/aqt/sound.py | 297 | except ImportError: | CODE |
| HIGH | qt/aqt/sound.py | 394 | except subprocess.TimeoutExpired: | CODE |
| HIGH | qt/aqt/addons.py | 248 | except AbortAddonImport: | CODE |
| HIGH | qt/aqt/mediacheck.py | 86 | except AttributeError: | CODE |
| HIGH | qt/aqt/mpv.py | 156 | except ProcessLookupError: | CODE |
| HIGH | qt/aqt/mpv.py | 226 | except OSError: | CODE |
| HIGH | qt/aqt/__init__.py | 257 | except Exception: | CODE |
| HIGH | qt/aqt/clayout.py | 305 | except ValueError: | CODE |
| HIGH | qt/aqt/utils.py | 1105 | except RuntimeError: | CODE |
| HIGH | qt/aqt/utils.py | 1112 | except RuntimeError: | CODE |
| HIGH | qt/aqt/tagedit.py | 154 | except ValueError: | CODE |
| HIGH | qt/aqt/profiles.py | 400 | except Exception: | CODE |
| HIGH | qt/aqt/mediasrv.py | 264 | except KeyError: | CODE |
| HIGH | qt/installer/app/src/anki/__main__.py | 16 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/reload_webviews.py | 20 | print(f"Error: {message}", file=sys.stderr) | CODE |
| LOW | tools/reload_webviews.py | 42 | except Exception as e: | CODE |
| MEDIUM | tools/prepare_release.py | 151 | print(f"Error: tag '{version}' already exists", file=sys.stderr) | CODE |
| MEDIUM⚡ | tools/prepare_release.py | 162 | print(f"Error: GitHub release '{version}' already exists", file=sys.stderr) | CODE |
| MEDIUM | tools/prepare_release.py | 219 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| LOW | pylib/tools/hookslib.py | 129 | except Exception: | CODE |
| LOW | pylib/tools/hookslib.py | 165 | except Exception: | CODE |
| LOW | pylib/anki/lang.py | 212 | except Exception: | CODE |
| LOW | pylib/anki/hooks.py | 37 | except Exception: | CODE |
| LOW | pylib/anki/hooks.py | 48 | except Exception: | CODE |
| LOW | pylib/anki/syncserver.py | 15 | except Exception as exc: | CODE |
| LOW | pylib/anki/_backend.py | 120 | except Exception as error: | CODE |
| LOW | pylib/anki/_backend.py | 163 | except Exception as error: | CODE |
| LOW | pylib/anki/notes.py | 163 | except Exception as exc: | CODE |
| LOW | pylib/anki/utils.py | 31 | except Exception: | CODE |
| LOW | pylib/anki/utils.py | 217 | except Exception: | CODE |
| LOW | pylib/anki/utils.py | 291 | except Exception: | CODE |
| LOW | pylib/anki/stats.py | 725 | except Exception: | CODE |
| LOW | pylib/anki/latex.py | 173 | except Exception: | CODE |
| LOW | qt/aqt/sync.py | 52 | except Exception as e: | CODE |
| LOW | qt/aqt/sync.py | 112 | except Exception as err: | CODE |
| LOW | qt/aqt/sync.py | 261 | except Exception as err: | CODE |
| LOW | qt/aqt/sync.py | 293 | except Exception as err: | CODE |
| LOW | qt/aqt/sync.py | 323 | except Exception as err: | CODE |
| LOW | qt/aqt/deckconf.py | 270 | except Exception: | CODE |
| LOW | qt/aqt/sound.py | 377 | except Exception as e: | CODE |
| LOW | qt/aqt/sound.py | 390 | except Exception as e: | CODE |
| LOW | qt/aqt/sound.py | 570 | except Exception as e: | CODE |
| LOW | qt/aqt/sound.py | 870 | except Exception as e: | CODE |
| LOW | qt/aqt/theme.py | 357 | except Exception: | CODE |
| LOW | qt/aqt/ankihub.py | 42 | except Exception as exc: | CODE |
| LOW | qt/aqt/addons.py | 250 | except Exception: | CODE |
| LOW | qt/aqt/addons.py | 343 | except Exception: | CODE |
| LOW | qt/aqt/addons.py | 504 | except Exception: | CODE |
| LOW | qt/aqt/addons.py | 658 | except Exception: | CODE |
| LOW | qt/aqt/addons.py | 1140 | except Exception as e: | CODE |
| LOW | qt/aqt/addons.py | 1613 | except Exception as exc: | CODE |
| LOW | qt/aqt/addons.py | 1725 | except Exception as e: | CODE |
| LOW | qt/aqt/editor_legacy.py | 874 | except Exception as e: | CODE |
| LOW | qt/aqt/editor_legacy.py | 885 | except Exception as e: | CODE |
| LOW | qt/aqt/editor_legacy.py | 1151 | except Exception as e: | CODE |
| LOW | qt/aqt/preferences.py | 457 | except Exception: | CODE |
| LOW | qt/aqt/mpv.py | 398 | except Exception: | CODE |
| LOW | qt/aqt/tts.py | 499 | except Exception as exc: | CODE |
| LOW | qt/aqt/tts.py | 515 | except Exception: | CODE |
| LOW | qt/aqt/tts.py | 521 | except Exception: | CODE |
| LOW | qt/aqt/__init__.py | 257 | except Exception: | CODE |
| LOW | qt/aqt/__init__.py | 533 | except Exception: | CODE |
| LOW | qt/aqt/__init__.py | 649 | except Exception: | CODE |
| LOW | qt/aqt/__init__.py | 723 | except Exception: | CODE |
| LOW | qt/aqt/__init__.py | 818 | except Exception: | CODE |
| LOW | qt/aqt/debug_console.py | 351 | except Exception: | CODE |
| LOW | qt/aqt/changenotetype.py | 91 | except Exception as e: | CODE |
| LOW | qt/aqt/utils.py | 1041 | except Exception as exc: | STRING |
| LOW | qt/aqt/filtered_deck.py | 249 | except Exception as err: | CODE |
| LOW | qt/aqt/dbcheck.py | 56 | except Exception as e: | CODE |
| LOW | qt/aqt/editor.py | 509 | except Exception as e: | CODE |
| MEDIUM | qt/aqt/webview.py | 106 | print(f"Error opening '{qwebchannel}': {jsfile.error()}", file=sys.stderr) | CODE |
| MEDIUM | qt/aqt/main.py | 648 | def loadCollection(self) -> bool: | CODE |
| LOW | qt/aqt/main.py | 201 | except Exception: | CODE |
| 32 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/docs_converter.py | 255 | CODE | |
| LOW | pylib/anki/_backend.py | 203 | CODE | |
| LOW | pylib/anki/utils.py | 272 | CODE | |
| LOW | pylib/anki/stats.py | 211 | CODE | |
| LOW | pylib/anki/stats.py | 959 | CODE | |
| LOW | pylib/anki/collection.py | 217 | CODE | |
| LOW | pylib/anki/foreign_data/mnemosyne.py | 175 | CODE | |
| LOW | pylib/anki/scheduler/v3.py | 66 | CODE | |
| LOW | pylib/anki/scheduler/v3.py | 152 | CODE | |
| LOW | pylib/anki/scheduler/v3.py | 188 | CODE | |
| LOW | pylib/anki/scheduler/v3.py | 216 | CODE | |
| LOW | qt/aqt/sync.py | 138 | CODE | |
| LOW | qt/aqt/sound.py | 364 | CODE | |
| LOW | qt/aqt/customstudy.py | 90 | CODE | |
| LOW | qt/aqt/customstudy.py | 158 | CODE | |
| LOW | qt/aqt/customstudy.py | 177 | CODE | |
| LOW | qt/aqt/theme.py | 211 | CODE | |
| LOW | qt/aqt/editor_legacy.py | 434 | CODE | |
| LOW | qt/aqt/editor_legacy.py | 1004 | CODE | |
| LOW | qt/aqt/editor_legacy.py | 1056 | CODE | |
| LOW | qt/aqt/editor_legacy.py | 1709 | CODE | |
| LOW | qt/aqt/preferences.py | 485 | CODE | |
| LOW | qt/aqt/mpv.py | 173 | CODE | |
| LOW | qt/aqt/mpv.py | 249 | CODE | |
| LOW | qt/aqt/__init__.py | 538 | CODE | |
| LOW | qt/aqt/__init__.py | 436 | CODE | |
| LOW | qt/aqt/__init__.py | 551 | CODE | |
| LOW | qt/aqt/addcards_legacy.py | 218 | CODE | |
| LOW | qt/aqt/addcards_legacy.py | 315 | CODE | |
| LOW | qt/aqt/studydeck.py | 104 | CODE | |
| LOW | qt/aqt/overview.py | 96 | CODE | |
| LOW | qt/aqt/overview.py | 152 | CODE | |
| LOW | qt/aqt/utils.py | 290 | CODE | |
| LOW | qt/aqt/utils.py | 940 | CODE | |
| LOW | qt/aqt/utils.py | 127 | CODE | |
| LOW | qt/aqt/reviewer.py | 204 | CODE | |
| LOW | qt/aqt/reviewer.py | 222 | CODE | |
| LOW | qt/aqt/reviewer.py | 501 | CODE | |
| LOW | qt/aqt/reviewer.py | 674 | CODE | |
| LOW | qt/aqt/reviewer.py | 707 | CODE | |
| LOW | qt/aqt/editor.py | 341 | CODE | |
| LOW | qt/aqt/webview.py | 694 | CODE | |
| LOW | qt/aqt/main.py | 875 | CODE | |
| LOW | qt/aqt/deckbrowser.py | 105 | CODE | |
| LOW | qt/aqt/mediasrv.py | 376 | CODE | |
| LOW | qt/aqt/mediasrv.py | 441 | CODE | |
| LOW | qt/aqt/mediasrv.py | 493 | CODE | |
| LOW | qt/aqt/mediasrv.py | 547 | CODE | |
| LOW | qt/aqt/browser/browser.py | 182 | CODE | |
| LOW | qt/aqt/browser/browser.py | 219 | CODE | |
| LOW | qt/aqt/browser/previewer.py | 206 | CODE | |
| LOW | qt/aqt/browser/sidebar/tree.py | 273 | CODE | |
| LOW | qt/aqt/browser/sidebar/tree.py | 455 | CODE | |
| LOW | qt/aqt/browser/sidebar/tree.py | 519 | CODE | |
| LOW | qt/aqt/browser/sidebar/tree.py | 924 | CODE | |
| LOW | qt/aqt/browser/sidebar/item.py | 141 | CODE | |
| LOW | qt/aqt/browser/table/model.py | 346 | CODE | |
| LOW | qt/tests/qwebengine_csp_smoke.py | 786 | CODE | |
| LOW | qt/tests/qwebengine_csp_smoke.py | 240 | CODE | |
| LOW | docs/cogdocs.py | 7 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Cargo.toml | 181 | # TODO: consider setting once caching issues are fixed (#5318) | COMMENT |
| LOW | ftl/copy-core-string.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | ftl/remove-unused.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | ftl/src/main.rs | 21 | COMMENT | |
| LOW | pylib/tests/test_schedv3.py | 61 | # t = mm.new_template("Reverse") | COMMENT |
| LOW | qt/aqt/addons.py | 181 | "properties": { | COMMENT |
| LOW | qt/aqt/mpv.py | 1 | # ------------------------------------------------------------------------------ | COMMENT |
| LOW | …ux-template/{{ cookiecutter.format }}/bootstrap/main.c | 1 | // | COMMENT |
| LOW | rslib/linkchecker/src/lib.rs | 1 | // Copyright: Ankitects Pty Ltd and contributors | COMMENT |
| LOW | rslib/proto_gen/src/lib.rs | 21 | use prost_reflect::MessageDescriptor; | COMMENT |
| LOW | rslib/src/import_export/text/csv/metadata.rs | 201 | } | COMMENT |
| LOW | rslib/src/scheduler/fsrs/params.rs | 381 | (items, card_ids, review_count) | COMMENT |
| LOW | rslib/src/sync/version.rs | 21 | /// | COMMENT |
| LOW | rslib/src/revlog/mod.rs | 41 | /// - 0 represents manual rescheduling. | COMMENT |
| LOW | ts/lib/domlib/surround/surround.test.ts | 281 | }); | COMMENT |
| LOW | ts/lib/domlib/surround/surround.test.ts | 301 | // expect(removedNodes).toHaveLength(0); | COMMENT |
| LOW | ts/lib/domlib/surround/surround.test.ts | 321 | // }); | COMMENT |
| LOW | ts/lib/domlib/surround/surround.test.ts | 341 | COMMENT | |
| LOW | ts/lib/domlib/surround/unsurround.test.ts | 21 | unsurround(range, body, easyBold); | COMMENT |
| LOW | ts/lib/domlib/surround/unsurround.test.ts | 61 | }); | COMMENT |
| LOW | ts/lib/domlib/surround/unsurround.test.ts | 81 | // }); | COMMENT |
| LOW | ts/lib/domlib/surround/unsurround.test.ts | 121 | unsurround(range, body, easyBold); | COMMENT |
| LOW | ts/routes/graphs/graph-styles.ts | 1 | // Copyright: Ankitects Pty Ltd and contributors | COMMENT |
| LOW | ts/routes/tmp/_page.ts | 1 | // Copyright: Ankitects Pty Ltd and contributors | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | qt/aqt/url_schemes.py | 57 | tr.preferences_url_scheme_warning(link=url.toString(), scheme=url.scheme()) | CODE |
| HIGH | qt/aqt/editor_legacy.py | 1701 | url = qurl.toString() | CODE |
| HIGH | qt/aqt/webview.py | 1033 | f"if(globalThis.anki && globalThis.anki.onOperationDidExecute) globalThis.anki.onOperationDidExecute({change | CODE |
| HIGH | qt/aqt/profiles.py | 415 | (name text primary key collate nocase, data blob not null);""" | STRING |
| HIGH | qt/tests/launch_anki_for_e2e.py | 69 | "create table profiles (name text primary key collate nocase, data blob not null)" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pylib/tools/genhooks.py | 127 | # This file is automatically generated; edit tools/genhooks.py instead. | COMMENT |
| MEDIUM | qt/tools/genhooks_gui.py | 18 | # This file is automatically generated; edit tools/genhooks_gui.py instead. | COMMENT |
| MEDIUM | qt/aqt/sound.py | 651 | # Create the audio source with the chosen format | COMMENT |
| MEDIUM | qt/aqt/log.py | 46 | # Create a new add-on logger | COMMENT |
| MEDIUM | qt/aqt/webview.py | 180 | # Create a new profile if not cached | STRING |
| MEDIUM | qt/mac/build.sh | 15 | # Create the wheel using uv | COMMENT |
| MEDIUM | rslib/i18n/python.rs | 67 | # This file is automatically generated from the *.ftl files. | COMMENT |
| MEDIUM | .github/scripts/setup_apple_signing.sh | 9 | # Create a temporary keychain | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | qt/aqt/editor_legacy.py | 1782 | path = os.path.join(self.editor.mw.col.media.dir(), file_name) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 251 | // Step 1: Establish _nt_{cloze}_lastDeck = testDeckId. | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 258 | // Step 2: Reset to Basic + Default so the starting state is deterministic. | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 264 | // Step 3: Switch to Cloze. NoteEditor reads _nt_{cloze}_lastDeck and | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 268 | // Step 4: Deck chooser must update on its own. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 251 | // Step 1: Establish _nt_{cloze}_lastDeck = testDeckId. | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 258 | // Step 2: Reset to Basic + Default so the starting state is deterministic. | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 264 | // Step 3: Switch to Cloze. NoteEditor reads _nt_{cloze}_lastDeck and | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 268 | // Step 4: Deck chooser must update on its own. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | qt/hatch_build.py | 56 | # For editable installs, just add anki without version constraint | COMMENT |
| MEDIUM | qt/tests/launch_anki_for_e2e.py | 102 | # Headless Qt: the e2e harness only needs mediasrv's HTTP stack, | COMMENT |
| MEDIUM | ts/licenses.json | 789 | "repository": "https://github.com/mourner/robust-predicates", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pylib/anki/media.py | 182 | CODE | |
| LOW | qt/aqt/studydeck.py | 30 | CODE | |
| LOW | qt/aqt/utils.py | 342 | CODE | |
| LOW | qt/aqt/utils.py | 127 | CODE | |
| LOW | qt/aqt/mediasrv.py | 806 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | qt/aqt/sound.py | 705 | # Check if we need to convert float samples to int16 | COMMENT |
| LOW | docs/syncserver/entrypoint.sh | 15 | # Check if group exists, create if not | COMMENT |
| LOW | docs/syncserver/entrypoint.sh | 20 | # Check if user exists, create if not | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | qt/aqt/mediasrv.py | 493 | def handle_request(pathin: str) -> Response: | CODE |