A beautiful, private, local-first personal finance tracker. Investments, net worth, spending, and simulations.
This report summarizes scanner evidence for wealthfolio/wealthfolio, a Rust project with 9,293 GitHub stars. SynthScan examined 1,034,516 lines of code across 3056 source files, recording 1626 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 3.0 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 900 finding(s).
Are imports declared and package/API names verified? 64 finding(s).
Are wrappers, guards, and repeated structures necessary? 1084 finding(s).
Which changes need focused human review? 1626 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1626 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | compose.yml | 31 | # ── Authentication ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | compose.yml | 50 | # ── OIDC / SSO (optional) ───────────────────────────────────────── | COMMENT |
| MEDIUM | compose.yml | 76 | # ── AI Agent Access / MCP (optional) ──────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 9 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 11 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 31 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 33 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 202 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 204 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 280 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 282 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 368 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 370 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 453 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 455 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 520 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 522 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 621 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 623 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 694 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 696 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 1131 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 1133 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 1245 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 1247 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/device-sync/src/enroll_service.rs | 19 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/device-sync/src/enroll_service.rs | 21 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/device-sync/src/enroll_service.rs | 31 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/device-sync/src/enroll_service.rs | 33 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 128 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 130 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 159 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 161 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 441 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 443 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 549 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 551 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/engine/restore.rs | 31 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/restore.rs | 33 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/restore.rs | 178 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/restore.rs | 180 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/restore.rs | 523 | // ─── Steps ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/restore.rs | 881 | // ─── Slot access ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/restore.rs | 929 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/restore.rs | 931 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/market-data/src/provider/metal_price_api/mod.rs | 471 | // ── Integration tests (require METAL_PRICE_API_KEY env var) ────── | COMMENT |
| MEDIUM⚡ | crates/market-data/src/resolver/mod.rs | 11 | //! ┌─────────────────────────────────────────────────────────────────────────────┐ | COMMENT |
| MEDIUM⚡ | crates/market-data/src/resolver/mod.rs | 14 | //! │ ┌────────────────────────────────────────────────────────────────────────┐ │ | COMMENT |
| MEDIUM⚡ | crates/market-data/src/resolver/mod.rs | 18 | //! │ └────────────────────────────────────────────────────────────────────────┘ │ | COMMENT |
| MEDIUM⚡ | crates/market-data/src/resolver/mod.rs | 21 | //! │ ┌────────────────────────────────────────────────────────────────────────┐ │ | COMMENT |
| MEDIUM⚡ | crates/market-data/src/resolver/mod.rs | 25 | //! │ └────────────────────────────────────────────────────────────────────────┘ │ | COMMENT |
| MEDIUM⚡ | crates/market-data/src/resolver/mod.rs | 26 | //! └─────────────────────────────────────────────────────────────────────────────┘ | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 107 | // ── Resolved asset identity (populated during validation) ────────────── | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 126 | // ── Duplicate / validation ───────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 310 | // ── get_import_mapping ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 382 | // ── prepare_activity_import ───────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 452 | // ── commit_activity_import ────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/core/src/goals/goals_service.rs | 70 | // ─── Shared helpers ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/core/src/quotes/client.rs | 9 | //! ┌─────────────────────────────────────────────────────────────────────┐ | COMMENT |
| MEDIUM⚡ | crates/core/src/quotes/client.rs | 12 | //! │ Asset ─────────────────────────────────────────────▶ core::Quote │ | COMMENT |
| 600 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/features/allocations/sota-target-model-spec.md | 1026 | export async function getAllocationAdvisorState( | CODE |
| LOW | docs/features/allocations/sota-target-model-spec.md | 1032 | export async function calculateRebalanceScenarios( | CODE |
| LOW | packages/ui/src/components/ui/chart.tsx | 317 | function getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) { | CODE |
| LOW | packages/ui/src/components/ui/empty-placeholder.tsx | 49 | EmptyPlaceholder.Description = function EmptyPlaceholderDescription(props: React.ComponentProps<"p">) { | CODE |
| LOW | packages/ui/src/lib/ticker-logo.ts | 32 | export function normalizeTickerLogoSymbol(symbol: unknown): string | undefined { | CODE |
| LOW | packages/ui/src/lib/ticker-logo.ts | 59 | function getProviderSuffixCompatibilityFilenames(symbol: string): string[] { | CODE |
| LOW | packages/ui/src/lib/ticker-logo.ts | 69 | function getCryptoProviderCompatibilityFilenames(symbol: string): string[] { | CODE |
| LOW | packages/ui/src/lib/ticker-logo.ts | 88 | export function resolveTickerLogoFilename( | CODE |
| LOW | packages/ui/src/lib/ticker-logo.ts | 108 | export function resolveTickerLogoFilenames( | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 144 | export function calendarDateFromLocalDate(value: Date): CalendarDateParts { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 148 | export function calendarDateTimeFromLocalDate(value: Date): CalendarDateTimeParts { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 276 | function resolveSystemFormattingLocale(): string { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 434 | function normalizeCurrencyGrouping(input: FinancialNumberInput, locale: string): string { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 466 | function normalizeInvariantNumberString(value: string): string { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 471 | function localizedNumberToInvariant(value: string, locale: string): string | undefined { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 483 | function parsePreparedDecimalString( | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 509 | export function parseLocalizedDecimalString(value: string, locale: string): string | undefined { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 738 | function createLocaleAmountFormatting( | CODE |
| LOW | packages/addon-sdk/README.md | 313 | function InvestmentFeesTrackerAddon({ ctx }: { ctx: AddonContext }) { | CODE |
| LOW | packages/addon-sdk/src/permissions.ts | 309 | export function getPermissionCategoriesByRisk( | CODE |
| LOW | packages/addon-sdk/src/permissions.ts | 350 | export function getUndeclaredDetectedFunctions(permission: Permission): string[] { | CODE |
| LOW | packages/addon-sdk/src/permissions.ts | 359 | export function hasUndeclaredDetectedFunctions(permission: Permission): boolean { | CODE |
| LOW | packages/addon-dev-tools/dev-server.js | 142 | function runtimeTextFilesFromEntries(entries) { | CODE |
| LOW | packages/addon-dev-tools/dev-server.js | 160 | function shouldPublishRuntimeFileChange(config, filePath) { | CODE |
| LOW⚡ | .github/scripts/test_connect_build.py | 30 | def test_build_without_connect_does_not_require_transfer_configuration(self): | CODE |
| LOW⚡ | .github/scripts/test_connect_build.py | 33 | def test_connect_build_uses_public_defaults_without_transfer_override(self): | CODE |
| LOW⚡ | .github/scripts/test_connect_build.py | 41 | def test_connect_build_rejects_explicitly_blank_transfer_configuration(self): | CODE |
| LOW | .github/scripts/test_connect_build.py | 53 | def test_connect_build_accepts_configured_hosts_without_printing_values(self): | CODE |
| LOW | .github/scripts/test_connect_build.py | 62 | def test_ci_exports_defaults_for_missing_secrets_and_preserves_nonempty_overrides(self): | CODE |
| LOW | .github/scripts/test_connect_build.py | 82 | def test_ci_cannot_inject_other_environment_values_through_the_override(self): | CODE |
| LOW | .github/scripts/test_ci_changes.py | 22 | def test_connect_defaults_cover_every_consumer(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 33 | def test_application_csp_contract(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 43 | def test_dependency_manifests(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 46 | def test_addon_runtime_and_harness_changes_require_browsers(self): | CODE |
| LOW | .github/scripts/test_ci_changes.py | 60 | def test_shared_sandbox_inputs_require_browsers(self): | CODE |
| LOW | .github/scripts/test_ci_changes.py | 74 | def test_unrelated_changes_do_not_require_browsers(self): | CODE |
| LOW | .github/scripts/test_ci_changes.py | 85 | def test_addon_requirement_survives_mixed_changes(self): | CODE |
| LOW | .github/scripts/test_ci_changes.py | 96 | def test_cross_area_rename_includes_both_paths(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 113 | def test_shared_rust_only_checks_mobile(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 119 | def test_native_dependencies_and_http_require_mobile_checks(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 124 | def test_platform_specific_files(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 136 | def test_mixed_native_and_shared_code_is_order_independent(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 141 | def test_server_manifest_does_not_trigger_mobile(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 144 | def test_docs_inside_native_directories(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 152 | def test_browser_install_and_execution_share_the_path_filter(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 177 | def test_unrequested_mobile_jobs_may_skip(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 180 | def test_required_mobile_jobs_must_succeed(self): | CODE |
| LOW⚡ | .github/scripts/test_ci_changes.py | 187 | def test_required_frontend_jobs_must_succeed(self): | CODE |
| LOW | .github/scripts/test_ci_changes.py | 200 | def test_failed_detection_blocks_merge(self): | CODE |
| LOW | .github/scripts/test_encryption_smoke.py | 13 | def test_export_download_keeps_browser_session(self): | CODE |
| LOW | e2e/helpers.ts | 71 | async function canSkipLoginAndOnboardingUi(page: Page) { | CODE |
| LOW | e2e/helpers.ts | 127 | async function waitForLoginOnboardingOrApp(page: Page, timeout: number) { | CODE |
| LOW | e2e/helpers.ts | 419 | export async function completeOnboardingIfNeeded(page: Page) { | CODE |
| LOW | e2e/02-activities.spec.ts | 333 | async function fillInternalTransferCashAmount(value: number) { | CODE |
| LOW | e2e/04-csv-import.spec.ts | 35 | async function proceedThroughImportWizard(page: Page, csvPath: string, accountName: string) { | CODE |
| LOW | e2e/34-activity-column-widths.spec.ts | 11 | async function createAccountWithMixedActivities(page: Page) { | CODE |
| LOW | e2e/34-activity-column-widths.spec.ts | 66 | async function headerWidthsWhileScrolling(page: Page) { | CODE |
| LOW | e2e/10-symbol-mapping-validation.spec.ts | 167 | async function setOpenSheetToManualPricing() { | CODE |
| LOW | e2e/12-asset-backed-income-subtypes.spec.ts | 214 | async function expectHoldingVisibleInAccount(symbol: string, quantity: number) { | CODE |
| LOW | e2e/30-activity-sticky-header.spec.ts | 7 | async function createAccountWithActivities(page: Page, accountType = "SECURITIES") { | CODE |
| 362 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | playwright.config.ts | 41 | name: "chromium", | COMMENT |
| LOW | playwright.config.ts | 61 | // name: 'Mobile Safari', | COMMENT |
| LOW | compose.yml | 21 | WF_DATA_DIR: "${WF_DATA_DIR:-}" | COMMENT |
| LOW | compose.yml | 41 | # printf 'your-password' | argon2 yoursalt16chars! -id -e | COMMENT |
| LOW | crates/device-sync/src/types.rs | 161 | pub user_id: String, | COMMENT |
| LOW | crates/device-sync/src/types.rs | 181 | pub app_version: Option<String>, | COMMENT |
| LOW | crates/device-sync/src/types.rs | 201 | COMMENT | |
| LOW | crates/device-sync/src/types.rs | 281 | // Pairing Types | COMMENT |
| LOW | crates/device-sync/src/types.rs | 321 | Expired, | COMMENT |
| LOW | crates/device-sync/src/types.rs | 361 | /// Operation succeeded | COMMENT |
| LOW | crates/device-sync/src/types.rs | 381 | COMMENT | |
| LOW | crates/device-sync/src/types.rs | 401 | } | COMMENT |
| LOW | crates/device-sync/src/types.rs | 421 | #[serde(rename_all = "camelCase")] | COMMENT |
| LOW | crates/device-sync/src/types.rs | 441 | #[serde(rename_all = "camelCase")] | COMMENT |
| LOW | crates/device-sync/src/client.rs | 621 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| LOW | crates/device-sync/src/lib.rs | 1 | //! Wealthfolio Device Sync - Cloud-based device synchronization for Wealthfolio. | COMMENT |
| LOW | crates/device-sync/src/lib.rs | 21 | //! ).await?; | COMMENT |
| LOW | crates/portfolio-engine/tests/impact.rs | 1 | //! P-IMPACT: `impact` is sound. For every scenario and a set of single-fact | COMMENT |
| LOW | crates/portfolio-engine/tests/support/generate.rs | 1 | //! Generated scenarios: random combinations of the inputs the hand-written | COMMENT |
| LOW | crates/portfolio-engine/src/diagnostics.rs | 1 | //! Data-quality channel (architecture §4.4): every degraded, missing, estimated, or | COMMENT |
| LOW | crates/portfolio-engine/src/diagnostics.rs | 41 | ActivityRejected, | COMMENT |
| LOW | crates/portfolio-engine/src/lib.rs | 1 | //! Wealthfolio portfolio engine: a pure, deterministic calculation kernel. | COMMENT |
| LOW | crates/portfolio-engine/src/scope.rs | 1 | //! `facts_needed`: what a coordinator must load for a scope and range | COMMENT |
| LOW | crates/portfolio-engine/src/scope.rs | 21 | /// what makes a partial load able to find its counterparties. | COMMENT |
| LOW | crates/portfolio-engine/src/value.rs | 1461 | effects | COMMENT |
| LOW | crates/portfolio-engine/src/value.rs | 1901 | .get(source.as_str()) | COMMENT |
| LOW | crates/portfolio-engine/src/model/policy.rs | 41 | #[serde(rename_all = "SCREAMING_SNAKE_CASE")] | COMMENT |
| LOW | crates/portfolio-engine/src/model/scalar.rs | 1 | //! Parse-don't-validate scalars. Constructed once in `normalize`; interior | COMMENT |
| LOW | crates/portfolio-engine/src/model/effects.rs | 61 | pub date: NaiveDate, | COMMENT |
| LOW | crates/portfolio-engine/src/model/facts.rs | 41 | /// `INVESTMENT` | `PROPERTY` | `VEHICLE` | `COLLECTIBLE` | `PRECIOUS_METAL` | … | COMMENT |
| LOW | crates/portfolio-engine/src/model/state.rs | 121 | pub average_cost: Decimal, | COMMENT |
| LOW | crates/market-data/src/lib.rs | 1 | //! Wealthfolio Market Data Crate | COMMENT |
| LOW | crates/market-data/src/lib.rs | 21 | //! v | COMMENT |
| LOW | crates/market-data/src/lib.rs | 41 | //! | COMMENT |
| LOW | crates/market-data/src/provider/mod.rs | 1 | //! Market data provider abstractions and implementations. | COMMENT |
| LOW | crates/market-data/src/provider/traits.rs | 21 | /// | COMMENT |
| LOW | crates/market-data/src/provider/traits.rs | 41 | /// supports_historical: true, | COMMENT |
| LOW | crates/market-data/src/provider/traits.rs | 61 | /// Provider priority for ordering. | COMMENT |
| LOW | crates/market-data/src/provider/traits.rs | 81 | COMMENT | |
| LOW | crates/market-data/src/provider/traits.rs | 101 | /// | COMMENT |
| LOW | crates/market-data/src/provider/traits.rs | 121 | /// # Arguments | COMMENT |
| LOW | crates/market-data/src/provider/traits.rs | 141 | /// providers, whatever they found, so the provider must answer it from data | COMMENT |
| LOW | crates/market-data/src/provider/capabilities.rs | 1 | //! Provider capabilities and rate limiting configuration. | COMMENT |
| LOW | crates/market-data/src/provider/metal_price_api/mod.rs | 1 | //! Metal Price API provider for precious metals market data. | COMMENT |
| LOW | crates/market-data/src/provider/metal_price_api/mod.rs | 41 | struct MetalPriceResponse { | COMMENT |
| LOW | crates/market-data/src/provider/metal_price_api/mod.rs | 61 | #[serde(default)] | COMMENT |
| LOW | crates/market-data/src/provider/amfi/mod.rs | 1 | //! AMFI (Association of Mutual Funds in India) NAV provider. | COMMENT |
| LOW | crates/market-data/src/provider/amfi/mod.rs | 61 | /// Weekdays between report lookups after the first two. Six, so consecutive | COMMENT |
| LOW | crates/market-data/src/provider/amfi/mod.rs | 201 | // --------------------------------------------------------------------------- | COMMENT |
| LOW | crates/market-data/src/provider/finnhub/mod.rs | 61 | /// High prices | COMMENT |
| LOW | crates/market-data/src/provider/finnhub/mod.rs | 81 | /// Search results | COMMENT |
| LOW | crates/market-data/src/provider/finnhub/mod.rs | 121 | name: Option<String>, | COMMENT |
| LOW | crates/market-data/src/provider/alpha_vantage/mod.rs | 101 | struct CryptoDailyResponse { | COMMENT |
| LOW | crates/market-data/src/provider/alpha_vantage/mod.rs | 261 | #[allow(dead_code)] | COMMENT |
| LOW | crates/market-data/src/provider/alpha_vantage/mod.rs | 281 | #[serde(rename = "Name")] | COMMENT |
| LOW | crates/market-data/src/provider/alpha_vantage/mod.rs | 321 | #[serde(rename = "Information")] | COMMENT |
| LOW | crates/market-data/src/provider/marketdata_app/mod.rs | 1 | //! MarketData.app provider implementation. | COMMENT |
| LOW | crates/market-data/src/provider/marketdata_app/mod.rs | 41 | /// Open prices | COMMENT |
| LOW | crates/market-data/src/provider/marketdata_app/mod.rs | 61 | /// Response from the prices endpoint for latest quote. | COMMENT |
| LOW | crates/market-data/src/provider/us_treasury_calc/mod.rs | 1 | //! US Treasury calculated-price provider. | COMMENT |
| 360 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/core/src/assets/alternative_assets_model.rs | 46 | /// Example for Property: { "sub_type": "residence", "address": "123 Main St" } | COMMENT |
| LOW | crates/ai/src/ai_providers.json | 19 | "placeholder": "http://localhost:11434", | CODE |
| LOW | crates/ai/src/ai_providers.json | 71 | "placeholder": "Enter your Groq API key", | CODE |
| LOW | crates/ai/src/ai_providers.json | 79 | "placeholder": "Leave empty to use default", | CODE |
| LOW | crates/ai/src/ai_providers.json | 114 | "placeholder": "Enter your Google AI API key", | CODE |
| LOW | crates/ai/src/ai_providers.json | 122 | "placeholder": "Leave empty to use default", | CODE |
| LOW | crates/ai/src/ai_providers.json | 168 | "placeholder": "Enter your Anthropic API key", | CODE |
| LOW | crates/ai/src/ai_providers.json | 176 | "placeholder": "Leave empty to use default", | CODE |
| LOW | crates/ai/src/ai_providers.json | 217 | "placeholder": "Enter your OpenAI API key", | CODE |
| LOW | crates/ai/src/ai_providers.json | 225 | "placeholder": "Leave empty to use default", | CODE |
| LOW | crates/ai/src/ai_providers.json | 263 | "placeholder": "Enter your OpenRouter API key", | CODE |
| LOW | crates/ai/src/ai_providers.json | 271 | "placeholder": "Leave empty to use default", | CODE |
| LOW | …wealthfolio-connect/components/connected-view.test.tsx | 7 | user: { email: "user@example.com" }, | CODE |
| LOW | apps/frontend/src/i18n/locales/zh-Hant/ui.json | 11 | "placeholder": "選取幣別", | CODE |
| LOW | apps/frontend/src/i18n/locales/zh-Hant/ui.json | 220 | "placeholder": "選擇選項" | CODE |
| LOW | apps/frontend/src/i18n/locales/zh-Hant/asset.json | 597 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/ja/ui.json | 11 | "placeholder": "通貨を選択", | CODE |
| LOW | apps/frontend/src/i18n/locales/ja/ui.json | 219 | "placeholder": "項目を選択" | CODE |
| LOW | apps/frontend/src/i18n/locales/ja/asset.json | 597 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/it/ui.json | 11 | "placeholder": "Seleziona valuta", | CODE |
| LOW | apps/frontend/src/i18n/locales/it/ui.json | 221 | "placeholder": "Seleziona un’opzione" | CODE |
| LOW | apps/frontend/src/i18n/locales/it/asset.json | 601 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/pt/ui.json | 11 | "placeholder": "Selecionar moeda", | CODE |
| LOW | apps/frontend/src/i18n/locales/pt/ui.json | 221 | "placeholder": "Selecionar uma opção" | CODE |
| LOW | apps/frontend/src/i18n/locales/pt/asset.json | 601 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/zh/ui.json | 11 | "placeholder": "选择货币", | CODE |
| LOW | apps/frontend/src/i18n/locales/zh/ui.json | 219 | "placeholder": "选择选项" | CODE |
| LOW | apps/frontend/src/i18n/locales/zh/asset.json | 597 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/ar/ui.json | 12 | "placeholder": "اختر العملة", | CODE |
| LOW | apps/frontend/src/i18n/locales/ar/ui.json | 224 | "placeholder": "اختر خيارًا" | CODE |
| LOW | apps/frontend/src/i18n/locales/ar/asset.json | 892 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/de/ui.json | 11 | "placeholder": "Währung auswählen", | CODE |
| LOW | apps/frontend/src/i18n/locales/de/ui.json | 220 | "placeholder": "Option auswählen" | CODE |
| LOW | apps/frontend/src/i18n/locales/de/asset.json | 597 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/ko/ui.json | 11 | "placeholder": "통화 선택", | CODE |
| LOW | apps/frontend/src/i18n/locales/ko/ui.json | 219 | "placeholder": "옵션 선택" | CODE |
| LOW | apps/frontend/src/i18n/locales/ko/asset.json | 597 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/fr/ui.json | 11 | "placeholder": "Sélectionner une devise", | CODE |
| LOW | apps/frontend/src/i18n/locales/fr/ui.json | 221 | "placeholder": "Choisir une option" | CODE |
| LOW | apps/frontend/src/i18n/locales/fr/asset.json | 601 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/es/ui.json | 11 | "placeholder": "Seleccionar moneda", | CODE |
| LOW | apps/frontend/src/i18n/locales/es/ui.json | 221 | "placeholder": "Seleccionar una opción" | CODE |
| LOW | apps/frontend/src/i18n/locales/es/asset.json | 601 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/en/ui.json | 11 | "placeholder": "Select currency", | CODE |
| LOW | apps/frontend/src/i18n/locales/en/ui.json | 220 | "placeholder": "Select an option" | CODE |
| LOW | apps/frontend/src/i18n/locales/en/asset.json | 598 | "placeholder": { | CODE |
| LOW | apps/frontend/src/pages/asset/asset-edit-sheet.test.tsx | 103 | expect(input).toHaveAttribute("placeholder", "100"); | CODE |
| LOW | …assets/components/activity-loan-payment-sheet.test.tsx | 117 | expect(escrow).toHaveAttribute("placeholder", "The loan's usual amount"); | CODE |
| LOW | …assets/components/activity-loan-payment-sheet.test.tsx | 122 | expect(escrow).toHaveAttribute("placeholder", "None unless you enter it"); | CODE |
| LOW | …assets/components/activity-loan-payment-sheet.test.tsx | 170 | expect(escrow).toHaveAttribute("placeholder", "The loan's usual amount"); | CODE |
| LOW | …assets/components/activity-loan-payment-sheet.test.tsx | 174 | expect(escrow).toHaveAttribute("placeholder", "None unless you enter it"); | CODE |
| LOW | …es/activity/components/activity-view-controls.test.tsx | 94 | "placeholder", | CODE |
| LOW | …ponents/forms/fields/__tests__/quantity-input.test.tsx | 74 | "placeholder", | CODE |
| LOW | …omponents/forms/fields/__tests__/amount-input.test.tsx | 75 | expect(input).toHaveAttribute("placeholder", "0,00"); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | playwright.design-system.config.ts | 3 | // UI guardrails, run on demand rather than in CI. Record a baseline from the code | COMMENT |
| MEDIUM | …c/portfolio/allocation_targets/worksheet_calculator.rs | 476 | /// What the user's target and guardrails allow, in base currency. | COMMENT |
| MEDIUM | crates/ai/Cargo.toml | 33 | # LLM orchestration facade (portable contracts + agent runtime) | COMMENT |
| MEDIUM | crates/ai/evals/cases/safety.toml | 5 | # wrong thing" complaint mode in industry agentic apps in 2024-2025. | COMMENT |
| MEDIUM | crates/ai/evals/cases/recording.toml | 76 | # hallucinate tickers (Facebook → FB instead of META) so we want the raw text. | COMMENT |
| MEDIUM | crates/ai/src/stream_hook.rs | 1 | //! Stream-level guard rails for the agentic loop. | COMMENT |
| MEDIUM | crates/ai/src/live_evals/mod.rs | 6 | //! - `crate::eval` (singular): assertion helpers (event ordering, guardrails) | COMMENT |
| MEDIUM | crates/ai/src/eval/harness.rs | 78 | /// Assert tool outputs respect guardrails. | COMMENT |
| MEDIUM | docs/architecture/market-data-quotes.md | 63 | ├── registry/ # Provider orchestration | CODE |
| MEDIUM | packages/addon-dev-tools/cli.js | 52 | // Initialize scaffold service | COMMENT |
| MEDIUM | packages/addon-dev-tools/cli.js | 116 | // Create addon using scaffold service | COMMENT |
| MEDIUM | e2e/README.md | 254 | ## UI primitive guardrails (on demand) | COMMENT |
| MEDIUM | apps/frontend/src/test/browser/design-system.tsx | 103 | // Synthetic fixture for the UI-primitive guardrails: every primitive in | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | crates/market-data/src/provider/metal_price_api/mod.rs | 72 | /// let provider = MetalPriceApiProvider::new("your_api_key".to_string()); | COMMENT |
| HIGH | crates/market-data/src/provider/marketdata_app/mod.rs | 79 | /// let provider = MarketDataAppProvider::new("your-api-key".to_string()); | COMMENT |
| HIGH | …rontend/src/lib/financial-display-terminology.test.tsx | 126 | expect(matching[0].headers).toContain("apikey YOUR_API_KEY"); | CODE |
| HIGH | …d/src/pages/settings/market-data/provider-templates.ts | 83 | headers: '{"Authorization": "apikey YOUR_API_KEY"}', | CODE |
| HIGH | …d/src/pages/settings/market-data/provider-templates.ts | 143 | headers: '{"Authorization": "apikey YOUR_API_KEY"}', | CODE |
| HIGH | …d/src/pages/settings/market-data/provider-templates.ts | 158 | headers: '{"Authorization": "apikey YOUR_API_KEY"}', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/market-data/src/provider/yahoo/mod.rs | 183 | // Step 1: Get cookie from fc.yahoo.com | COMMENT |
| LOW | crates/market-data/src/provider/yahoo/mod.rs | 203 | // Step 2: Get crumb using cookie | COMMENT |
| LOW | crates/core/src/utils/isin.rs | 151 | // Step 1: Convert characters to digit string | COMMENT |
| LOW | crates/core/src/utils/isin.rs | 163 | // Step 2: Apply Luhn algorithm | COMMENT |
| LOW | crates/storage-sqlite/src/db/maintenance.rs | 160 | // Step 8: install the candidate. `fs::rename` over the live database is | COMMENT |
| LOW | …es/storage-sqlite/src/assets/alternative_repository.rs | 206 | // Step 1: Find and unlink any liabilities that reference this asset | COMMENT |
| LOW⚡ | …es/storage-sqlite/src/assets/alternative_repository.rs | 257 | // Step 2: Delete all quotes for this asset with source = 'MANUAL' | COMMENT |
| LOW⚡ | …es/storage-sqlite/src/assets/alternative_repository.rs | 266 | // Step 3: Delete the asset record | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 194 | // Step 1: Sync connections (platforms) | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 211 | // Step 2: Sync accounts (filter by sync_enabled) | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 265 | // Step 3: Sync data for all synced accounts based on their tracking mode | COMMENT |
| LOW⚡ | e2e/helpers.ts | 443 | // Step 1: Info screen — click Continue | COMMENT |
| LOW⚡ | e2e/helpers.ts | 447 | // Step 2: Preferences — keep e2e assertions deterministic and pick CAD. | COMMENT |
| LOW⚡ | e2e/helpers.ts | 454 | // Step 3: Appearance — pick Light theme and continue | COMMENT |
| LOW⚡ | e2e/helpers.ts | 459 | // Step 4: Finish onboarding | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1027 | // Step 1: re-run backend validation on importable drafts so we catch | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1049 | // Step 2: filter again after backend validation — only import rows the | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1065 | // Step 3: create pending assets, then import the validated activities. | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1143 | // Step 4: success path — save template + persist tool result. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/market-data/src/provider/yahoo/mod.rs | 183 | // Step 1: Get cookie from fc.yahoo.com | COMMENT |
| LOW | crates/market-data/src/provider/yahoo/mod.rs | 203 | // Step 2: Get crumb using cookie | COMMENT |
| LOW | crates/core/src/utils/isin.rs | 151 | // Step 1: Convert characters to digit string | COMMENT |
| LOW | crates/core/src/utils/isin.rs | 163 | // Step 2: Apply Luhn algorithm | COMMENT |
| LOW | crates/storage-sqlite/src/db/maintenance.rs | 160 | // Step 8: install the candidate. `fs::rename` over the live database is | COMMENT |
| LOW | …es/storage-sqlite/src/assets/alternative_repository.rs | 206 | // Step 1: Find and unlink any liabilities that reference this asset | COMMENT |
| LOW⚡ | …es/storage-sqlite/src/assets/alternative_repository.rs | 257 | // Step 2: Delete all quotes for this asset with source = 'MANUAL' | COMMENT |
| LOW⚡ | …es/storage-sqlite/src/assets/alternative_repository.rs | 266 | // Step 3: Delete the asset record | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 194 | // Step 1: Sync connections (platforms) | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 211 | // Step 2: Sync accounts (filter by sync_enabled) | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 265 | // Step 3: Sync data for all synced accounts based on their tracking mode | COMMENT |
| LOW⚡ | e2e/helpers.ts | 443 | // Step 1: Info screen — click Continue | COMMENT |
| LOW⚡ | e2e/helpers.ts | 447 | // Step 2: Preferences — keep e2e assertions deterministic and pick CAD. | COMMENT |
| LOW⚡ | e2e/helpers.ts | 454 | // Step 3: Appearance — pick Light theme and continue | COMMENT |
| LOW⚡ | e2e/helpers.ts | 459 | // Step 4: Finish onboarding | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1027 | // Step 1: re-run backend validation on importable drafts so we catch | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1049 | // Step 2: filter again after backend validation — only import rows the | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1065 | // Step 3: create pending assets, then import the validated activities. | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1143 | // Step 4: success path — save template + persist tool result. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | crates/portfolio-engine/src/value.rs | 686 | .major_currency(self.resolved.facts.policy.base_currency.as_str()) | CODE |
| CRITICAL | …/frontend/src/features/profiles/error-messages.test.ts | 110 | catalog.default.profiles.errors.cooldown_other.replace("{{count}}", "30"), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .github/scripts/encryption_smoke.py | 120 | "--health-cmd", "wget --quiet --tries=1 --spider http://127.0.0.1:8088/api/v1/healthz || exit 1", | CODE |
| HIGH | .github/scripts/encryption_smoke.py | 219 | "RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates " | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/storage-sqlite/src/db/mod.rs | 1824 | // --- Internal helpers for robust, cross-platform file operations --- | COMMENT |
| MEDIUM | .github/scripts/ci_changes.py | 5 | # The standalone browser harness loads the addon runtime and its shared UI, | COMMENT |
| MEDIUM | apps/frontend/src/lib/utils.ts | 327 | // First attempt with the robust parser | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/test-data/generate-credit-card-history.py | 210 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/scripts/ci_changes.py | 26 | CODE | |
| LOW | .github/scripts/encryption_smoke.py | 69 | CODE | |
| LOW | .github/scripts/encryption_smoke.py | 114 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/ci-check.sh | 3 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/scripts/encryption_smoke.py | 174 | except Exception: | CODE |