From 6e43c7164a16c4f17f2e6ccb35b43caa88ad7b67 Mon Sep 17 00:00:00 2001 From: Youssef Aitousarrah Date: Thu, 16 Apr 2026 11:02:47 -0700 Subject: [PATCH] fix(analytics): merge recommendations into existing dated file instead of overwriting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Multiple runs on the same day (scheduled discovery, hypothesis runner, manual re-runs) were each clobbering the shared YYYY-MM-DD.json file. Now merges by loading existing picks and upserting new ones by ticker — later run wins. Co-Authored-By: Claude Sonnet 4.6 --- .../dataflows/discovery/analytics.py | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/tradingagents/dataflows/discovery/analytics.py b/tradingagents/dataflows/discovery/analytics.py index 124a44d2..c6a4d772 100644 --- a/tradingagents/dataflows/discovery/analytics.py +++ b/tradingagents/dataflows/discovery/analytics.py @@ -444,21 +444,36 @@ class DiscoveryAnalytics: } ) - # Save to dated file + # Merge into existing dated file so multiple runs on the same day accumulate. + # Dedupe by ticker — later run wins (more recent price, potentially better signal). output_file = self.recommendations_dir / f"{trade_date}.json" + existing = [] + if output_file.exists(): + try: + with open(output_file) as f: + existing = json.load(f).get("recommendations", []) + except Exception: + existing = [] + + # Index existing by ticker; overwrite with new picks + merged = {r["ticker"]: r for r in existing} + for r in enriched_rankings: + merged[r["ticker"]] = r + merged_list = list(merged.values()) + with open(output_file, "w") as f: json.dump( { "date": trade_date, "llm_provider": llm_provider, - "recommendations": enriched_rankings, + "recommendations": merged_list, }, f, indent=2, ) logger.info( - f" 📊 Saved {len(enriched_rankings)} recommendations for tracking: {output_file}" + f" 📊 Saved {len(enriched_rankings)} recommendations ({len(merged_list)} total) for tracking: {output_file}" ) def save_discovery_results(self, state: dict, trade_date: str, config: Dict[str, Any]):