A beautiful, private, local-first personal finance tracker. Investments, net worth, spending, and simulations.
This report presents the forensic synthetic code analysis of wealthfolio/wealthfolio, a Rust project with 8,751 GitHub stars. SynthScan v2.0 examined 690,724 lines of code across 2044 source files, recording 1434 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 4.2 places this repository in the Likely human-written 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 1434 distinct pattern matches across 11 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.yml | 24 | # ── Authentication ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | compose.yml | 43 | # ── OIDC / SSO (optional) ───────────────────────────────────────── | COMMENT |
| MEDIUM | compose.yml | 67 | # ── 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 | 327 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 329 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 415 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 417 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 500 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/types.rs | 502 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 550 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 552 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 651 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 653 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 761 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 763 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 1211 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 1213 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 1320 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/client.rs | 1322 | // ───────────────────────────────────────────────────────────────────────── | 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 | 32 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 34 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 129 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 131 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 160 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 162 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 442 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 444 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 547 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/enroll_service.rs | 549 | // ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | crates/device-sync/src/engine/runtime.rs | 13 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/runtime.rs | 15 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/runtime.rs | 53 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/device-sync/src/engine/runtime.rs | 176 | // ─── Pairing flow store ────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/market-data/src/provider/metal_price_api/mod.rs | 467 | // ── 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/market-data/src/resolver/exchange_registry.rs | 11 | // ── JSON schema ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/market-data/src/resolver/exchange_registry.rs | 54 | // ── Public API type for frontend consumption ───────────────────────────────── | COMMENT |
| MEDIUM | crates/market-data/src/resolver/exchange_registry.rs | 84 | // ── Registry with pre-built indexes ────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 80 | // ── Resolved asset identity (populated during validation) ────────────── | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 91 | // ── Duplicate / validation ───────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 233 | // ── get_import_mapping ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 305 | // ── prepare_activity_import ───────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/agent-tools/src/tools/activity_import.rs | 375 | // ── commit_activity_import ────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/core/src/goals/goals_service.rs | 28 | // ─── Shared helpers ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/core/src/quotes/client.rs | 9 | //! ┌─────────────────────────────────────────────────────────────────────┐ | COMMENT |
| MEDIUM⚡ | crates/core/src/quotes/client.rs | 12 | //! │ Asset ─────────────────────────────────────────────▶ core::Quote │ | COMMENT |
| MEDIUM⚡ | crates/core/src/quotes/client.rs | 16 | //! │ ┌─────────────────────────────────────────────────────────────┐ │ | COMMENT |
| 597 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | playwright.config.ts | 41 | use: { ...devices["Desktop Chrome"], channel: "chrome", headless: true }, | COMMENT |
| LOW | playwright.config.ts | 61 | // use: { ...devices['iPhone 12'] }, | COMMENT |
| LOW | compose.yml | 21 | # Required — generate with: openssl rand -base64 32 | COMMENT |
| LOW | compose.yml | 41 | # WF_AUTH_REQUIRED: "true" | 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 | COMMENT | |
| LOW | crates/device-sync/src/types.rs | 341 | /// Response from creating a pairing session. | COMMENT |
| LOW | crates/device-sync/src/types.rs | 381 | #[serde(alias = "claimer_device_id")] | COMMENT |
| LOW | crates/device-sync/src/types.rs | 401 | pub signature: String, | COMMENT |
| LOW | crates/device-sync/src/types.rs | 421 | #[derive(Debug, Clone, Serialize, Deserialize)] | COMMENT |
| LOW | crates/device-sync/src/types.rs | 441 | pub e2ee_key_version: i32, | COMMENT |
| LOW | crates/device-sync/src/types.rs | 461 | /// Message timestamp | COMMENT |
| LOW | crates/device-sync/src/types.rs | 481 | /// Optional HMAC proof that device successfully decrypted the RK bundle | 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/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 | /// * `symbol` - The symbol to fetch profile for | 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/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 |
| LOW | crates/market-data/src/models/coverage.rs | 1 | //! Provider market coverage restrictions. | COMMENT |
| LOW | crates/market-data/src/models/profile.rs | 1 | use serde::{Deserialize, Serialize}; | COMMENT |
| LOW | crates/market-data/src/models/profile.rs | 21 | /// Not stored on the asset - it exists so a caller can confirm the provider | COMMENT |
| LOW | crates/market-data/src/models/mod.rs | 1 | //! Market data models | COMMENT |
| LOW | crates/market-data/src/models/provider_params.rs | 61 | #[serde(flatten)] | COMMENT |
| LOW | crates/market-data/src/registry/validator.rs | 1 | //! Quote data validation. | COMMENT |
| LOW | crates/market-data/src/registry/provider_registry.rs | 41 | /// Create a new provider registry. | COMMENT |
| LOW | crates/market-data/src/registry/circuit_breaker.rs | 1 | //! Per-provider circuit breaker for fault tolerance. | COMMENT |
| LOW | crates/market-data/src/errors/mod.rs | 1 | //! Error types and retry classification for the market data crate. | COMMENT |
| LOW | crates/market-data/src/errors/mod.rs | 21 | #[error("Symbol not found: {0}")] | COMMENT |
| LOW | crates/market-data/src/errors/mod.rs | 61 | /// The provider doesn't know how to handle this instrument. | COMMENT |
| LOW | crates/market-data/src/errors/mod.rs | 81 | /// Description of the validation failure | COMMENT |
| LOW | crates/market-data/src/errors/mod.rs | 101 | /// The provider that doesn't support it | COMMENT |
| LOW | crates/market-data/src/errors/mod.rs | 121 | /// | COMMENT |
| LOW | crates/market-data/src/errors/retry.rs | 1 | /// Classification for retry policy. | COMMENT |
| LOW | crates/market-data/src/errors/retry.rs | 21 | /// Used for transient errors like rate limiting (429) or timeout. | COMMENT |
| LOW | crates/market-data/src/resolver/asset_resolver.rs | 1 | //! Asset resolver - resolves from Asset.provider_overrides. | COMMENT |
| 294 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/features/allocations/sota-target-model-spec.md | 1004 | export async function getAllocationAdvisorState( | CODE |
| LOW | docs/features/allocations/sota-target-model-spec.md | 1010 | export async function calculateRebalanceScenarios( | CODE |
| LOW | packages/ui/src/components/ui/chart.tsx | 305 | function getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) { | CODE |
| LOW | packages/ui/src/components/ui/empty-placeholder.tsx | 60 | EmptyPlaceholder.Description = function EmptyPlaceholderDescription({ | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 113 | export function calendarDateFromLocalDate(value: Date): CalendarDateParts { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 117 | export function calendarDateTimeFromLocalDate(value: Date): CalendarDateTimeParts { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 389 | function normalizeInvariantNumberString(value: string): string { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 394 | function localizedNumberToInvariant(value: string, locale: string): string | undefined { | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 406 | function parsePreparedDecimalString( | CODE |
| LOW | packages/ui/src/lib/formatting.ts | 433 | export function parseLocalizedDecimalString(value: string, locale: string): string | undefined { | CODE |
| LOW | packages/addon-sdk/README.md | 292 | function InvestmentFeesTrackerAddon({ ctx }: { ctx: AddonContext }) { | CODE |
| LOW | packages/addon-sdk/src/permissions.ts | 265 | export function getPermissionCategoriesByRisk( | CODE |
| LOW | packages/addon-sdk/src/permissions.ts | 306 | export function getUndeclaredDetectedFunctions(permission: Permission): string[] { | CODE |
| LOW | packages/addon-sdk/src/permissions.ts | 315 | 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 | e2e/helpers.ts | 70 | async function canSkipLoginAndOnboardingUi(page: Page) { | CODE |
| LOW | e2e/helpers.ts | 114 | async function waitForLoginOnboardingOrApp(page: Page, timeout: number) { | CODE |
| LOW | e2e/helpers.ts | 399 | export async function completeOnboardingIfNeeded(page: Page) { | CODE |
| LOW | e2e/02-activities.spec.ts | 304 | 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/10-symbol-mapping-validation.spec.ts | 172 | async function setOpenSheetToManualPricing() { | CODE |
| LOW | e2e/12-asset-backed-income-subtypes.spec.ts | 214 | async function expectHoldingVisibleInAccount(symbol: string, quantity: number) { | CODE |
| LOW | e2e/15-csv-import-currency-resolution.spec.ts | 30 | async function searchImportedKwebActivity(page: Page) { | CODE |
| LOW | e2e/14-stock-short-workflow.spec.ts | 186 | async function assertBuyFormDoesNotOfferBuyShort(page: Page) { | CODE |
| LOW | apps/frontend/src/addons/addons-dev-mode.ts | 36 | export function shouldReloadDevelopmentAddon( | CODE |
| LOW | apps/frontend/src/addons/addons-dev-mode.ts | 48 | export function getDevelopmentRuntimePackageError(status: number, detail: string): string { | CODE |
| LOW | apps/frontend/src/addons/activation-coordinator.ts | 70 | export function getPublishedActivationEpoch(): number { | CODE |
| LOW | apps/frontend/src/addons/activation-coordinator.ts | 74 | export function subscribeToActivationEpoch(listener: () => void): () => void { | CODE |
| LOW | apps/frontend/src/addons/contribution-registry.ts | 50 | function normalizeContributedRoutePath(path: unknown): string | null { | CODE |
| LOW | apps/frontend/src/addons/addons-runtime-context.ts | 141 | export function setAddonNavigationHandler(navigate: (route: string) => void) { | CODE |
| LOW | apps/frontend/src/addons/addons-runtime-context.ts | 145 | export function clearAddonNavigationHandler(navigate: (route: string) => void) { | CODE |
| LOW | apps/frontend/src/addons/addons-runtime-context.ts | 207 | function getOwnedAddonRouteNamespaces(addonId: string) { | CODE |
| LOW | apps/frontend/src/addons/addons-runtime-context.ts | 221 | function getRequestedRouteNamespace(path: string) { | CODE |
| LOW | apps/frontend/src/addons/addons-runtime-context.ts | 226 | function isAddonRouteNamespaceAllowed(addonId: string, path: string) { | CODE |
| LOW | apps/frontend/src/addons/addons-runtime-context.ts | 261 | function hasRegisteredAddonNavPrefix(addonId: string, path: string) { | CODE |
| LOW | apps/frontend/src/addons/addons-runtime-context.ts | 399 | export function subscribeToNavigationUpdates(callback: () => void) { | CODE |
| LOW | apps/frontend/src/addons/addons-runtime-context.ts | 408 | export function triggerAllDisableCallbacks() { | CODE |
| LOW | apps/frontend/src/addons/addons-core.ts | 76 | function validateAddonCompatibility(manifest: AddonManifest): boolean { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-sandbox-theme.ts | 14 | export function collectAddonThemeSnapshot(): AddonThemeSnapshot { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-sandbox-entry.tsx | 148 | function updateSandboxLocalization(localization?: AddonLocalizationSnapshot) { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-sandbox-entry.tsx | 162 | function SandboxFormattingProvider({ children }: { children: React.ReactNode }) { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-sandbox-entry.tsx | 247 | function createAddonModuleRegistry(code: string, files: SandboxAddonFile[] = []) { | CODE |
| LOW | …ontend/src/addons/iframe/addon-module-rewriter.test.ts | 13 | function shouldRewriteStaticSpecifier(specifier: string) { | CODE |
| LOW | …frontend/src/addons/iframe/ticker-logo-asset-bridge.ts | 4 | export function normalizeTickerLogoSymbol(symbol: unknown) { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-iframe-manager.ts | 127 | function createAddonLoadCancelledError(addonId: string, reason = "was unloaded before it loaded") { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-iframe-manager.ts | 133 | function createSandboxBootstrapParams( | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-iframe-manager.ts | 213 | function notifyPermissionDenialOnce(addonId: string, method: string | undefined, error: unknown) { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-iframe-manager.ts | 277 | function notifyClassifiedAddonErrorOnce(addonId: string, rawMessage: string | undefined) { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-sandbox-i18n.ts | 121 | export function installAddonTranslationRuntime(addonId: string) { | CODE |
| LOW | apps/frontend/src/addons/iframe/host-dependencies.ts | 93 | export function isHostDependencySpecifier(specifier: string) { | CODE |
| LOW | apps/frontend/src/addons/iframe/host-dependencies.ts | 97 | export function createHostDependencyModuleUrl(specifier: string, objectUrls: Map<string, string>) { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-sandbox-assets.ts | 26 | export function loadAddonSandboxRuntimeAssets(): Promise<AddonSandboxRuntimeAssets> { | CODE |
| LOW | apps/frontend/src/addons/iframe/addon-sandbox-assets.ts | 45 | export function resetAddonSandboxRuntimeAssetsForTest() { | CODE |
| LOW | …ontend/src/addons/iframe/addon-sandbox-localization.ts | 19 | export function collectAddonLocalizationSnapshot(): AddonLocalizationSnapshot { | CODE |
| LOW | …ontend/src/addons/iframe/addon-sandbox-localization.ts | 23 | export function setAddonLocalizationSnapshot(snapshot: AddonLocalizationSnapshot): void { | CODE |
| LOW | …ontend/src/addons/iframe/addon-sandbox-localization.ts | 38 | export function subscribeToAddonLocalization(listener: AddonLocalizationListener): () => void { | CODE |
| LOW | …t-planner/components/retirement-dashboard-skeleton.tsx | 3 | export function RetirementDashboardSkeleton() { | CODE |
| LOW | …ement-planner/components/retirement-coverage-chart.tsx | 33 | function CoverageProjectionTooltip({ | CODE |
| LOW | …retirement-planner/components/sidebar-configurator.tsx | 181 | function highContributionGrowthWarning(value: number, t: TFunction) { | CODE |
| 276 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/market-data/src/provider/yahoo/mod.rs | 171 | // Step 1: Get cookie from fc.yahoo.com | COMMENT |
| LOW | crates/market-data/src/provider/yahoo/mod.rs | 191 | // Step 2: Get crumb using cookie | COMMENT |
| LOW | crates/core/src/utils/isin.rs | 148 | // Step 1: Convert characters to digit string | COMMENT |
| LOW | crates/core/src/utils/isin.rs | 160 | // Step 2: Apply Luhn algorithm | COMMENT |
| LOW | …re/src/portfolio/snapshot/holdings_calculator_tests.rs | 5988 | // Step 1: Deposit 10,000 EUR | COMMENT |
| LOW | …re/src/portfolio/snapshot/holdings_calculator_tests.rs | 6004 | // Step 2: Buy 10 AAPL @ $100 + $5 fee, fx_rate = 0.93 | COMMENT |
| LOW | …re/src/portfolio/snapshot/holdings_calculator_tests.rs | 6022 | // Step 3: Sell all 10 AAPL @ $100 + $5 fee, fx_rate = 0.95 | COMMENT |
| LOW | …es/storage-sqlite/src/assets/alternative_repository.rs | 57 | // Step 1: Find and unlink any liabilities that reference this asset | COMMENT |
| LOW⚡ | …es/storage-sqlite/src/assets/alternative_repository.rs | 92 | // Step 2: Delete all quotes for this asset with source = 'MANUAL' | COMMENT |
| LOW⚡ | …es/storage-sqlite/src/assets/alternative_repository.rs | 101 | // Step 3: Delete the asset record | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 190 | // Step 1: Sync connections (platforms) | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 207 | // Step 2: Sync accounts (filter by sync_enabled) | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 261 | // Step 3: Sync data for all synced accounts based on their tracking mode | COMMENT |
| LOW⚡ | e2e/helpers.ts | 423 | // Step 1: Info screen — click Continue | COMMENT |
| LOW⚡ | e2e/helpers.ts | 427 | // Step 2: Preferences — keep e2e assertions deterministic and pick CAD. | COMMENT |
| LOW⚡ | e2e/helpers.ts | 434 | // Step 3: Appearance — pick Light theme and continue | COMMENT |
| LOW⚡ | e2e/helpers.ts | 439 | // Step 4: Finish onboarding | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1005 | // Step 1: re-run backend validation on importable drafts so we catch | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1027 | // Step 2: filter again after backend validation — only import rows the | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1043 | // Step 3: create pending assets, then import the validated activities. | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1122 | // Step 4: success path — save template + persist tool result. | COMMENT |
| LOW | apps/tauri/src/listeners.rs | 275 | // Step 0: Resolve account scope. Specific requests are processed as-is; | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/market-data/src/provider/yahoo/mod.rs | 171 | // Step 1: Get cookie from fc.yahoo.com | COMMENT |
| LOW | crates/market-data/src/provider/yahoo/mod.rs | 191 | // Step 2: Get crumb using cookie | COMMENT |
| LOW | crates/core/src/utils/isin.rs | 148 | // Step 1: Convert characters to digit string | COMMENT |
| LOW | crates/core/src/utils/isin.rs | 160 | // Step 2: Apply Luhn algorithm | COMMENT |
| LOW | …re/src/portfolio/snapshot/holdings_calculator_tests.rs | 5988 | // Step 1: Deposit 10,000 EUR | COMMENT |
| LOW | …re/src/portfolio/snapshot/holdings_calculator_tests.rs | 6004 | // Step 2: Buy 10 AAPL @ $100 + $5 fee, fx_rate = 0.93 | COMMENT |
| LOW | …re/src/portfolio/snapshot/holdings_calculator_tests.rs | 6022 | // Step 3: Sell all 10 AAPL @ $100 + $5 fee, fx_rate = 0.95 | COMMENT |
| LOW | …es/storage-sqlite/src/assets/alternative_repository.rs | 57 | // Step 1: Find and unlink any liabilities that reference this asset | COMMENT |
| LOW⚡ | …es/storage-sqlite/src/assets/alternative_repository.rs | 92 | // Step 2: Delete all quotes for this asset with source = 'MANUAL' | COMMENT |
| LOW⚡ | …es/storage-sqlite/src/assets/alternative_repository.rs | 101 | // Step 3: Delete the asset record | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 190 | // Step 1: Sync connections (platforms) | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 207 | // Step 2: Sync accounts (filter by sync_enabled) | COMMENT |
| LOW | crates/connect/src/broker/orchestrator.rs | 261 | // Step 3: Sync data for all synced accounts based on their tracking mode | COMMENT |
| LOW⚡ | e2e/helpers.ts | 423 | // Step 1: Info screen — click Continue | COMMENT |
| LOW⚡ | e2e/helpers.ts | 427 | // Step 2: Preferences — keep e2e assertions deterministic and pick CAD. | COMMENT |
| LOW⚡ | e2e/helpers.ts | 434 | // Step 3: Appearance — pick Light theme and continue | COMMENT |
| LOW⚡ | e2e/helpers.ts | 439 | // Step 4: Finish onboarding | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1005 | // Step 1: re-run backend validation on importable drafts so we catch | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1027 | // Step 2: filter again after backend validation — only import rows the | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1043 | // Step 3: create pending assets, then import the validated activities. | COMMENT |
| LOW | …features/ai-assistant/hooks/use-chat-import-session.ts | 1122 | // Step 4: success path — save template + persist tool result. | COMMENT |
| LOW | apps/tauri/src/listeners.rs | 275 | // Step 0: Resolve account scope. Specific requests are processed as-is; | 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 | …d/src/pages/settings/market-data/provider-templates.ts | 70 | headers: '{"Authorization": "apikey YOUR_API_KEY"}', | CODE |
| HIGH | …d/src/pages/settings/market-data/provider-templates.ts | 106 | headers: '{"Authorization": "apikey YOUR_API_KEY"}', | CODE |
| HIGH | …d/src/pages/settings/market-data/provider-templates.ts | 120 | headers: '{"Authorization": "apikey YOUR_API_KEY"}', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/ai/Cargo.toml | 33 | # LLM orchestration (rig-core crate exports as "rig") | 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 |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/core/src/assets/alternative_assets_model.rs | 45 | /// 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 | 117 | "placeholder": "Enter your Google AI API key", | CODE |
| LOW | crates/ai/src/ai_providers.json | 125 | "placeholder": "Leave empty to use default", | CODE |
| LOW | crates/ai/src/ai_providers.json | 171 | "placeholder": "Enter your Anthropic API key", | CODE |
| LOW | crates/ai/src/ai_providers.json | 179 | "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 | …s/frontend/src/components/currency-selector-mobile.tsx | 10 | "value" | "onChange" | "displayMode" | "placeholder" | "onSelect" | CODE |
| LOW | apps/frontend/src/i18n/locales/ja/asset.json | 567 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/zh/asset.json | 567 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/de/asset.json | 568 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/ko/asset.json | 567 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/fr/asset.json | 568 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/es/asset.json | 568 | "placeholder": { | CODE |
| LOW | apps/frontend/src/i18n/locales/en/asset.json | 568 | "placeholder": { | CODE |
| LOW | …targets/components/eligible-holdings-selector.test.tsx | 144 | holding("asset-xnas", "ABC", "Acme Corp", "EQUITY", HoldingType.SECURITY, "USD", "XNAS"), | CODE |
| LOW | …targets/components/eligible-holdings-selector.test.tsx | 145 | holding("asset-xtse", "ABC", "Acme Corp", "EQUITY", HoldingType.SECURITY, "CAD", "XTSE"), | 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 | crates/storage-sqlite/src/db/mod.rs | 883 | // --- Internal helpers for robust, cross-platform file operations --- | COMMENT |
| MEDIUM | apps/frontend/src/lib/utils.ts | 221 | // First attempt with the robust parser | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/ci-check.sh | 3 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/release.yml | 74 | cache: "pnpm" # Set this to npm, yarn or pnpm. | CODE |