The personal finance app for everyone (by everyone)
This report presents the forensic synthetic code analysis of we-promise/sure, a Ruby project with 8,997 GitHub stars. SynthScan v2.0 examined 438,615 lines of code across 4004 source files, recording 1586 pattern matches distributed across 15 syntactic categories. The overall adjusted score of 7.2 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 1586 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | compose.example.yml | 1 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | compose.example.yml | 3 | # =========================================================================== | COMMENT |
| MEDIUM | compose.example.yml | 23 | # ---------------- | COMMENT |
| MEDIUM | compose.example.yml | 30 | # ---------------------------------------- | COMMENT |
| MEDIUM | compose.example.ai.yml | 1 | # =========================================================================== | COMMENT |
| MEDIUM | compose.example.ai.yml | 4 | # =========================================================================== | COMMENT |
| MEDIUM | compose.example.ai.yml | 44 | # ---------------- | COMMENT |
| MEDIUM | compose.example.ai.yml | 51 | # ---------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/budget.rb | 222 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | app/models/budget.rb | 224 | # ============================================================================= | COMMENT |
| MEDIUM | app/models/budget.rb | 264 | # ============================================================================= | COMMENT |
| MEDIUM | app/models/budget.rb | 266 | # ============================================================================= | COMMENT |
| MEDIUM | app/models/budget.rb | 285 | # ============================================================================= | COMMENT |
| MEDIUM | app/models/budget.rb | 287 | # ============================================================================= | COMMENT |
| MEDIUM | app/models/qif_import.rb | 162 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/models/qif_import.rb | 164 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/models/qif_import.rb | 243 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/models/qif_import.rb | 245 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/models/qif_import.rb | 333 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/models/qif_import.rb | 335 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/models/demo/generator.rb | 1231 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/demo/generator.rb | 1233 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/demo/generator.rb | 1240 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/demo/generator.rb | 1242 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 404 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 406 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 865 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 867 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 986 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 988 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 1011 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 1013 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 1166 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 1168 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/provider/yahoo_finance.rb | 471 | # ================================ | COMMENT |
| MEDIUM⚡ | app/models/provider/yahoo_finance.rb | 473 | # ================================ | COMMENT |
| MEDIUM⚡ | app/models/provider/yahoo_finance.rb | 625 | # ================================ | COMMENT |
| MEDIUM⚡ | app/models/provider/yahoo_finance.rb | 627 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 70 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 72 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 141 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 143 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 330 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 332 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 398 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 400 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 454 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 456 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/twelve_data.rb | 60 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/twelve_data.rb | 62 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/twelve_data.rb | 130 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/twelve_data.rb | 132 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/alpha_vantage.rb | 89 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/alpha_vantage.rb | 91 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/moex_public.rb | 80 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/moex_public.rb | 82 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/moex_public.rb | 180 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/moex_public.rb | 182 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/moex_public.rb | 205 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/moex_public.rb | 207 | # ================================ | COMMENT |
| 297 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | compose.example.yml | 8 | # This file is an example Docker Compose configuration for self hosting | COMMENT |
| MEDIUM | compose.example.ai.yml | 125 | # Create the dirs yourself first so they are owned by your host user | COMMENT |
| MEDIUM | app/models/recurring_transaction.rb | 103 | # Create a manual recurring transfer from an existing Transfer pair. | COMMENT |
| MEDIUM | app/models/recurring_transaction.rb | 141 | # Create a manual recurring transaction from an existing transaction | COMMENT |
| MEDIUM | app/models/assistant/function/import_bank_statement.rb | 132 | # Create a CSV from extracted transactions | COMMENT |
| MEDIUM | app/models/assistant/function/import_bank_statement.rb | 135 | # Create a TransactionImport | COMMENT |
| MEDIUM | …/models/plaid_account/transactions/category_matcher.rb | 11 | # This class is simply a FAST and CHEAP way to match categories that are high confidence. | COMMENT |
| MEDIUM | app/models/family/data_exporter.rb | 12 | # Create a StringIO to hold the zip data in memory | COMMENT |
| MEDIUM | app/models/family/up_connectable.rb | 13 | # Create an Up item with the given token and trigger an initial sync. | COMMENT |
| MEDIUM | app/models/provider/configurable.rb | 125 | # Define a custom check for whether this provider is configured | COMMENT |
| MEDIUM | app/models/provider/configurable.rb | 133 | # Define a configuration field | COMMENT |
| MEDIUM | app/models/sophtron_entry/processor.rb | 137 | # Create a stable merchant ID from the merchant name | COMMENT |
| MEDIUM | app/models/mercury_entry/processor.rb | 99 | # Create a stable merchant ID from the counterparty name | COMMENT |
| MEDIUM | app/models/vector_store/base.rb | 7 | # Create a new vector store / collection / namespace | COMMENT |
| MEDIUM | app/models/eval/langfuse/client.rb | 248 | # Create a new request with the same properties (needed for retry since request body may be consumed) | COMMENT |
| MEDIUM | app/models/coinbase_account/processor.rb | 206 | # Create the trade | COMMENT |
| MEDIUM | app/models/holding/gapfillable.rb | 22 | # Create a new holding based on the previous day's data | COMMENT |
| MEDIUM | app/models/lunchflow_entry/processor.rb | 85 | # Create a deterministic hash from key transaction attributes | COMMENT |
| MEDIUM | app/models/lunchflow_entry/processor.rb | 142 | # Create a stable merchant ID from the merchant name | COMMENT |
| MEDIUM | app/models/concerns/enrichable.rb | 4 | # This module defines how models should, lock, unlock, and edit attributes | COMMENT |
| MEDIUM | app/jobs/rule_job.rb | 18 | # Create the RuleRun record first with pending status | COMMENT |
| MEDIUM | app/jobs/rule_job.rb | 70 | # Create a failed rule run if we hadn't created one yet | COMMENT |
| MEDIUM | app/controllers/lunchflow_items_controller.rb | 185 | # Create the internal Account with proper balance initialization | COMMENT |
| MEDIUM | app/controllers/simplefin_items_controller.rb | 150 | # Create a Sync and enqueue it to run asynchronously with a runtime-only flag | COMMENT |
| MEDIUM | app/controllers/up_items_controller.rb | 28 | # Create an Up connection and kick off its first sync. | COMMENT |
| MEDIUM | app/controllers/snaptrade_items_controller.rb | 726 | # Create the Sure account | COMMENT |
| MEDIUM | app/controllers/plaid_items_controller.rb | 91 | # Create the link via AccountProvider | COMMENT |
| MEDIUM | app/controllers/oidc_accounts_controller.rb | 37 | # Create the OIDC identity link | COMMENT |
| MEDIUM | app/controllers/oidc_accounts_controller.rb | 156 | # Create the OIDC (or other SSO) identity | COMMENT |
| MEDIUM | app/controllers/enable_banking_items_controller.rb | 294 | # Create the internal Account (uses save! internally, will raise on failure) | COMMENT |
| MEDIUM | app/controllers/mercury_items_controller.rb | 185 | # Create the internal Account with proper balance initialization | COMMENT |
| MEDIUM | app/controllers/api/v1/test_controller.rb | 17 | # Create a mock resource that belongs to a different family | COMMENT |
| MEDIUM | app/controllers/api/v1/tags_controller.rb | 44 | # Create a new tag for the family | COMMENT |
| MEDIUM | test/models/coinstats_item_test.rb | 160 | # Create a linked account | COMMENT |
| MEDIUM | test/models/coinstats_item_test.rb | 178 | # Create an unlinked account | COMMENT |
| MEDIUM | test/models/coinstats_item_test.rb | 209 | # Create a linked account | COMMENT |
| MEDIUM | test/models/coinstats_item_test.rb | 223 | # Create an unlinked account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 183 | # Create a regular transfer between accounts | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 197 | # Create a loan payment transaction | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 210 | # Create a one-time transaction | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 223 | # Create a payment transaction (credit card payment) | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 236 | # Create an excluded transaction | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 285 | # Create a truly empty family | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 317 | # Create a transfer to investment account (marked as investment_contribution) | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 366 | # Create a Roth IRA (tax-exempt) investment account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 374 | # Create a dividend transaction in the Roth IRA | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 388 | # Create a 401k (tax-deferred) investment account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 396 | # Create a dividend transaction in the 401k | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 410 | # Create a taxable brokerage account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 418 | # Create a dividend transaction in the taxable account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 432 | # Create a crypto account (default taxable) | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 440 | # Create a transaction in the crypto account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 452 | # Create a crypto account in a tax-deferred retirement account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 460 | # Create a transaction in the tax-deferred crypto account | COMMENT |
| MEDIUM⚡ | test/models/income_statement_test.rb | 648 | # Create a fresh family with ONLY tax-advantaged accounts | COMMENT |
| MEDIUM⚡ | test/models/income_statement_test.rb | 656 | # Create a 401k account (tax-deferred) | COMMENT |
| MEDIUM⚡ | test/models/income_statement_test.rb | 664 | # Create a Roth IRA account (tax-exempt) | COMMENT |
| MEDIUM | test/models/snaptrade_data_helpers_test.rb | 4 | # Create a test class that includes the concern | COMMENT |
| MEDIUM | test/models/snaptrade_data_helpers_test.rb | 141 | # Create the security before resolve_security can | COMMENT |
| MEDIUM | test/models/rule_test.rb | 299 | # Create a second account | COMMENT |
| 132 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/category_import.rb | 107 | def ensure_placeholder_category(name) | CODE |
| LOW | app/models/account.rb | 200 | def create_from_simplefin_account(simplefin_account, account_type, subtype = nil) | CODE |
| LOW | app/models/account.rb | 249 | def create_from_enable_banking_account(enable_banking_account, account_type, subtype = nil) | CODE |
| LOW | app/models/account.rb | 300 | def create_from_coinbase_account(coinbase_account) | CODE |
| LOW | app/models/account.rb | 325 | def create_from_binance_account(binance_account) | CODE |
| LOW | app/models/account.rb | 355 | def create_from_kraken_account(kraken_account) | CODE |
| LOW | app/models/account.rb | 361 | def create_from_crypto_exchange_account(provider_account, family:) | CODE |
| LOW | app/models/account.rb | 378 | def build_simplefin_accountable_attributes(simplefin_account, account_type, subtype) | CODE |
| LOW | app/models/investment_statement.rb | 278 | def convert_to_family_currency(amount, from_currency) | CODE |
| LOW | app/models/market_data_importer.rb | 102 | def get_first_required_price_date(security) | CODE |
| LOW | app/models/market_data_importer.rb | 109 | def get_first_required_exchange_rate_date(from_currency:) | CODE |
| LOW | app/models/rule_import.rb | 92 | def extract_conditions_and_actions(fragments) | CODE |
| LOW | app/models/rule_import.rb | 112 | def create_or_update_rule_from_row(row) | CODE |
| LOW | app/models/rule_import.rb | 203 | def resolve_import_condition_value(condition_data) | CODE |
| LOW | app/models/rule_import.rb | 234 | def resolve_import_action_value(action_data) | CODE |
| LOW⚡ | app/models/sure_import.rb | 63 | def dry_run_totals_from_ndjson(content) | CODE |
| LOW⚡ | app/models/sure_import.rb | 67 | def dry_run_totals_from_line_type_counts(counts) | CODE |
| LOW⚡ | app/models/sure_import.rb | 73 | def expected_record_counts_from_ndjson(content) | CODE |
| LOW⚡ | app/models/sure_import.rb | 77 | def expected_record_counts_from_line_type_counts(counts) | CODE |
| LOW | app/models/sure_import.rb | 295 | def build_readback_verification(before_counts:, status_for_mismatch:) | CODE |
| LOW | app/models/sophtron_item.rb | 74 | def import_latest_sophtron_data(sync: nil) | CODE |
| LOW | app/models/sophtron_item.rb | 274 | def persist_remote_sophtron_accounts(accounts) | CODE |
| LOW | app/models/brex_account.rb | 190 | def build_institution_metadata(snapshot, kind) | CODE |
| LOW | app/models/provider_merchant.rb | 10 | def convert_to_family_merchant_for(family, attributes = {}) | CODE |
| LOW | app/models/snaptrade_item.rb | 52 | def import_latest_snaptrade_data(sync: nil) | CODE |
| LOW | app/models/indexa_capital_item.rb | 52 | def import_latest_indexa_capital_data(sync: nil) | CODE |
| LOW | app/models/family.rb | 149 | def secondary_enabled_currency_objects(extra: []) | CODE |
| LOW | app/models/family.rb | 190 | def auto_share_existing_accounts_with(user) | CODE |
| LOW⚡ | app/models/family.rb | 270 | def auto_categorize_transactions_later(transactions, rule_run_id: nil) | CODE |
| LOW⚡ | app/models/family.rb | 274 | def auto_categorize_transactions(transaction_ids) | CODE |
| LOW⚡ | app/models/family.rb | 278 | def auto_detect_transaction_merchants_later(transactions, rule_run_id: nil) | CODE |
| LOW⚡ | app/models/family.rb | 282 | def auto_detect_transaction_merchants(transaction_ids) | CODE |
| LOW | app/models/family.rb | 394 | def securities_with_plan_restrictions(provider:) | CODE |
| LOW | app/models/questrade_account.rb | 142 | def extract_institution_metadata(data) | CODE |
| LOW | app/models/enable_banking_item.rb | 402 | def import_accounts_from_session(accounts_data) | CODE |
| LOW⚡ | app/models/valuation.rb | 11 | def build_reconciliation_name(accountable_type) | CODE |
| LOW⚡ | app/models/valuation.rb | 15 | def build_opening_anchor_name(accountable_type) | CODE |
| LOW⚡ | app/models/valuation.rb | 19 | def build_current_anchor_name(accountable_type) | CODE |
| LOW | app/models/chat.rb | 176 | def undelivered_error_payload(assistant_message) | CODE |
| LOW | app/models/investment.rb | 131 | def subtypes_grouped_for_select(currency: nil) | CODE |
| LOW | app/models/account_statement.rb | 126 | def reconciliation_statuses_for(statements, account:) | CODE |
| LOW | app/models/account_statement.rb | 167 | def allowed_content_types_for_filename(filename) | CODE |
| LOW | app/models/trade_import.rb | 81 | def investment_activity_label_for(qty) | CODE |
| LOW | app/models/transaction.rb | 169 | def set_preloaded_activity_security(security) | CODE |
| LOW | app/models/transaction.rb | 333 | def pending_duplicate_candidates(limit: 20, offset: 0) | CODE |
| LOW | app/models/budget.rb | 75 | def latest_valid_budget_start_date(family) | CODE |
| LOW⚡ | app/models/budget.rb | 233 | def budget_category_actual_spending(budget_category) | CODE |
| LOW⚡ | app/models/budget.rb | 240 | def category_median_monthly_expense(category) | CODE |
| LOW⚡ | app/models/budget.rb | 244 | def category_avg_monthly_expense(category) | CODE |
| LOW | app/models/questrade_item.rb | 45 | def import_latest_questrade_data(sync: nil) | CODE |
| LOW | app/models/qif_import.rb | 379 | def investment_activity_label_for(action) | CODE |
| LOW | app/models/provider.rb | 47 | def default_error_transformer(error) | CODE |
| LOW | app/models/simplefin_item.rb | 48 | def import_latest_simplefin_data(sync: nil) | CODE |
| LOW | app/models/user.rb | 115 | def request_impersonation_for(user_id) | CODE |
| LOW | app/models/user.rb | 327 | def update_dashboard_preferences(prefs) | CODE |
| LOW | app/models/user.rb | 358 | def update_reports_preferences(prefs) | CODE |
| LOW | app/models/user.rb | 398 | def update_transactions_preferences(prefs) | CODE |
| LOW | app/models/recurring_transaction.rb | 346 | def calculate_next_expected_date(from_date = last_occurrence_date) | CODE |
| LOW | app/models/demo/generator.rb | 901 | def generate_credit_card_charges(account, base_date, count) | CODE |
| LOW | app/models/assistant/responder.rb | 49 | def handle_follow_up_response(response) | CODE |
| 364 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pipelock.example.yaml | 1 | # Pipelock configuration for Docker Compose | COMMENT |
| LOW | pipelock.example.yaml | 101 | # Flight recorder (pipelock 2.7+): signed, hash-chained action receipts. | COMMENT |
| LOW | compose.example.yml | 1 | # =========================================================================== | COMMENT |
| LOW | compose.example.yml | 21 | # | COMMENT |
| LOW | compose.example.ai.yml | 1 | # =========================================================================== | COMMENT |
| LOW | compose.example.ai.yml | 21 | # on web port 3000 (auth token required); Pipelock adds scanning | COMMENT |
| LOW | compose.example.ai.yml | 41 | # https://github.com/we-promise/sure/blob/main/docs/hosting/docker.md | COMMENT |
| LOW | compose.example.ai.yml | 121 | - ./pipelock.example.yaml:/etc/pipelock/pipelock.yaml:ro | COMMENT |
| LOW | app/models/snaptrade_account.rb | 61 | # Expected JSON structure: | COMMENT |
| LOW | app/models/account.rb | 101 | # Writer for subtype that delegates to the accountable, allowing forms to set | COMMENT |
| LOW | app/models/account.rb | 421 | # Default GoalPledge kind for this account. Manual accounts get | COMMENT |
| LOW | app/models/sophtron_item.rb | 1 | # Represents a Sophtron integration item for a family. | COMMENT |
| LOW | app/models/sophtron_item.rb | 61 | COMMENT | |
| LOW | app/models/entry.rb | 301 | # @return [Boolean] true if entry should be skipped during provider sync | COMMENT |
| LOW | app/models/entry.rb | 441 | end | COMMENT |
| LOW | app/models/sophtron_account.rb | 1 | # Represents a single bank account from Sophtron. | COMMENT |
| LOW | app/models/family.rb | 181 | # owns) with the given user, honoring the family's default sharing policy and | COMMENT |
| LOW | app/models/goal_pledge.rb | 41 | # | COMMENT |
| LOW | app/models/auth_config.rb | 21 | end | COMMENT |
| LOW | app/models/simplefin_item.rb | 201 | end | COMMENT |
| LOW | app/models/demo/generator.rb | 1 | require "securerandom" | COMMENT |
| LOW | app/models/demo/generator.rb | 1301 | return if depository_accounts.empty? | COMMENT |
| LOW | app/models/sophtron_item/unlinking.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 1 | require "set" | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 21 | # Initializes a new importer. | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 41 | # | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 261 | # 1. Determines the appropriate sync start date | COMMENT |
| LOW | app/models/sophtron_item/syncer.rb | 1 | # Orchestrates the complete sync process for a SophtronItem. | COMMENT |
| LOW | app/models/sophtron_item/syncer.rb | 21 | @sophtron_item = sophtron_item | COMMENT |
| LOW | …/models/plaid_account/transactions/category_matcher.rb | 1 | # The purpose of this matcher is to auto-match Plaid categories to | COMMENT |
| LOW | …/models/plaid_account/investments/security_resolver.rb | 61 | plaid_security_id: plaid_security_id | COMMENT |
| LOW | app/models/kraken_account/ledger_processor.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | …/simplefin_account/liabilities/overpayment_analyzer.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | …ls/simplefin_account/investments/holdings_processor.rb | 121 | return [ parse_decimal(raw), key ] | COMMENT |
| LOW | …implefin_account/investments/transactions_processor.rb | 1 | # SimpleFin Investment transactions processor | COMMENT |
| LOW | app/models/security/health_checker.rb | 1 | # There are hundreds of thousands of market securities that Sure must handle. | COMMENT |
| LOW | app/models/coinstats_account/transactions/processor.rb | 121 | Array(tx[:transactions]).flat_map { |entry| Array(entry.with_indifferent_access[:items]) } + | COMMENT |
| LOW | app/models/provider/base.rb | 1 | # Base class for all provider adapters | COMMENT |
| LOW | app/models/provider/base.rb | 41 | # Returns provider connection configurations | COMMENT |
| LOW | app/models/provider/plaid_adapter.rb | 1 | # PlaidAdapter serves dual purposes: | COMMENT |
| LOW | app/models/provider/rate_limitable.rb | 1 | # Shared concern for providers that need interval-based request throttling | COMMENT |
| LOW | app/models/provider/moex_public.rb | 1 | # Moscow Exchange (MOEX) market-data provider built on the free, keyless ISS | COMMENT |
| LOW | app/models/provider/frankfurter.rb | 1 | # Frankfurter (https://frankfurter.dev), a free, keyless, open-source FX rates | COMMENT |
| LOW | app/models/provider/plaid_eu_adapter.rb | 1 | # PlaidEuAdapter is a configuration-only manager for Plaid EU credentials. | COMMENT |
| LOW | app/models/provider/configurable.rb | 1 | # Module for providers to declare their configuration requirements | COMMENT |
| LOW | app/models/provider/configurable.rb | 21 | # | COMMENT |
| LOW | app/models/provider/configurable.rb | 121 | def description(text) | COMMENT |
| LOW | app/models/provider/questrade.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/provider/tinkoff_invest.rb | 1 | # T-Bank (Tinkoff) Invest API securities provider, built on the token-based REST | COMMENT |
| LOW | app/models/balance/base_calculator.rb | 21 | # | COMMENT |
| LOW | app/models/sophtron_entry/processor.rb | 1 | require "digest/md5" | COMMENT |
| LOW | app/models/sophtron_entry/processor.rb | 21 | COMMENT | |
| LOW | app/models/sophtron_entry/processor.rb | 121 | # Extracts optional notes/description from the transaction. | COMMENT |
| LOW | app/models/vector_store/base.rb | 21 | # @param store_id [String] | COMMENT |
| LOW | app/models/vector_store/pgvector.rb | 1 | # Adapter that stores embeddings locally in PostgreSQL using the pgvector extension. | COMMENT |
| LOW | app/models/vector_store/qdrant.rb | 1 | # Adapter for Qdrant — a dedicated open-source vector database. | COMMENT |
| LOW | app/models/ibkr_account/historical_balances_sync.rb | 81 | # IBKR does not emit rows for weekends and some holidays. The reverse | COMMENT |
| LOW | app/models/ibkr_account/historical_balances_sync.rb | 121 | start_non_cash_balance = previous_row ? previous_row[:non_cash] : row[:non_cash] | COMMENT |
| LOW | app/models/coinstats_entry/processor.rb | 1 | # Processes a single CoinStats transaction into a local Transaction record. | COMMENT |
| LOW | app/models/enable_banking_account/processor.rb | 41 | COMMENT | |
| 221 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | app/models/goal.rb | 588 | "#{symbol}#{amount_f.round.to_i.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\1,').reverse}" | CODE |
| CRITICAL | app/models/provider/kraken_adapter.rb | 16 | kraken_items = family.kraken_items.active.credentials_configured.ordered.select(&:credentials_configured?) | CODE |
| CRITICAL | app/models/provider/kraken_adapter.rb | 97 | credentialed_items = family.kraken_items.active.credentials_configured.ordered.select(&:credentials_configured?) | CODE |
| CRITICAL | app/controllers/categories_controller.rb | 108 | Current.family.categories.alphabetically.roots.where.not(id: @category.id) | CODE |
| CRITICAL | app/controllers/brex_items_controller.rb | 61 | @brex_items = Current.family.brex_items.active.ordered.includes(:syncs, :brex_accounts) | CODE |
| CRITICAL | app/controllers/wise_items_controller.rb | 270 | @wise_items = Current.family.wise_items.active.ordered.includes(:syncs, :wise_accounts) | CODE |
| CRITICAL | app/controllers/pages_controller.rb | 49 | @feed_insights = Current.family.insights.visible.ordered.limit(3) | CODE |
| CRITICAL | app/controllers/kraken_items_controller.rb | 193 | credentialed_items = Current.family.kraken_items.active.credentials_configured.ordered.select(&:credentials_config | CODE |
| CRITICAL | app/controllers/mercury_items_controller.rb | 415 | @mercury_items = Current.family.mercury_items.active.ordered.includes(:syncs, :mercury_accounts) | CODE |
| CRITICAL | app/controllers/mercury_items_controller.rb | 454 | @mercury_items = Current.family.mercury_items.active.ordered.includes(:syncs, :mercury_accounts) | CODE |
| CRITICAL | app/controllers/mercury_items_controller.rb | 753 | Current.family.mercury_items.active.ordered.select(&:credentials_configured?) | CODE |
| CRITICAL⚡ | app/controllers/settings/providers_controller.rb | 242 | @wise_items = Current.family.wise_items.active.ordered.includes(:syncs, :wise_accounts) | CODE |
| CRITICAL⚡ | app/controllers/settings/providers_controller.rb | 244 | @mercury_items = Current.family.mercury_items.active.ordered.includes(:syncs, :mercury_accounts) | CODE |
| CRITICAL⚡ | app/controllers/settings/providers_controller.rb | 246 | @brex_items = Current.family.brex_items.active.ordered.includes(:syncs, :brex_accounts) | CODE |
| CRITICAL | app/controllers/settings/providers_controller.rb | 292 | @questrade_items = Current.family.questrade_items.active.ordered.select(:id) | CODE |
| CRITICAL | app/controllers/settings/api_keys_controller.rb | 9 | @api_keys = Current.user.api_keys.active.visible.order(created_at: :desc) | CODE |
| CRITICAL | app/controllers/settings/api_keys_controller.rb | 57 | @api_key = Current.user.api_keys.active.visible.find(params[:id]) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/sso_provider_tester.rb | 66 | # Check if issuer matches exactly. OIDC discovery requires the configured | COMMENT |
| LOW | app/models/llm_usage.rb | 160 | # Check if this usage record represents a failed API call | COMMENT |
| LOW | app/models/oidc_identity.rb | 69 | # Check if user is in any of the mapped groups | COMMENT |
| LOW | app/models/enable_banking_account.rb | 30 | # Check if account_id looks like a valid UUID (not an identification_hash) | COMMENT |
| LOW | app/models/setting.rb | 216 | # Check if it's a declared field first | COMMENT |
| LOW | app/models/setting.rb | 245 | # Check if a dynamic field exists (useful to distinguish nil value vs missing key) | COMMENT |
| LOW | app/models/setting.rb | 250 | # Check if dynamic entry exists | COMMENT |
| LOW | app/models/holding.rb | 102 | # Check if this holding's cost_basis can be overwritten by the given source | COMMENT |
| LOW | app/models/holding.rb | 134 | # Check if this holding's security can be changed by provider sync | COMMENT |
| LOW | app/models/holding.rb | 139 | # Check if user has remapped this holding to a different security | COMMENT |
| LOW | app/models/holding.rb | 246 | # Check if cost_basis is known (has a source and positive value) | COMMENT |
| LOW | app/models/simplefin_item.rb | 173 | # Check if linked via legacy FK (use to_s for UUID comparison safety) | COMMENT |
| LOW | app/models/simplefin_item.rb | 179 | # Check if linked via AccountProvider | COMMENT |
| LOW | app/models/simplefin_item.rb | 369 | # Check if last sync was more than 3 days ago | COMMENT |
| LOW | app/models/simplefin_item.rb | 379 | # Check if linked accounts have recent transactions | COMMENT |
| LOW | app/models/simplefin_item.rb | 402 | # Check if the SimpleFin connection needs user attention | COMMENT |
| LOW | app/models/user.rb | 188 | # Check if user has a local password set (can authenticate locally) | COMMENT |
| LOW | app/models/recurring_transaction.rb | 285 | # Check if this recurring transaction has amount variance configured | COMMENT |
| LOW | app/models/recurring_transaction.rb | 290 | # Check if this recurring transaction should be marked inactive | COMMENT |
| LOW | app/models/mercury_item/importer.rb | 284 | # Check if this account has any stored transactions | COMMENT |
| LOW | app/models/recurring_transaction/identifier.rb | 41 | # Check if the last occurrence was within the last 45 days | COMMENT |
| LOW | app/models/recurring_transaction/identifier.rb | 45 | # Check if transactions occur on similar days (within 5 days of each other) | COMMENT |
| LOW | app/models/recurring_transaction/identifier.rb | 259 | # Check if days cluster together (within ~5 days variance) | COMMENT |
| LOW | app/models/provider/openai.rb | 209 | # Check if the specified model supports vision/PDF input | COMMENT |
| LOW | app/models/provider/factory.rb | 59 | # Check if a provider type has a registered adapter | COMMENT |
| LOW | app/models/provider/factory.rb | 82 | # Check if any provider supports a given account type | COMMENT |
| LOW | app/models/provider/syncable.rb | 18 | # Check if the item is currently syncing | COMMENT |
| LOW | app/models/provider/syncable.rb | 30 | # Check if the item requires an update (e.g., re-authentication) | COMMENT |
| LOW | app/models/provider/configurable.rb | 77 | # Check if provider is configured (all required fields present) | COMMENT |
| LOW | app/models/provider/configurable.rb | 162 | # Check if provider is properly configured | COMMENT |
| LOW | app/models/provider/configurable.rb | 225 | # Check if this field has a value | COMMENT |
| LOW | app/models/provider/openai/auto_categorizer.rb | 304 | # Check if one contains the other | COMMENT |
| LOW | app/models/provider/openai/auto_categorizer.rb | 445 | # Check if there's content after the thinking block | COMMENT |
| LOW | app/models/provider/openai/bank_statement_extractor.rb | 152 | # Check if we've seen this exact transaction in a different chunk | COMMENT |
| LOW | app/models/provider/openai/auto_merchant_detector.rb | 196 | # Check if too many nulls OR missing results were returned | COMMENT |
| LOW | app/models/rule/condition_filter/transaction_details.rb | 18 | # Check if extra field is empty or null | COMMENT |
| LOW | app/models/snaptrade_item/provided.rb | 48 | # Check if user is registered with SnapTrade | COMMENT |
| LOW | app/models/snaptrade_item/provided.rb | 92 | # Check if user already exists (shouldn't happen with timestamp suffix, but handle gracefully) | COMMENT |
| LOW | app/models/lunchflow_item/importer.rb | 376 | # Check if holdings are not supported (501 response) | COMMENT |
| LOW | app/models/lunchflow_item/importer.rb | 401 | # Check if this account has any stored transactions | COMMENT |
| LOW | app/models/eval/sample.rb | 77 | # Check if null is expected | COMMENT |
| LOW | app/models/eval/metrics/chat_metrics.rb | 102 | # Check if this specific function was called correctly | COMMENT |
| LOW⚡ | app/models/eval/runners/categorization_runner.rb | 167 | # Check if actual matches any acceptable category (primary or alternatives) | COMMENT |
| LOW⚡ | app/models/eval/runners/categorization_runner.rb | 175 | # Check if actual matches parent of expected category | COMMENT |
| LOW | app/models/account/linkable.rb | 67 | # Check if account is linked to a specific provider | COMMENT |
| LOW | app/models/account/linkable.rb | 72 | # Check if holdings can be deleted | COMMENT |
| LOW | app/models/account/provider_import_adapter.rb | 89 | # Check if duplicate is protected - if so, link but don't modify | COMMENT |
| LOW | app/models/coinbase_account/processor.rb | 190 | # Check if trade already exists by external_id | COMMENT |
| LOW | app/models/lunchflow_entry/processor.rb | 90 | # Check if entry with this external_id already exists | COMMENT |
| LOW | app/models/lunchflow_entry/processor.rb | 127 | # Check if an entry with this external_id already exists in the account | COMMENT |
| LOW | app/models/lunchflow_entry/processor.rb | 221 | # Check if this transaction is marked as pending | COMMENT |
| LOW | app/models/concerns/enrichable.rb | 99 | # Check if any virtual attributes changed by comparing current value with what we set | COMMENT |
| LOW | app/models/concerns/currency_normalizable.rb | 53 | # Check if a currency code is valid in the Money gem | COMMENT |
| LOW | app/jobs/snaptrade_connection_cleanup_job.rb | 26 | # Check if other accounts still use this authorization | COMMENT |
| LOW | app/jobs/indexa_capital_connection_cleanup_job.rb | 15 | # Check if other accounts still use this connection | COMMENT |
| LOW | app/jobs/identify_recurring_transactions_job.rb | 13 | # Check if this job is stale (a newer one was scheduled) | COMMENT |
| LOW | app/jobs/identify_recurring_transactions_job.rb | 17 | # Check if there are still incomplete syncs - if so, skip and let the last sync trigger it | COMMENT |
| LOW | app/controllers/lunchflow_items_controller.rb | 16 | # Check if family has credentials | COMMENT |
| LOW | app/controllers/lunchflow_items_controller.rb | 24 | # Check if already cached | COMMENT |
| LOW | app/controllers/lunchflow_items_controller.rb | 61 | # Check if family has Lunchflow credentials configured | COMMENT |
| 49 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | config/locales/views/settings/api_keys/nb.yml | 65 | your_api_key: "Din API-nøkkel" | CODE |
| HIGH | config/locales/views/settings/api_keys/ca.yml | 36 | your_api_key: La teva clau API | CODE |
| HIGH | config/locales/views/settings/api_keys/ca.yml | 118 | your_api_key: La teva clau API | CODE |
| HIGH | config/locales/views/settings/api_keys/pt-BR.yml | 66 | your_api_key: "Sua Chave de API" | CODE |
| HIGH | config/locales/views/settings/api_keys/es.yml | 66 | your_api_key: "Tu Clave API" | CODE |
| HIGH | config/locales/views/settings/api_keys/hu.yml | 38 | your_api_key: "Az API-kulcsod" | CODE |
| HIGH | config/locales/views/settings/api_keys/hu.yml | 98 | your_api_key: "Az API-kulcsod" | CODE |
| HIGH | config/locales/views/settings/api_keys/ro.yml | 66 | your_api_key: "Cheia ta API" | CODE |
| HIGH | config/locales/views/settings/api_keys/de.yml | 66 | your_api_key: Dein API-Schlüssel | CODE |
| HIGH | config/locales/views/settings/api_keys/pl.yml | 66 | your_api_key: Twój klucz API | CODE |
| HIGH | config/locales/views/settings/api_keys/en.yml | 35 | your_api_key: "Your API Key" | CODE |
| HIGH | config/locales/views/settings/api_keys/ru.yml | 35 | your_api_key: Ваш API-ключ | CODE |
| HIGH | config/locales/views/settings/api_keys/ru.yml | 133 | your_api_key: Ваш API-ключ | CODE |
| HIGH | config/locales/views/settings/api_keys/fr.yml | 30 | your_api_key: Votre clé API | CODE |
| HIGH | config/locales/views/settings/api_keys/fr.yml | 111 | your_api_key: Votre clé API | CODE |
| HIGH | config/locales/views/settings/api_keys/zh-TW.yml | 66 | your_api_key: "您的 API 金鑰" | CODE |
| HIGH | config/locales/views/settings/api_keys/tr.yml | 65 | your_api_key: "API Anahtarınız" | CODE |
| HIGH | config/locales/views/settings/api_keys/vi.yml | 38 | your_api_key: "Khóa API của bạn" | CODE |
| HIGH | config/locales/views/settings/api_keys/vi.yml | 98 | your_api_key: "Khóa API của bạn" | CODE |
| HIGH | config/locales/views/settings/api_keys/zh-CN.yml | 31 | your_api_key: 您的 API 密钥 | CODE |
| HIGH | config/locales/views/settings/api_keys/zh-CN.yml | 91 | your_api_key: 您的 API 密钥 | CODE |
| HIGH | config/locales/views/settings/api_keys/nl.yml | 66 | your_api_key: "Uw API Key" | CODE |
| HIGH | docs/hosting/ai.md | 1200 | QDRANT_API_KEY=your-api-key # Optional, for authenticated instances | CODE |
| HIGH | docs/llm-guides/adding-a-securities-provider.md | 402 | provider = Provider::YourProvider.new("your_api_key") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | app/data_migrations/balance_component_migrator.rb | 4 | # Step 1: Update flows factor | COMMENT |
| LOW⚡ | app/data_migrations/balance_component_migrator.rb | 12 | # Step 2: Set start values using LOCF (Last Observation Carried Forward) | COMMENT |
| LOW | app/data_migrations/balance_component_migrator.rb | 33 | # Step 3: Calculate net inflows | COMMENT |
| LOW | app/models/mercury_item/importer.rb | 12 | # Step 1: Fetch all accounts from Mercury | COMMENT |
| LOW | app/models/mercury_item/importer.rb | 27 | # Step 2: Update linked accounts and create records for new accounts from API | COMMENT |
| LOW | app/models/mercury_item/importer.rb | 81 | # Step 3: Fetch transactions only for linked accounts with active status | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 74 | # Step 1: Fetch all accounts from Sophtron | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 89 | # Step 2: Update linked accounts and create records for new accounts from API | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 138 | # Step 3: Fetch transactions only for linked accounts with active status | COMMENT |
| LOW⚡ | app/models/provider/yahoo_finance.rb | 636 | # Step 1: Get cookie from Yahoo Finance | COMMENT |
| LOW⚡ | app/models/provider/yahoo_finance.rb | 643 | # Step 2: Get crumb using the cookie | COMMENT |
| LOW⚡ | app/models/snaptrade_item/importer.rb | 31 | # Step 1: Fetch and store all accounts | COMMENT |
| LOW⚡ | app/models/snaptrade_item/importer.rb | 34 | # Step 2: For LINKED accounts only, fetch holdings and activities | COMMENT |
| LOW⚡ | app/models/questrade_item/importer.rb | 32 | # Step 1: Fetch and store all accounts | COMMENT |
| LOW⚡ | app/models/questrade_item/importer.rb | 35 | # Step 2: For LINKED accounts only, fetch data | COMMENT |
| LOW | app/models/lunchflow_item/importer.rb | 14 | # Step 1: Fetch all accounts from Lunchflow | COMMENT |
| LOW | app/models/lunchflow_item/importer.rb | 29 | # Step 2: Update linked accounts and create records for new accounts from API | COMMENT |
| LOW | app/models/lunchflow_item/importer.rb | 80 | # Step 3: Fetch transactions only for linked accounts with active status | COMMENT |
| LOW⚡ | app/models/provider_merchant/enhancer.rb | 32 | # Step 1: Update the provider merchant with website + logo | COMMENT |
| LOW⚡ | app/models/provider_merchant/enhancer.rb | 38 | # Step 2: Deduplicate — find other merchants with the same website_url | COMMENT |
| LOW⚡ | app/models/indexa_capital_item/importer.rb | 24 | # Step 1: Fetch and store all accounts | COMMENT |
| LOW⚡ | app/models/indexa_capital_item/importer.rb | 27 | # Step 2: For LINKED accounts only, fetch holdings data | COMMENT |
| LOW | app/models/simplefin_item/importer.rb | 521 | # Step 2: Fetch transactions/holdings using the regular window. | COMMENT |
| LOW⚡ | app/jobs/simplefin_connection_update_job.rb | 17 | # Step 1: Claim the new token and update the existing item's access_url. | COMMENT |
| LOW⚡ | app/jobs/simplefin_connection_update_job.rb | 21 | # Step 2: Sync the item to import fresh data. | COMMENT |
| LOW | app/controllers/wise_items_controller.rb | 19 | # Step 1: Validate token and fetch profiles, then proceed to profile selection. | COMMENT |
| LOW | app/controllers/wise_items_controller.rb | 51 | # Step 2: Show profile selection. | COMMENT |
| LOW | app/controllers/wise_items_controller.rb | 62 | # Step 3: Create one WiseItem per selected profile. | COMMENT |
| LOW | test/models/balance/forward_calculator_test.rb | 747 | # Step 1: Create account with a EUR entry and a stale exchange rate (1:1 EUR→USD). | COMMENT |
| LOW⚡ | test/models/balance/forward_calculator_test.rb | 765 | # Step 2: Corrected exchange rate arrives later (e.g. daily cron imports it). | COMMENT |
| LOW⚡ | test/models/balance/forward_calculator_test.rb | 768 | # Step 3: Next sync requests incremental from today — but the guard should | COMMENT |
| LOW⚡ | test/system/property_test.rb | 76 | # Step 2: Enter balance information | COMMENT |
| LOW⚡ | test/system/property_test.rb | 81 | # Step 3: Enter address information | COMMENT |
| LOW | test/system/accounts_test.rb | 26 | # Step 1: Select property type and enter basic details | COMMENT |
| LOW⚡ | test/system/accounts_test.rb | 37 | # Step 2: Enter balance information | COMMENT |
| LOW⚡ | test/system/accounts_test.rb | 42 | # Step 3: Enter address information | COMMENT |
| LOW | docs/hosting/docker.md | 9 | ### Step 1: Install Docker | COMMENT |
| LOW | docs/hosting/docker.md | 22 | ### Step 2: Configure your Docker Compose file and environment | COMMENT |
| LOW | docs/hosting/docker.md | 162 | ### Step 4: Run the app | COMMENT |
| LOW | docs/hosting/docker.md | 176 | ### Step 5: Create your account | COMMENT |
| LOW | docs/hosting/docker.md | 193 | ### Step 6: Run the app in the background | COMMENT |
| LOW | docs/hosting/docker.md | 207 | ### Step 7: Enjoy! | COMMENT |
| LOW | docs/hosting/hetzner.md | 14 | ## Step 1: Server Setup and Security | COMMENT |
| LOW | docs/hosting/hetzner.md | 53 | ## Step 2: Create Application Directory | COMMENT |
| LOW | docs/hosting/hetzner.md | 64 | ## Step 3: Configure Environment Variables | COMMENT |
| LOW | docs/hosting/hetzner.md | 93 | ## Step 4: Set Up Reverse Proxy with SSL | COMMENT |
| LOW | docs/hosting/hetzner.md | 140 | ## Step 5: Deploy the Application | COMMENT |
| LOW | docs/hosting/hetzner.md | 161 | ## Step 6: Test the Deployment | COMMENT |
| LOW | docs/hosting/hetzner.md | 189 | ## Step 7: Set Up Automated Backups | COMMENT |
| LOW | docs/hosting/hetzner.md | 234 | ## Step 8: Set Up Basic Monitoring | COMMENT |
| LOW | docs/llm-guides/adding-a-securities-provider.md | 29 | ## Step 1: Create the Provider Class | COMMENT |
| LOW | docs/llm-guides/adding-a-securities-provider.md | 271 | ## Step 2: Register in the Provider Registry | COMMENT |
| LOW | docs/llm-guides/adding-a-securities-provider.md | 307 | ## Step 3: Add Settings | COMMENT |
| LOW | docs/llm-guides/adding-a-securities-provider.md | 331 | ## Step 4: Add to the Settings UI | COMMENT |
| LOW | docs/llm-guides/adding-a-securities-provider.md | 353 | ## Step 5: Add Translations | COMMENT |
| LOW | docs/llm-guides/adding-a-securities-provider.md | 396 | ## Step 6: Test | COMMENT |
| LOW | mobile/docs/SIGNING_SETUP.md | 7 | ### Step 1: Get Keystore Base64 Encoding | COMMENT |
| LOW | mobile/docs/SIGNING_SETUP.md | 16 | ### Step 2: Add Secrets on GitHub | COMMENT |
| LOW | mobile/docs/SIGNING_SETUP.md | 31 | ### Step 3: Verify Setup | COMMENT |
| LOW⚡ | mobile/lib/services/sync_service.dart | 543 | // Step 1: Process pending deletes (do this first to free up resources) | COMMENT |
| 3 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | app/data_migrations/balance_component_migrator.rb | 4 | # Step 1: Update flows factor | COMMENT |
| LOW⚡ | app/data_migrations/balance_component_migrator.rb | 12 | # Step 2: Set start values using LOCF (Last Observation Carried Forward) | COMMENT |
| LOW | app/data_migrations/balance_component_migrator.rb | 33 | # Step 3: Calculate net inflows | COMMENT |
| LOW | app/models/mercury_item/importer.rb | 12 | # Step 1: Fetch all accounts from Mercury | COMMENT |
| LOW | app/models/mercury_item/importer.rb | 27 | # Step 2: Update linked accounts and create records for new accounts from API | COMMENT |
| LOW | app/models/mercury_item/importer.rb | 81 | # Step 3: Fetch transactions only for linked accounts with active status | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 74 | # Step 1: Fetch all accounts from Sophtron | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 89 | # Step 2: Update linked accounts and create records for new accounts from API | COMMENT |
| LOW | app/models/sophtron_item/importer.rb | 138 | # Step 3: Fetch transactions only for linked accounts with active status | COMMENT |
| LOW⚡ | app/models/provider/yahoo_finance.rb | 636 | # Step 1: Get cookie from Yahoo Finance | COMMENT |
| LOW⚡ | app/models/provider/yahoo_finance.rb | 643 | # Step 2: Get crumb using the cookie | COMMENT |
| LOW⚡ | app/models/snaptrade_item/importer.rb | 31 | # Step 1: Fetch and store all accounts | COMMENT |
| LOW⚡ | app/models/snaptrade_item/importer.rb | 34 | # Step 2: For LINKED accounts only, fetch holdings and activities | COMMENT |
| LOW⚡ | app/models/questrade_item/importer.rb | 32 | # Step 1: Fetch and store all accounts | COMMENT |
| LOW⚡ | app/models/questrade_item/importer.rb | 35 | # Step 2: For LINKED accounts only, fetch data | COMMENT |
| LOW | app/models/lunchflow_item/importer.rb | 14 | # Step 1: Fetch all accounts from Lunchflow | COMMENT |
| LOW | app/models/lunchflow_item/importer.rb | 29 | # Step 2: Update linked accounts and create records for new accounts from API | COMMENT |
| LOW | app/models/lunchflow_item/importer.rb | 80 | # Step 3: Fetch transactions only for linked accounts with active status | COMMENT |
| LOW⚡ | app/models/provider_merchant/enhancer.rb | 32 | # Step 1: Update the provider merchant with website + logo | COMMENT |
| LOW⚡ | app/models/provider_merchant/enhancer.rb | 38 | # Step 2: Deduplicate — find other merchants with the same website_url | COMMENT |
| LOW⚡ | app/models/indexa_capital_item/importer.rb | 24 | # Step 1: Fetch and store all accounts | COMMENT |
| LOW⚡ | app/models/indexa_capital_item/importer.rb | 27 | # Step 2: For LINKED accounts only, fetch holdings data | COMMENT |
| LOW | app/models/concerns/enrichable.rb | 95 | # So we need to check if the value actually changed by comparing before/after | COMMENT |
| LOW | app/models/simplefin_item/importer.rb | 521 | # Step 2: Fetch transactions/holdings using the regular window. | COMMENT |
| LOW⚡ | app/jobs/simplefin_connection_update_job.rb | 17 | # Step 1: Claim the new token and update the existing item's access_url. | COMMENT |
| LOW⚡ | app/jobs/simplefin_connection_update_job.rb | 21 | # Step 2: Sync the item to import fresh data. | COMMENT |
| LOW | app/controllers/wise_items_controller.rb | 19 | # Step 1: Validate token and fetch profiles, then proceed to profile selection. | COMMENT |
| LOW | app/controllers/wise_items_controller.rb | 51 | # Step 2: Show profile selection. | COMMENT |
| LOW | app/controllers/wise_items_controller.rb | 62 | # Step 3: Create one WiseItem per selected profile. | COMMENT |
| LOW | test/models/balance/forward_calculator_test.rb | 747 | # Step 1: Create account with a EUR entry and a stale exchange rate (1:1 EUR→USD). | COMMENT |
| LOW⚡ | test/models/balance/forward_calculator_test.rb | 765 | # Step 2: Corrected exchange rate arrives later (e.g. daily cron imports it). | COMMENT |
| LOW⚡ | test/models/balance/forward_calculator_test.rb | 768 | # Step 3: Next sync requests incremental from today — but the guard should | COMMENT |
| LOW⚡ | test/system/property_test.rb | 76 | # Step 2: Enter balance information | COMMENT |
| LOW⚡ | test/system/property_test.rb | 81 | # Step 3: Enter address information | COMMENT |
| LOW | test/system/accounts_test.rb | 26 | # Step 1: Select property type and enter basic details | COMMENT |
| LOW⚡ | test/system/accounts_test.rb | 37 | # Step 2: Enter balance information | COMMENT |
| LOW⚡ | test/system/accounts_test.rb | 42 | # Step 3: Enter address information | COMMENT |
| LOW⚡ | mobile/lib/services/sync_service.dart | 543 | // Step 1: Process pending deletes (do this first to free up resources) | COMMENT |
| LOW⚡ | mobile/lib/services/sync_service.dart | 549 | // Step 2: Upload pending transactions | COMMENT |
| LOW⚡ | mobile/lib/services/sync_service.dart | 555 | // Step 3: Download transactions from server | COMMENT |
| LOW⚡ | mobile/lib/services/sync_service.dart | 561 | // Step 4: Sync accounts | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/demo/generator.rb | 43 | create_family_and_users!("Demo Family", "user@example.com", onboarded: true, subscribed: true) | CODE |
| LOW | app/models/demo/generator.rb | 58 | create_family_and_users!("Demo Family", "user@example.com", onboarded: false, subscribed: false) | CODE |
| LOW | app/models/demo/generator.rb | 87 | def generate_default_data!(skip_clear: false, email: "user@example.com") | CODE |
| LOW | app/models/account/provider_import_adapter.rb | 332 | # This handles case variations in merchant names (e.g., "ACME Corp" vs "Acme Corp") | COMMENT |
| LOW | test/models/indexa_capital_item_test.rb | 37 | username: "user@example.com", document: "12345678A", password: "secret" | CODE |
| LOW | test/models/address_test.rb | 6 | line1: "123 Main St", | CODE |
| LOW | test/models/address_test.rb | 18 | line1: "123 Main St", | CODE |
| LOW⚡ | test/models/user_test.rb | 53 | user = User.new(email: "user@example.com") | CODE |
| LOW⚡ | test/models/user_test.rb | 54 | assert_equal "user@example.com", user.display_name | CODE |
| LOW⚡ | test/models/user_test.rb | 62 | user = User.new(email: "user@example.com") | CODE |
| LOW | test/models/provider/anthropic_test.rb | 70 | Setting.stubs(:anthropic_access_token).returns("fake-token-1") | CODE |
| LOW | test/models/provider/anthropic_test.rb | 74 | ClimateControl.modify("ANTHROPIC_API_KEY" => "fake-token-2") do | CODE |
| LOW | test/models/provider/indexa_capital_test.rb | 13 | username: "user@example.com", | CODE |
| LOW | test/models/provider/indexa_capital_test.rb | 28 | Provider::IndexaCapital.new(username: "user@example.com") | CODE |
| LOW | test/models/provider/indexa_capital_test.rb | 32 | Provider::IndexaCapital.new(username: "user@example.com", document: "12345678A") | CODE |
| LOW | …ls/provider/anthropic/bank_statement_extractor_test.rb | 16 | "account_holder" => "Jane Doe", | CODE |
| LOW | …ls/provider/anthropic/bank_statement_extractor_test.rb | 37 | assert_equal "Jane Doe", result[:account_holder] | CODE |
| LOW | …odels/provider/openai/bank_statement_extractor_test.rb | 15 | "account_holder" => "John Doe", | CODE |
| LOW | …odels/provider/openai/bank_statement_extractor_test.rb | 46 | assert_equal "John Doe", result[:account_holder] | CODE |
| LOW | …odels/provider/openai/bank_statement_extractor_test.rb | 89 | "account_holder" => "John Doe", | CODE |
| LOW⚡ | test/models/mercury_entry/processor_test.rb | 58 | process(tx(counterparty_name: "Acme Corp")) | CODE |
| LOW⚡ | test/models/mercury_entry/processor_test.rb | 59 | assert_equal "Acme Corp", @account.entries.last.name | CODE |
| LOW | test/models/questrade_account/processor_test.rb | 8 | @questrade_item = @family.questrade_items.create!(name: "Test", refresh_token: "dummy-token") | CODE |
| LOW⚡ | test/system/property_test.rb | 83 | fill_in "Address Line 1", with: "123 Main St" | CODE |
| LOW | test/system/property_test.rb | 97 | assert_equal "123 Main St", created_account.property.address.line1 | CODE |
| LOW⚡ | test/system/accounts_test.rb | 44 | fill_in "Address Line 1", with: "123 Main St" | CODE |
| LOW | test/system/accounts_test.rb | 58 | assert_equal "123 Main St", created_account.property.address.line1 | CODE |
| LOW | test/vcr_cassettes/stripe/checkout_session.yml | 117 | "email": "user@example.com", | CODE |
| LOW | test/vcr_cassettes/stripe/checkout_session.yml | 123 | "customer_email": "user@example.com", | CODE |
| LOW | config/locales/views/properties/en.yml | 30 | address_line1_placeholder: "123 Main Street" | CODE |
| LOW | config/locales/views/properties/vi.yml | 30 | address_line1_placeholder: "123 Main Street" | CODE |
| LOW | docs/hosting/oidc.md | 189 | User.find_by(email: "admin@example.com").update!(role: :super_admin) | CODE |
| LOW | docs/hosting/oidc.md | 192 | User.find_by(email: "admin@example.com").role # => "super_admin" | CODE |
| LOW | mobile/test/services/telemetry_service_test.dart | 139 | expect(TelemetryService.sanitizeUserId('user@example.com'), isNull); | CODE |
| LOW⚡ | mobile/test/services/telemetry_service_test.dart | 150 | id: 'user@example.com', | CODE |
| LOW⚡ | mobile/test/services/telemetry_service_test.dart | 151 | email: 'user@example.com', | CODE |
| LOW⚡ | mobile/test/services/telemetry_service_test.dart | 161 | expect(userJson, isNot(contains('user@example.com'))); | CODE |
| LOW | mobile/test/services/telemetry_service_test.dart | 188 | expect(filtered.message, isNot(contains('user@example.com'))); | CODE |
| LOW | mobile/test/services/telemetry_service_test.dart | 246 | expect(filtered.message!.formatted, isNot(contains('user@example.com'))); | CODE |
| LOW | mobile/test/services/log_service_test.dart | 20 | expect(sanitized, isNot(contains('user@example.com'))); | CODE |
| LOW | mobile/test/services/log_service_test.dart | 112 | expect(exported, isNot(contains('user@example.com'))); | CODE |
| LOW | mobile/test/services/log_service_test.dart | 126 | isNot(contains('user@example.com'))); | CODE |
| LOW | mobile/test/services/log_service_test.dart | 131 | expect(exported, isNot(contains('user@example.com'))); | CODE |
| LOW | mobile/lib/screens/login_screen.dart | 38 | static const _emailPlaceholder = 'user@example.com'; | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/models/sophtron_item/importer.rb | 5 | # This class orchestrates the complete import process for a SophtronItem: | COMMENT |
| MEDIUM | app/models/sophtron_item/syncer.rb | 26 | # This method orchestrates all phases of the sync: | COMMENT |
| MEDIUM | app/models/provider/openai.rb | 320 | # caller batches are split to fit the model's context window. `fixed` is | COMMENT |
| MEDIUM | app/models/provider/openai/auto_merchant_detector.rb | 462 | # Enhanced developer message with few-shot examples for smaller/local LLMs | COMMENT |
| MEDIUM | app/models/vector_store/embeddable.rb | 41 | # embedding model token limits. | COMMENT |
| MEDIUM | app/models/vector_store/pgvector.rb | 10 | # - An embedding model endpoint (EMBEDDING_URI_BASE / EMBEDDING_MODEL) | COMMENT |
| MEDIUM | app/models/vector_store/qdrant.rb | 4 | # Like the Pgvector adapter you still supply your own embedding model; Qdrant | COMMENT |
| MEDIUM | app/models/vector_store/qdrant.rb | 10 | # - An embedding model endpoint (EMBEDDING_MODEL_URL / EMBEDDING_MODEL_NAME) | COMMENT |
| MEDIUM | app/controllers/pages_controller.rb | 4 | # Per-widget dashboard layout guardrails. Deterministic defaults the masonry | COMMENT |
| MEDIUM | app/controllers/pages_controller.rb | 192 | # Resolves a section's layout guardrails, applying the user's height preset | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/simplefin_account.rb | 108 | # For custom currency URLs, we'll just use the last part as currency code | COMMENT |
| MEDIUM | app/models/holding.rb | 217 | # typically be for real tickers not CUSTOM: ones. A more robust solution would track which | COMMENT |
| LOW | app/models/simplefin_item.rb | 191 | # We don't destroy it because has_one :account, dependent: :nullify would nullify the FK we just set | COMMENT |
| LOW | app/models/simplefin_item.rb | 193 | # trigger autosave on the preloaded account association, reverting the FK we just set! | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 86 | # Generate comprehensive realistic demo data with multi-currency | COMMENT |
| MEDIUM | …ls/simplefin_account/investments/holdings_processor.rb | 44 | # Parse provider data with robust fallbacks across SimpleFin sources | COMMENT |
| LOW | test/models/coinstats_account/processor_test.rb | 36 | # Should not raise, just return early | COMMENT |
| LOW | test/controllers/settings/providers_controller_test.rb | 218 | # Entry should be removed, not just set to nil | COMMENT |
| LOW | config/initializers/00_ssl.rb | 257 | # Fallback: just use the custom CA (may break connections to public services) | COMMENT |
| MEDIUM | lib/generators/provider/family/family_generator.rb | 186 | # This approach is more robust than trying to append to an existing include line | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | compose.example.ai.yml | 181 | - OLLAMA_MODELS=deepseek-r1:8b,llama3.1:8b,nomic-embed-text # Pre-load model on startup, you can change this to yo | CODE |
| MEDIUM | config/initializers/doorkeeper.rb | 396 | # For example you can add an additional database column to `oauth_applications` table, | COMMENT |
| LOW | config/initializers/doorkeeper.rb | 53 | # Don't forget to include Doorkeeper ORM mixins into your custom models: | COMMENT |
| LOW | config/initializers/doorkeeper.rb | 84 | # [NOTE] If you apply this option on already existing project don't forget to manually | COMMENT |
| LOW | config/initializers/doorkeeper.rb | 84 | # [NOTE] If you apply this option on already existing project don't forget to manually | COMMENT |
| LOW | config/initializers/doorkeeper.rb | 518 | # them to make sure you doesn't get NoMethodError exception. | COMMENT |
| MEDIUM | spec/spec_helper.rb | 48 | # with RSpec, but feel free to customize to your heart's content. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/concerns/currency_normalizable.rb | 9 | # Usage: | COMMENT |
| LOW | app/jobs/snaptrade_activities_fetch_job.rb | 7 | # Usage: | COMMENT |
| LOW | app/services/provider_loader.rb | 6 | # Usage: | COMMENT |
| LOW | test/support/provider_adapter_test_interface.rb | 4 | # Usage: | COMMENT |
| LOW | lib/generators/provider/family/family_generator.rb | 6 | # Usage: | COMMENT |
| LOW | lib/generators/provider/global/global_generator.rb | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/enable_banking_item.rb | 51 | # TODO: implement data retention policy for last_psu_ip (GDPR/CCPA — nullify after session expiry or 90 days) | COMMENT |