AI Slop Code RIsk Monitor

JerBouma/FinanceDatabase

This is a database of 300.000+ symbols containing Equities, ETFs, Funds, Indices, Currencies, Cryptocurrencies and Money Markets.

30.9 High pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for JerBouma/FinanceDatabase, a Python project with 9,462 GitHub stars. SynthScan examined 17,587 lines of code across 139 source files, recording 306 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 30.9 (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.

30.9
Adjusted Signal
30.9
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
9.5K
Stars
Python
Language
17.6K
Lines of Code
139
Files
306
Pattern Hits
2026-10-12
Scan Date
0.39
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 66.4/100 · HIGH

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

Hallucinated Dependency & Supply Chain Risk 6.6/100 · LOW

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

Agent Over-Engineering Ratio 64.3/100 · HIGH

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

PR Review Velocity Impact 80.7/100 · CRITICAL

Which changes need focused human review? 306 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

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

No multi-scan history yet — run the scanner again to build trend data.

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 0HIGH 54MEDIUM 1LOW 251

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 306 distinct pattern matches across 11 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.

Hyper-Verbose Identifiers205 hits · 220 pts
SeverityFileLineSnippetContext
LOWfinancedatabase/mcp_server/ranking_model.py334def keep_top_company_together(CODE
LOWfinancedatabase/mcp_server/provider_model.py100def redirect_stdout_to_stderr():CODE
LOWfinancedatabase/mcp_server/setup_model.py113def get_claude_code_config_path() -> pathlib.Path:CODE
LOWtests/conftest.py41def _regenerate_compression_artifacts() -> None:CODE
LOWtests/conftest.py56def _snapshot_compression_artifacts() -> dict[pathlib.Path, bytes | None]:CODE
LOWtests/conftest.py64def _restore_compression_artifacts(snapshot: dict[pathlib.Path, bytes | None]) -> None:CODE
LOWtests/test_database_controller.py26def test_polars_output_has_the_same_rows_as_pandas(asset, method, kwargs) -> None:CODE
LOW⚡tests/test_database_controller.py39def test_show_options_as_polars() -> None:CODE
LOW⚡tests/test_database_controller.py49def test_search_supports_python_only_regex() -> None:CODE
LOW⚡tests/test_database_controller.py58def test_data_can_be_replaced_for_tests(monkeypatch) -> None:CODE
LOWtests/test_database_controller.py77def test_module_show_options_as_polars() -> None:CODE
LOWtests/test_invariants.py13def test_equities_read_rewrite_is_byte_identical() -> None:CODE
LOWtests/test_invariants.py65def test_no_symbol_collisions_across_asset_classes() -> None:CODE
LOWtests/test_invariants.py102def test_no_isin_collisions_across_asset_classes() -> None:CODE
LOWtests/test_invariants.py124def test_delisted_is_strictly_boolean() -> None:CODE
LOWtests/test_invariants.py144def test_equity_categories_follow_tree() -> None:CODE
LOWtests/test_invariants.py176def test_equities_hold_only_company_shares() -> None:CODE
LOWtests/test_categories_model.py14def test_blank_categories_are_learned_from_name_terms_and_isins() -> None:CODE
LOWtests/test_readme_stats.py45def test_section_is_regenerated_between_markers(tmp_path: Path) -> None:CODE
LOWtests/test_readme_stats.py65def test_regeneration_is_idempotent(tmp_path: Path) -> None:CODE
LOWtests/test_readme_stats.py76def test_missing_markers_change_nothing(tmp_path: Path) -> None:CODE
LOWtests/test_update_markets.py12def test_update_cryptos_adds_top_coins_and_drops_dead_ones() -> None:CODE
LOWtests/test_update_markets.py64def test_update_currencies_follows_iso() -> None:CODE
LOWtests/test_update_markets.py97def test_update_indices_adds_only_new_symbols() -> None:CODE
LOWtests/test_update_markets.py125def test_inav_categories_follow_their_index() -> None:CODE
LOW⚡tests/test_listings_model.py52def test_main_venues_lead_the_country_most_of_their_listings_come_from() -> None:CODE
LOW⚡tests/test_listings_model.py59def test_home_listing_is_primary() -> None:CODE
LOW⚡tests/test_listings_model.py66def test_largest_main_venue_abroad_without_a_home_listing() -> None:CODE
LOW⚡tests/test_listings_model.py73def test_home_listing_off_the_main_venues() -> None:CODE
LOW⚡tests/test_listings_model.py80def test_listing_without_a_country_joins_the_name_it_starts_with() -> None:CODE
LOW⚡tests/test_listings_model.py85def test_delisted_listings_never_hide_a_listed_one() -> None:CODE
LOW⚡tests/test_listings_model.py95def test_trailing_words_are_measured_on_the_names() -> None:CODE
LOWtests/test_listings_model.py106def test_share_classes_and_preferred_shares_are_not_primary() -> None:CODE
LOWtests/test_listings_model.py125def test_names_match_with_or_without_dots() -> None:CODE
LOWtests/test_listings_model.py133def test_names_match_without_accents() -> None:CODE
LOWtests/test_listings_model.py147def _get_primary_with_currencies(rows: list[tuple]) -> set[str]:CODE
LOWtests/test_listings_model.py157def test_lines_abroad_in_another_currency_are_not_primary() -> None:CODE
LOWtests/test_listings_model.py170def test_local_receipts_are_not_primary() -> None:CODE
LOWtests/test_listings_model.py184def test_one_primary_line_per_company_and_exchange() -> None:CODE
LOWtests/test_listings_model.py213def test_lines_without_a_home_are_never_receipts() -> None:CODE
LOW⚡tests/test_query_model.py20def test_exclude_delisted_rows() -> None:CODE
LOW⚡tests/test_query_model.py26def test_validate_filter_values_ignores_case() -> None:CODE
LOW⚡tests/test_query_model.py34def test_filter_rows_and_primary_listings() -> None:CODE
LOW⚡tests/test_query_model.py41def test_primary_listings_use_the_given_symbols() -> None:CODE
LOW⚡tests/test_query_model.py49def test_match_pattern_falls_back_to_python_regex() -> None:CODE
LOW⚡tests/test_query_model.py55def test_search_rows_ignores_unknown_columns(caplog) -> None:CODE
LOWtests/test_update_listings.py80def test_yahoo_canada_symbols() -> None:CODE
LOWtests/test_update_listings.py89def test_canada_names_distinguish_classes() -> None:CODE
LOWtests/test_update_listings.py105def test_symbol_key_and_name_normalisation() -> None:CODE
LOWtests/test_update_listings.py116def test_dated_name_skips_debt_but_keeps_shares() -> None:CODE
LOWtests/test_update_listings.py140def test_check_non_share_finds_papers_but_keeps_shares() -> None:CODE
LOWtests/test_update_listings.py173def test_parse_tsx_skips_debt_and_ambiguous_funds() -> None:CODE
LOWtests/test_update_listings.py189def test_parse_nasdaq_trader_only_etfs() -> None:CODE
LOWtests/test_update_listings.py205def test_parse_european_etf_lists() -> None:CODE
LOWtests/test_update_listings.py248def test_broken_source_is_rejected() -> None:CODE
LOWtests/test_update_listings.py257def test_apply_source_adds_dedupes_and_delists(tmp_path: Path) -> None:CODE
LOWtests/test_update_listings.py309def test_too_many_delistings_are_not_applied(tmp_path: Path, monkeypatch) -> None:CODE
LOWtests/test_update_listings.py328def test_untouched_files_are_not_rewritten(tmp_path: Path) -> None:CODE
LOWtests/test_update_listings.py344def test_learn_categories_requires_agreement() -> None:CODE
LOWtests/test_update_listings.py412def test_openfigi_enrichment_fills_and_refiles(monkeypatch) -> None:CODE
145 more matches not shown…
Docstring Block Structure29 hits · 145 pts
SeverityFileLineSnippetContext
HIGHfinancedatabase/database_controller.py225 Filter the dataset lazily after validating the filter values. Args: filters (dict[str, AnySTRING
HIGHfinancedatabase/database_controller.py328 Collect the sorted unique values of columns, shared by every show_options(). Args: selectiSTRING
HIGHfinancedatabase/database_controller.py413 Show the category options of an asset class without initializing it. Args: selection (str | None, optiSTRING
HIGHfinancedatabase/cache_model.py141 Get the Parquet cache of a remote file, checked for changes (ETag) once a day. Args: url (str): The URSTRING
HIGHfinancedatabase/categories_model.py16 Read a file from a local path or a URL. Args: location (str): The path or URL. use_local_locatSTRING
HIGHfinancedatabase/categories_model.py40 Get the category options of an asset class, from Parquet or else the gzip CSV. Args: location (str): TSTRING
HIGHfinancedatabase/frame_model.py36 Convert the FinanceFrame to a Finance Toolkit object for its tickers. Args: api_key (str |STRING
HIGHfinancedatabase/query_model.py125 Match a regular expression with Python's semantics, falling back to re when needed. Args: column (pl.ESTRING
HIGHfinancedatabase/indices/indices_controller.py35 Select indices based on the category group, category, currency and other criteria. Returns all indicesSTRING
HIGHfinancedatabase/indices/indices_controller.py89 Show the available values of the indices filters. The options can be narrowed down with the same filteSTRING
HIGHfinancedatabase/currencies/currencies_controller.py29 Select currency pairs based on the base and quote currency. Returns all currency pairs when no input iSTRING
HIGHfinancedatabase/currencies/currencies_controller.py71 Show the available values of the currencies filters. The options can be narrowed down with the same fiSTRING
HIGHfinancedatabase/cryptos/cryptos_controller.py29 Select cryptocurrencies based on the cryptocurrency and the currency it is quoted in. Returns all crypSTRING
HIGHfinancedatabase/cryptos/cryptos_controller.py69 Show the available values of the cryptocurrencies filters. The options can be narrowed down with the sSTRING
HIGHfinancedatabase/etfs/etfs_controller.py41 Select ETFs based on the category group, category, family and other criteria. Returns all ETFs when noSTRING
HIGHfinancedatabase/etfs/etfs_controller.py104 Show the available values of the ETFs filters. The options can be narrowed down with the same filters STRING
HIGHfinancedatabase/funds/funds_controller.py42 Select funds based on the category group, category, family and other criteria. Returns all funds when STRING
HIGHfinancedatabase/funds/funds_controller.py100 Show the available values of the funds filters. The options can be narrowed down with the same filtersSTRING
HIGHfinancedatabase/mcp_server/tools_model.py96 Resolve an asset class selection: 'all', a name, or comma-separated names. Args: value (AnSTRING
HIGHfinancedatabase/mcp_server/provider_model.py151 Get the cached instance for an asset class, creating it on first use. Args: tool_name (strSTRING
HIGHfinancedatabase/mcp_server/provider_model.py229 Turn raw filter input into the lists of values the package expects. Args: tool_name (str):STRING
HIGHfinancedatabase/mcp_server/provider_model.py313 Run a package call, turning its ValueError into a QueryError with suggestions. Args: tool_STRING
HIGHfinancedatabase/mcp_server/provider_model.py374 Validate requested column names (case-insensitive) against the dataset. Args: tool_name (sSTRING
HIGHfinancedatabase/mcp_server/provider_model.py612 Run a lazy select() with an optional query and return one page. Args: tool_name (str): TheSTRING
HIGHfinancedatabase/mcp_server/provider_model.py669 Show the available values per field via the package's show_options. Args: tool_name (str):STRING
HIGHfinancedatabase/equities/equities_controller.py47 Select equities by country, sector, industry group, industry and more. Returns all equities when no inSTRING
HIGHfinancedatabase/equities/equities_controller.py116 Show the available values of the equities filters. The options can be narrowed down with the same filtSTRING
HIGHfinancedatabase/moneymarkets/moneymarkets_controller.py31 Select money markets based on the currency and family. Returns all money markets when no input is giveSTRING
HIGHfinancedatabase/moneymarkets/moneymarkets_controller.py73 Show the available values of the money markets filters. The options can be narrowed down with the sameSTRING
Cross-File Repetition17 hits · 85 pts
SeverityFileLineSnippetContext
HIGHfinancedatabase/indices/indices_controller.py0show the available values of the funds filters. the options can be narrowed down with the same filters as select(). argsSTRING
HIGHfinancedatabase/etfs/etfs_controller.py0show the available values of the funds filters. the options can be narrowed down with the same filters as select(). argsSTRING
HIGHfinancedatabase/funds/funds_controller.py0show the available values of the funds filters. the options can be narrowed down with the same filters as select(). argsSTRING
HIGHtests/indices/test_indices_controller.py0search() matches an independent pandas filter of the same data (structure, not a snapshot).STRING
HIGHtests/currencies/test_currencies_controller.py0search() matches an independent pandas filter of the same data (structure, not a snapshot).STRING
HIGHtests/cryptos/test_cryptos_controller.py0search() matches an independent pandas filter of the same data (structure, not a snapshot).STRING
HIGHtests/etfs/test_etfs_controller.py0search() matches an independent pandas filter of the same data (structure, not a snapshot).STRING
HIGHtests/funds/test_funds_controller.py0search() matches an independent pandas filter of the same data (structure, not a snapshot).STRING
HIGHtests/equities/test_equities_controller.py0search() matches an independent pandas filter of the same data (structure, not a snapshot).STRING
HIGHtests/moneymarkets/test_moneymarkets_controller.py0search() matches an independent pandas filter of the same data (structure, not a snapshot).STRING
HIGHtests/indices/test_indices_controller.py0`select(<filter>=...)` raises valueerror for values not in show_options().STRING
HIGHtests/currencies/test_currencies_controller.py0`select(<filter>=...)` raises valueerror for values not in show_options().STRING
HIGHtests/cryptos/test_cryptos_controller.py0`select(<filter>=...)` raises valueerror for values not in show_options().STRING
HIGHtests/etfs/test_etfs_controller.py0`select(<filter>=...)` raises valueerror for values not in show_options().STRING
HIGHtests/funds/test_funds_controller.py0`select(<filter>=...)` raises valueerror for values not in show_options().STRING
HIGHtests/equities/test_equities_controller.py0`select(<filter>=...)` raises valueerror for values not in show_options().STRING
HIGHtests/moneymarkets/test_moneymarkets_controller.py0`select(<filter>=...)` raises valueerror for values not in show_options().STRING
Empty Error Handlers6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHfinancedatabase/cache_model.py214except requests.exceptions.RequestException:CODE
HIGHfinancedatabase/categories_model.py63except (FileNotFoundError, requests.exceptions.HTTPError):CODE
HIGHtests/conftest.py72except OSError:CODE
HIGHscripts/listings/enrichment_model.py199except requests.RequestException:CODE
HIGHscripts/listings/enrichment_model.py212except requests.RequestException:CODE
HIGHscripts/listings/helpers.py130except requests.RequestException:CODE
Excessive Try-Catch Wrapping18 hits · 18 pts
SeverityFileLineSnippetContext
LOWfinancedatabase/mcp_server/registry_model.py51 except Exception as error:CODE
LOWfinancedatabase/mcp_server/analytics_model.py230 except Exception as error: # noqa: BLE001CODE
LOWfinancedatabase/mcp_server/analytics_model.py329 except Exception as error: # noqa: BLE001CODE
LOWfinancedatabase/mcp_server/analytics_model.py345 except Exception as error: # noqa: BLE001CODE
LOWfinancedatabase/mcp_server/tools_model.py142 except Exception as error:CODE
LOWfinancedatabase/mcp_server/mcp_controller.py301 except Exception as error:CODE
LOWscripts/listings/enrichment_model.py155 except Exception as error:CODE
LOWscripts/listings/enrichment_model.py339 except Exception as error:CODE
LOWscripts/listings/enrichment_model.py387 except Exception as error:CODE
LOWscripts/listings/listings_controller.py231 except Exception as error:CODE
LOWscripts/listings/listings_controller.py261 except Exception as error: # noqa: BLE001CODE
LOWscripts/listings/listings_controller.py293 except Exception as error:CODE
LOWscripts/listings/helpers.py164 except Exception as error:CODE
LOWscripts/readme/readme_controller.py43 except Exception as error: # never fail the weekly pipeline over the READMECODE
LOWscripts/markets/markets_controller.py35 except Exception as error: # noqa: BLE001CODE
LOWscripts/markets/markets_controller.py100 except Exception as error: # noqa: BLE001CODE
LOWscripts/equities/equities_controller.py133 except Exception as error: # noqa: BLE001CODE
LOWscripts/equities/equities_model.py159 except Exception as error: # noqa: BLE001CODE
Cross-Language Confusion2 hits · 15 pts
SeverityFileLineSnippetContext
HIGH⚡tests/test_cache_model.py150 assert frame.equals(typed)CODE
HIGH⚡tests/test_cache_model.py161 assert frame.equals(typed)CODE
Unused Imports9 hits · 9 pts
SeverityFileLineSnippetContext
LOWfinancedatabase/__init__.py5CODE
LOWfinancedatabase/__init__.py6CODE
LOWfinancedatabase/__init__.py7CODE
LOWfinancedatabase/__init__.py8CODE
LOWfinancedatabase/__init__.py9CODE
LOWfinancedatabase/__init__.py10CODE
LOWfinancedatabase/__init__.py11CODE
LOWfinancedatabase/__init__.py12CODE
LOWscripts/listings/enrichment_model.py19CODE
Deep Nesting9 hits · 9 pts
SeverityFileLineSnippetContext
LOWfinancedatabase/query_model.py156CODE
LOWfinancedatabase/mcp_server/analytics_model.py183CODE
LOWtests/helpers.py73CODE
LOWscripts/listings/sources_model.py267CODE
LOWscripts/listings/enrichment_model.py76CODE
LOWscripts/listings/listings_controller.py36CODE
LOWscripts/listings/categories_model.py106CODE
LOWscripts/validation/validation_controller.py57CODE
LOWscripts/validation/categories_model.py8CODE
AI Structural Patterns7 hits · 7 pts
SeverityFileLineSnippetContext
LOWfinancedatabase/frame_model.py19CODE
LOWfinancedatabase/etfs/etfs_controller.py29CODE
LOWfinancedatabase/etfs/etfs_controller.py92CODE
LOWfinancedatabase/funds/funds_controller.py31CODE
LOWfinancedatabase/funds/funds_controller.py89CODE
LOWfinancedatabase/equities/equities_controller.py32CODE
LOWfinancedatabase/equities/equities_controller.py101CODE
Self-Referential Comments1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMdocker-compose.yml1# This file is meant for deploying the MCP server using Docker Compose. This, together withCOMMENT
Modern Structural Boilerplate3 hits · 3 pts
SeverityFileLineSnippetContext
LOWfinancedatabase/__init__.py14__all__ = [CODE
LOWscripts/compression/compression_controller.py20def update_datasets(database: str, compression: str) -> None:CODE
LOWscripts/compression/compression_controller.py37def update_categories(database: str, compression: str) -> None:CODE