4:resolution applied, then a `financials.updated` signal that triggers recompute (app/workers/ 5:recompute.py). Demo and live data are never blended for the same security (docs/DATA_SOURCES.md 106: f"it already has {'live' if is_demo else 'demo'} financial_periods rows." 309: end = date.today() 387: income_periods = adapter.get_income_statements(ticker) 391: # Part A9: optional quarterly ingestion. Off by default (Settings.INGEST_QUARTERLY_PERIODS). 395: # unaffected. app/engines/ttm.py turns four of them into a TTM basis at recompute time. 404: income_periods = list(income_periods) + list(quarterly_income) 455: for p in income_periods: 550: # (security_id, period_end, metric, as_of_date). Nothing ever called it, nothing ever wrote a 556: # same (period_end, metric, as_of_date) is updated in place, never duplicated on re-ingestion. 560: db.commit() 562: periods=len(income_periods), estimates=estimates_written, 589: as_of_date=r.as_of_date, 594: as_of_date=r.as_of_date, 641: include_quarterly=settings.INGEST_QUARTERLY_PERIODS, 652: from app.workers.recompute import recompute_security_task 653: recompute_security_task.delay(security_id)