/data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/resolver.py.before-sl004-20260910-181036:121: all return the SAME fully-merged dict containing every field. Against `FMPAdapter` — the real /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:6:from app.adapters.eodhd import EODHDAdapter /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:7:from app.adapters.fmp import FMPAdapter /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:11:def build_adapter(name: str, settings: Settings) -> ProviderAdapter: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:17: return FMPAdapter(api_key=settings.FMP_API_KEY, base_url=settings.FMP_BASE_URL, timeout=settings.PROVIDER_REQUEST_TIMEOUT_SECONDS) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:21: return EODHDAdapter(api_key=settings.EODHD_API_KEY, base_url=settings.EODHD_BASE_URL, timeout=settings.PROVIDER_REQUEST_TIMEOUT_SECONDS) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:29:def get_secondary_adapter(settings: Settings) -> ProviderAdapter | None: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/eodhd.py:41:class EODHDAdapter(ProviderAdapter): /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/resolver.py.before-sl004-20260910-144102:121: all return the SAME fully-merged dict containing every field. Against `FMPAdapter` — the real /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/base.py:33: internally (FMPAdapter uses httpx under the hood) but this ABC keeps the calling code simple /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/resolver.py:148: all return the SAME fully-merged dict containing every field. Against `FMPAdapter` — the real /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/fmp.py:70:class FMPAdapter(ProviderAdapter): /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/fmp.py:145: """AUDIT FIX (Part D — docs/AUDIT_VALIDATION_D.md): see EODHDAdapter.get_prices() for the /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/resolver.py.before-sl004-20260910-180740:121: all return the SAME fully-merged dict containing every field. Against `FMPAdapter` — the real /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/resolver.py.before-sl004-20260910-181036:121: all return the SAME fully-merged dict containing every field. Against `FMPAdapter` — the real /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:6:from app.adapters.eodhd import EODHDAdapter /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:7:from app.adapters.fmp import FMPAdapter /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:11:def build_adapter(name: str, settings: Settings) -> ProviderAdapter: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:17: return FMPAdapter(api_key=settings.FMP_API_KEY, base_url=settings.FMP_BASE_URL, timeout=settings.PROVIDER_REQUEST_TIMEOUT_SECONDS) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:21: return EODHDAdapter(api_key=settings.EODHD_API_KEY, base_url=settings.EODHD_BASE_URL, timeout=settings.PROVIDER_REQUEST_TIMEOUT_SECONDS) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/__init__.py:29:def get_secondary_adapter(settings: Settings) -> ProviderAdapter | None: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/eodhd.py:41:class EODHDAdapter(ProviderAdapter): /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/resolver.py.before-sl004-20260910-144102:121: all return the SAME fully-merged dict containing every field. Against `FMPAdapter` — the real /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/base.py:33: internally (FMPAdapter uses httpx under the hood) but this ABC keeps the calling code simple /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/resolver.py:148: all return the SAME fully-merged dict containing every field. Against `FMPAdapter` — the real /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/fmp.py:70:class FMPAdapter(ProviderAdapter): /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/fmp.py:145: """AUDIT FIX (Part D — docs/AUDIT_VALIDATION_D.md): see EODHDAdapter.get_prices() for the /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/resolver.py.before-sl004-20260910-180740:121: all return the SAME fully-merged dict containing every field. Against `FMPAdapter` — the real /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/engines/currency.py:13:fetch FX rates, because **no adapter in this repository provides them**: neither `FMPAdapter` nor /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/engines/currency.py:14:`EODHDAdapter` exposes an FX endpoint, and there is no network access here to call one. Inventing /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/engines/ttm.py:8:recent row verbatim, and `FMPAdapter` defaults to `period="annual"` — so every metric this platform /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-181036:284: (EODHDAdapter's balance-sheet/cash-flow methods are `NotImplementedError` today). An adapter /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-181036:441: # AUDIT FIX (Part A6, real bug caught before this shipped): EODHDAdapter.get_income_ /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py:286: (EODHDAdapter's balance-sheet/cash-flow methods are `NotImplementedError` today). An adapter /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py:449: # AUDIT FIX (Part A6, real bug caught before this shipped): EODHDAdapter.get_income_ /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-180740:284: (EODHDAdapter's balance-sheet/cash-flow methods are `NotImplementedError` today). An adapter /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-180740:441: # AUDIT FIX (Part A6, real bug caught before this shipped): EODHDAdapter.get_income_