The personal finance app for everyone (by everyone)
This report presents the forensic synthetic code analysis of we-promise/sure, a Ruby project with 9,639 GitHub stars. SynthScan v2.0 examined 541,943 lines of code across 4878 source files, recording 1787 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 6.3 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 1787 distinct pattern matches across 16 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 | 401 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | app/models/budget.rb | 403 | # ============================================================================= | COMMENT |
| MEDIUM | app/models/budget.rb | 443 | # ============================================================================= | COMMENT |
| MEDIUM | app/models/budget.rb | 445 | # ============================================================================= | COMMENT |
| MEDIUM | app/models/budget.rb | 473 | # ============================================================================= | COMMENT |
| MEDIUM | app/models/budget.rb | 475 | # ============================================================================= | 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 | 411 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 413 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 872 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 874 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 993 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 995 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 1018 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 1020 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 1173 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/models/demo/generator.rb | 1175 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/demo/generator.rb | 1238 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/demo/generator.rb | 1240 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/demo/generator.rb | 1247 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/demo/generator.rb | 1249 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/models/provider/yahoo_finance.rb | 705 | # ================================ | COMMENT |
| MEDIUM⚡ | app/models/provider/yahoo_finance.rb | 707 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 121 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 123 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 192 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 194 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 562 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 564 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 632 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 634 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 688 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 690 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 859 | # ================================ | COMMENT |
| MEDIUM | app/models/provider/yahoo_finance.rb | 861 | # ================================ | 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 |
| 307 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pipelock.example.yaml | 4 | # This file is validated in CI with Pipelock 3.4.0. See the release changelog | COMMENT |
| MEDIUM⚡ | compose.example.yml | 8 | # This file is an example Docker Compose configuration for self hosting | COMMENT |
| MEDIUM | compose.example.ai.yml | 145 | # 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 | 156 | # 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/family/auto_transfer_matchable.rb | 79 | # Create the transfer for a matched candidate, tolerating a concurrent 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 | 641 | # Create the Sure account | COMMENT |
| MEDIUM | app/controllers/plaid_items_controller.rb | 90 | # Create the link via AccountProvider | COMMENT |
| MEDIUM | app/controllers/oidc_accounts_controller.rb | 170 | # 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 | 207 | # Create a regular transfer between accounts | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 221 | # Create a loan payment transaction | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 234 | # Create a one-time transaction | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 247 | # Create a payment transaction (credit card payment) | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 260 | # Create an excluded transaction | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 309 | # Create a truly empty family | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 341 | # Create a transfer to investment account (marked as investment_contribution) | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 390 | # Create a Roth IRA (tax-exempt) investment account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 398 | # Create a dividend transaction in the Roth IRA | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 412 | # Create a 401k (tax-deferred) investment account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 420 | # Create a dividend transaction in the 401k | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 434 | # Create a taxable brokerage account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 442 | # Create a dividend transaction in the taxable account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 456 | # Create a crypto account (default taxable) | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 464 | # Create a transaction in the crypto account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 476 | # Create a crypto account in a tax-deferred retirement account | COMMENT |
| MEDIUM | test/models/income_statement_test.rb | 484 | # Create a transaction in the tax-deferred crypto account | COMMENT |
| MEDIUM⚡ | test/models/income_statement_test.rb | 672 | # Create a fresh family with ONLY tax-advantaged accounts | COMMENT |
| MEDIUM⚡ | test/models/income_statement_test.rb | 680 | # Create a 401k account (tax-deferred) | COMMENT |
| MEDIUM⚡ | test/models/income_statement_test.rb | 688 | # 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 |
| 134 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/snaptrade_account.rb | 199 | def cash_equivalent_position_value(currency_code = currency) | CODE |
| LOW | app/models/category_import.rb | 113 | def ensure_placeholder_category(name) | CODE |
| LOW | app/models/redbark_item.rb | 42 | def import_latest_redbark_data(sync: nil) | 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 | 373 | def create_from_kraken_account(kraken_account) | CODE |
| LOW | app/models/account.rb | 380 | def create_from_onchain_wallet_account(onchain_wallet_account) | CODE |
| LOW | app/models/account.rb | 402 | def create_from_crypto_exchange_account(provider_account, family:) | CODE |
| LOW | app/models/account.rb | 419 | def build_simplefin_accountable_attributes(simplefin_account, account_type, subtype) | CODE |
| LOW | app/models/category.rb | 273 | def localized_default_name_for(name) | CODE |
| LOW | app/models/category.rb | 280 | def default_category_translation_key_for(name) | CODE |
| LOW | app/models/investment_statement.rb | 288 | def convert_to_family_currency(amount, from_currency) | CODE |
| LOW | app/models/market_data_importer.rb | 103 | def get_first_required_price_date(security) | CODE |
| LOW | app/models/market_data_importer.rb | 110 | def get_first_required_exchange_rate_date(from_currency:) | CODE |
| LOW | app/models/rule_import.rb | 99 | def extract_conditions_and_actions(fragments) | CODE |
| LOW | app/models/rule_import.rb | 119 | def create_or_update_rule_from_row(row) | CODE |
| LOW | app/models/rule_import.rb | 210 | def resolve_import_condition_value(condition_data) | CODE |
| LOW | app/models/rule_import.rb | 241 | def resolve_import_action_value(action_data) | CODE |
| LOW | app/models/goal.rb | 216 | def whole_account_conflicts_on(account_ids, excluding_link_id: nil) | CODE |
| LOW | app/models/ai_health.rb | 263 | def openai_compatible_provider_name(value) | CODE |
| LOW⚡ | app/models/sure_import.rb | 62 | def dry_run_totals_from_ndjson(content) | CODE |
| LOW⚡ | app/models/sure_import.rb | 66 | def dry_run_totals_from_line_type_counts(counts) | CODE |
| LOW⚡ | app/models/sure_import.rb | 72 | def expected_record_counts_from_ndjson(content) | CODE |
| LOW⚡ | app/models/sure_import.rb | 76 | def expected_record_counts_from_line_type_counts(counts) | CODE |
| LOW | app/models/sure_import.rb | 294 | 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 | 48 | 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 | 197 | def secondary_enabled_currency_objects(extra: []) | CODE |
| LOW | app/models/family.rb | 238 | def auto_share_existing_accounts_with(user) | CODE |
| LOW⚡ | app/models/family.rb | 327 | def auto_categorize_transactions_later(transactions, rule_run_id: nil) | CODE |
| LOW⚡ | app/models/family.rb | 331 | def auto_categorize_transactions(transaction_ids) | CODE |
| LOW⚡ | app/models/family.rb | 335 | def auto_detect_transaction_merchants_later(transactions, rule_run_id: nil) | CODE |
| LOW⚡ | app/models/family.rb | 339 | def auto_detect_transaction_merchants(transaction_ids) | CODE |
| LOW | app/models/family.rb | 458 | 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 | 213 | def undelivered_error_payload(assistant_message) | CODE |
| LOW | app/models/pdf_import.rb | 467 | def partition_already_recorded(candidates) | 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 | 179 | def set_preloaded_activity_security(security) | CODE |
| LOW | app/models/transaction.rb | 357 | def pending_duplicate_candidates(limit: 20, offset: 0) | CODE |
| LOW | app/models/budget.rb | 99 | def latest_valid_budget_start_date(family) | CODE |
| LOW⚡ | app/models/budget.rb | 412 | def budget_category_actual_spending(budget_category) | CODE |
| LOW⚡ | app/models/budget.rb | 419 | def category_median_monthly_expense(category) | CODE |
| LOW⚡ | app/models/budget.rb | 423 | def category_avg_monthly_expense(category) | CODE |
| LOW | app/models/budget.rb | 507 | def convert_to_budget_currency(amount, from_currency) | 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 |
| 418 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pipelock.example.yaml | 1 | # Pipelock configuration for Docker Compose | 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 | # directly to Sure's /mcp endpoint. Note: /mcp is still reachable | 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 | 81 | # Set both values to activate. MCP_USER_EMAIL must match an existing user's email. | COMMENT |
| LOW | compose.example.ai.yml | 101 | # | COMMENT |
| LOW | compose.example.ai.yml | 141 | - ./pipelock.example.yaml:/etc/pipelock/pipelock.yaml:ro | COMMENT |
| LOW | app/constraints/super_admin_constraint.rb | 1 | # Routing constraint for mounting engines that bypass ApplicationController | COMMENT |
| LOW | app/models/snaptrade_account.rb | 81 | # { | 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 | 461 | COMMENT | |
| LOW | app/models/goal.rb | 1 | class Goal < ApplicationRecord | COMMENT |
| LOW | app/models/goal.rb | 41 | # the monthly job would leave a brand-new one wrong until the 1st, so the | COMMENT |
| LOW | app/models/goal.rb | 81 | # own account lock in association order. Two goals saving links on the same | COMMENT |
| LOW | app/models/goal.rb | 101 | FUNDABLE_ACCOUNT_TYPES = %w[Depository Investment].freeze | COMMENT |
| LOW | app/models/goal.rb | 181 | # Whole-account links held by OTHER goals of this family on any of | COMMENT |
| LOW | app/models/goal.rb | 221 | # two requests can both find no conflict and both commit a whole-account | COMMENT |
| LOW | app/models/goal.rb | 381 | # earmarked slice (goal_accounts.allocated_amount) or — when unallocated — | COMMENT |
| LOW | app/models/goal.rb | 481 | COMMENT | |
| LOW | app/models/goal.rb | 541 | # for counts as found: it did its job. Without that term, coming home from | COMMENT |
| LOW | app/models/goal.rb | 561 | # the transaction is stamped and a second attempt on the same outflow is | COMMENT |
| LOW | app/models/goal.rb | 601 | # A fixed earmark never has that window, because shrinking it caps the | COMMENT |
| LOW | app/models/goal.rb | 701 | (remaining_amount.to_d / months_remaining.to_d).ceil(2) | COMMENT |
| LOW | app/models/goal.rb | 761 | series_values = balance_series_values | COMMENT |
| LOW | app/models/goal.rb | 921 | # Confirm dialog for deleting this goal, shared by the show-page kebab and | COMMENT |
| LOW | app/models/goal.rb | 1181 | # under its previous life goes with the frozen figure — leaving it would | COMMENT |
| LOW | app/models/goal.rb | 1201 | # Runs on a target_amount edit too, and overwrites it. In this mode the | COMMENT |
| LOW | app/models/goal.rb | 1381 | return unless goal_accounts.where.not(id: nil).exists? | 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 | 341 | update!(reconciled_at: nil, reconciled_by_statement: nil) | COMMENT |
| LOW | app/models/sophtron_account.rb | 1 | # Represents a single bank account from Sophtron. | COMMENT |
| LOW | app/models/family.rb | 121 | # Families with at least one opted-in member. Lets a job filter in one | COMMENT |
| LOW | app/models/family.rb | 221 | end | COMMENT |
| LOW | app/models/family.rb | 581 | # uses at request time, so "valid at save time" and "valid when rendering" | COMMENT |
| LOW | app/models/onchain_wallet_item.rb | 101 | # them would throw away the balance history the user came here for. | COMMENT |
| LOW | app/models/insight.rb | 1 | # A proactive, typed observation about a family's finances, produced nightly | COMMENT |
| LOW | app/models/budget_category.rb | 41 | # step — YNAB's "roll with the punches". Deliberately keeps no history: | COMMENT |
| LOW | app/models/budget_category.rb | 81 | # on read and carries no budget_id, so it would otherwise be reported | COMMENT |
| LOW | app/models/budget.rb | 181 | # --- Cash on hand, next to the plan --- | COMMENT |
| LOW | app/models/goal_pledge.rb | 41 | # | COMMENT |
| LOW | app/models/background_job_console.rb | 1 | require "sidekiq/api" | COMMENT |
| LOW | app/models/auth_config.rb | 21 | COMMENT | |
| LOW | app/models/goal_account.rb | 21 | private | COMMENT |
| LOW | app/models/goal_account.rb | 41 | # Only guard what is being written now. Rows that predate this | COMMENT |
| LOW | app/models/sidekiq_health.rb | 1 | # Snapshot of Sidekiq's current operational state, used to surface a | COMMENT |
| LOW | app/models/sidekiq_health.rb | 21 | # conservative — covers a temporarily-paused worker, deploy restart, or | COMMENT |
| LOW | app/models/trade.rb | 21 | # | COMMENT |
| LOW | app/models/import.rb | 121 | class << self | COMMENT |
| LOW | app/models/import.rb | 541 | COMMENT | |
| LOW | app/models/import.rb | 661 | COMMENT | |
| LOW | app/models/notification_delivery.rb | 1 | class NotificationDelivery < ApplicationRecord | COMMENT |
| LOW | app/models/simplefin_item.rb | 221 | # trigger autosave on the preloaded account association, reverting the FK we just set! | COMMENT |
| LOW | app/models/demo/generator.rb | 1 | require "securerandom" | COMMENT |
| LOW | app/models/enable_banking_entry/processor.rb | 1 | require "digest/md5" | COMMENT |
| LOW | app/models/enable_banking_item/importer.rb | 641 | date_from: start_date, | 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 |
| 315 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | app/models/goal.rb | 1269 | "#{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/insights_controller.rb | 69 | @feed_insights = Current.family.insights.visible.ordered.limit(Insight::FEED_LIMIT).to_a | CODE |
| CRITICAL | app/controllers/categories_controller.rb | 133 | 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 | 275 | @wise_items = Current.family.wise_items.active.ordered.includes(:syncs, :wise_accounts) | CODE |
| CRITICAL | app/controllers/pages_controller.rb | 56 | @feed_insights = preview_features_enabled? ? Current.family.insights.visible.ordered.limit(Insight::FEED_LIMIT) : In | 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 | 256 | @wise_items = Current.family.wise_items.active.ordered.includes(:syncs, :wise_accounts) | CODE |
| CRITICAL⚡ | app/controllers/settings/providers_controller.rb | 258 | @mercury_items = Current.family.mercury_items.active.ordered.includes(:syncs, :mercury_accounts) | CODE |
| CRITICAL⚡ | app/controllers/settings/providers_controller.rb | 260 | @brex_items = Current.family.brex_items.active.ordered.includes(:syncs, :brex_accounts) | CODE |
| CRITICAL | app/controllers/settings/providers_controller.rb | 313 | @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 | 178 | # 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 | 229 | # Check if it's a declared field first | COMMENT |
| LOW | app/models/setting.rb | 258 | # Check if a dynamic field exists (useful to distinguish nil value vs missing key) | COMMENT |
| LOW | app/models/setting.rb | 263 | # 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 | 201 | # Check if linked via legacy FK (use to_s for UUID comparison safety) | COMMENT |
| LOW | app/models/simplefin_item.rb | 207 | # Check if linked via AccountProvider | COMMENT |
| LOW | app/models/simplefin_item.rb | 397 | # Check if last sync was more than 3 days ago | COMMENT |
| LOW | app/models/simplefin_item.rb | 407 | # Check if linked accounts have recent transactions | COMMENT |
| LOW | app/models/simplefin_item.rb | 430 | # Check if the SimpleFin connection needs user attention | COMMENT |
| LOW | app/models/user.rb | 224 | # Check if user has a local password set (can authenticate locally) | COMMENT |
| LOW | app/models/recurring_transaction.rb | 308 | # Check if this recurring transaction has amount variance configured | COMMENT |
| LOW | app/models/recurring_transaction.rb | 313 | # 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 | 265 | # Check if days cluster together (within ~5 days variance) | COMMENT |
| LOW | app/models/provider/openai.rb | 235 | # 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/lunchflow_item/importer.rb | 450 | # Check if holdings are not supported (501 response) | COMMENT |
| LOW | app/models/lunchflow_item/importer.rb | 475 | # 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 | 72 | # Check if account is linked to a specific provider | COMMENT |
| LOW | app/models/account/linkable.rb | 84 | # 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 | 224 | # Check if this transaction is marked as pending | COMMENT |
| LOW | app/models/concerns/enrichable.rb | 109 | # 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 |
| LOW | app/controllers/lunchflow_items_controller.rb | 179 | # Check if this lunchflow_account is already linked | COMMENT |
| LOW | app/controllers/lunchflow_items_controller.rb | 255 | # Check if account is already linked | COMMENT |
| 47 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | config/locales/views/settings/api_keys/uk.yml | 34 | your_api_key: "Ваш ключ API" | CODE |
| 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 | 40 | your_api_key: Tu clave API | CODE |
| HIGH | config/locales/views/settings/api_keys/es.yml | 107 | 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 | 57 | your_api_key: Dein API-Key | CODE |
| HIGH | config/locales/views/settings/api_keys/de.yml | 89 | your_api_key: Dein API-Schlüssel | CODE |
| HIGH | config/locales/views/settings/api_keys/it.yml | 53 | your_api_key: "La tua chiave API" | CODE |
| HIGH | config/locales/views/settings/api_keys/it.yml | 114 | your_api_key: "La tua chiave API" | 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 | 37 | 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 | 42 | your_api_key: 您的 API 金鑰 | CODE |
| HIGH | config/locales/views/settings/api_keys/zh-TW.yml | 109 | your_api_key: 您的 API 金鑰 | CODE |
| HIGH | config/locales/views/settings/api_keys/tr.yml | 25 | your_api_key: API Anahtarınız | CODE |
| HIGH | config/locales/views/settings/api_keys/tr.yml | 141 | 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 | 1376 | 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/property/avm_import.rb | 17 | # Step 1: validates the inputs, then spends one provider request. Returns | COMMENT |
| LOW | app/models/property/avm_import.rb | 36 | # Step 2: creates the active property account from the user-confirmed | COMMENT |
| LOW⚡ | app/models/provider/snaptrade.rb | 130 | # Step 1: ask SnapTrade for a device code and the user code to confirm. | COMMENT |
| LOW | app/models/provider/snaptrade.rb | 177 | # Step 2: redeem the device code once the user has confirmed it. Until they | COMMENT |
| LOW⚡ | app/models/redbark_item/importer.rb | 19 | # Step 1: Fetch and store all accounts (with connection metadata for institutions) | COMMENT |
| LOW⚡ | app/models/redbark_item/importer.rb | 22 | # Step 2: For linked accounts only, fetch transactions and balances. | COMMENT |
| LOW⚡ | app/models/snaptrade_item/importer.rb | 24 | # Step 1: Fetch and store all accounts | COMMENT |
| LOW⚡ | app/models/snaptrade_item/importer.rb | 27 | # 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 | 39 | # Step 2: Update linked accounts and create records for new accounts from API | 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 | 528 | # 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 | 50 | # Step 2: Show profile selection. | COMMENT |
| LOW | app/controllers/wise_items_controller.rb | 62 | # Step 3: Create one WiseItem per selected profile. | COMMENT |
| LOW | app/controllers/properties_controller.rb | 141 | # Step 1: spend one provider request, then show the fetched data for | COMMENT |
| LOW⚡ | app/controllers/onchain_wallet_items_controller.rb | 49 | # Step 1: paste an address. | COMMENT |
| LOW⚡ | app/controllers/onchain_wallet_items_controller.rb | 54 | # Step 2: work out the chain if it wasn't given, then show what is there. | COMMENT |
| LOW | app/controllers/onchain_wallet_items_controller.rb | 87 | # Step 3: track the assets that were ticked. | COMMENT |
| LOW | test/models/balance/forward_calculator_test.rb | 785 | # 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 | 803 | # Step 2: Corrected exchange rate arrives later (e.g. daily cron imports it). | COMMENT |
| LOW⚡ | test/models/balance/forward_calculator_test.rb | 806 | # 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 |
| 10 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/property/avm_import.rb | 17 | # Step 1: validates the inputs, then spends one provider request. Returns | COMMENT |
| LOW | app/models/property/avm_import.rb | 36 | # Step 2: creates the active property account from the user-confirmed | COMMENT |
| LOW⚡ | app/models/provider/snaptrade.rb | 130 | # Step 1: ask SnapTrade for a device code and the user code to confirm. | COMMENT |
| LOW | app/models/provider/snaptrade.rb | 177 | # Step 2: redeem the device code once the user has confirmed it. Until they | COMMENT |
| LOW⚡ | app/models/redbark_item/importer.rb | 19 | # Step 1: Fetch and store all accounts (with connection metadata for institutions) | COMMENT |
| LOW⚡ | app/models/redbark_item/importer.rb | 22 | # Step 2: For linked accounts only, fetch transactions and balances. | COMMENT |
| LOW⚡ | app/models/snaptrade_item/importer.rb | 24 | # Step 1: Fetch and store all accounts | COMMENT |
| LOW⚡ | app/models/snaptrade_item/importer.rb | 27 | # 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 | 39 | # Step 2: Update linked accounts and create records for new accounts from API | 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 | 105 | # So we need to check if the value actually changed by comparing before/after | COMMENT |
| LOW | app/models/simplefin_item/importer.rb | 528 | # 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 | 50 | # Step 2: Show profile selection. | COMMENT |
| LOW | app/controllers/wise_items_controller.rb | 62 | # Step 3: Create one WiseItem per selected profile. | COMMENT |
| LOW | app/controllers/properties_controller.rb | 141 | # Step 1: spend one provider request, then show the fetched data for | COMMENT |
| LOW⚡ | app/controllers/onchain_wallet_items_controller.rb | 49 | # Step 1: paste an address. | COMMENT |
| LOW⚡ | app/controllers/onchain_wallet_items_controller.rb | 54 | # Step 2: work out the chain if it wasn't given, then show what is there. | COMMENT |
| LOW | app/controllers/onchain_wallet_items_controller.rb | 87 | # Step 3: track the assets that were ticked. | COMMENT |
| LOW | test/models/balance/forward_calculator_test.rb | 785 | # 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 | 803 | # Step 2: Corrected exchange rate arrives later (e.g. daily cron imports it). | COMMENT |
| LOW⚡ | test/models/balance/forward_calculator_test.rb | 806 | # 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/realie_test.rb | 29 | query: { "address" => "123 Main Street", "state" => "CA" }, | CODE |
| LOW | test/models/provider/realie_test.rb | 35 | line1: "123 Main Street", | CODE |
| LOW⚡ | test/models/provider/realie_test.rb | 54 | .with(query: hash_including("address" => "123 Main Street")) | CODE |
| LOW⚡ | test/models/provider/realie_test.rb | 57 | response = @provider.fetch_property_valuation(line1: "123 Main Street", region: "CA") | CODE |
| LOW⚡ | test/models/provider/realie_test.rb | 65 | .with(query: hash_including("address" => "123 Main Street")) | CODE |
| LOW⚡ | test/models/provider/realie_test.rb | 68 | response = @provider.fetch_property_valuation(line1: "123 Main Street", region: "CA") | CODE |
| LOW⚡ | test/models/provider/realie_test.rb | 76 | .with(query: hash_including("address" => "123 Main Street")) | CODE |
| LOW⚡ | test/models/provider/realie_test.rb | 79 | response = @provider.fetch_property_valuation(line1: "123 Main Street", region: "CA") | CODE |
| LOW | test/models/provider/realie_test.rb | 90 | .with(query: hash_including("address" => "123 Main Street")) | CODE |
| LOW | test/models/provider/realie_test.rb | 94 | line1: "123 Main Street", | CODE |
| LOW | test/models/provider/realie_test.rb | 108 | .with(query: hash_including("address" => "123 Main Street")) | CODE |
| LOW | test/models/provider/realie_test.rb | 112 | line1: "123 Main Street", | CODE |
| LOW | test/models/provider/realie_test.rb | 179 | response = @provider.fetch_property_valuation(line1: "123 Main Street", region: "CA") | 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 | test/jobs/sync_property_valuations_job_test.rb | 26 | line1: "123 Main Street", | CODE |
| LOW | test/controllers/properties_controller_test.rb | 533 | address: { line1: "123 Main Street", locality: "LA", region: "CA", postal_code: "90001" } | CODE |
| LOW | config/locales/views/properties/en.yml | 44 | 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/assistant/token_budget.rb | 4 | # Shared resolution of the model's context window so prompt assembly and the | COMMENT |
| 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 | 349 | # 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 | 229 | # Resolves a section's layout guardrails, applying the user's height preset | COMMENT |
| MEDIUM | test/models/assistant/configurable_test.rb | 36 | # The roster only itemizes when the model's context window is comfortable | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | compose.example.ai.yml | 100 | # turn, so it has to be sized as a sum rather than simply set higher: | COMMENT |
| LOW | app/models/redbark_item.rb | 16 | # Validate on every save, not just create - an update must never blank the key | COMMENT |
| 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/assistant.rb | 10 | # in Settings -> Preferences. They back the wealth agent-harness workflow | COMMENT |
| MEDIUM | app/models/assistant.rb | 11 | # documented in docs/llm-guides/wealth-agent-harness.md. GetValuations is the | 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 | 219 | # 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 | 221 | # 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 | 217 | # This approach is more robust than trying to append to an existing include line | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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 |
|---|---|---|---|---|
| HIGH | test/controllers/rules_controller_test.rb | 270 | # raising it, which would otherwise log the reset as requested and redirect | 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 |