adamshafishaik commited on
Commit
acfb2c9
·
1 Parent(s): a4f5b36

fixed article image breaking issue

Browse files
app/services/appwrite_db.py CHANGED
@@ -321,12 +321,17 @@ class AppwriteDatabase:
321
  if not url and _safe_get(doc, 'pdf_url'):
322
  url = _safe_get(doc, 'pdf_url')
323
 
 
 
 
 
 
324
  article = {
325
  '$id': _safe_get(doc, '$id'), # Ensure $id is passed!
326
  'title': _safe_get(doc, 'title'),
327
  'description': description,
328
  'url': url,
329
- 'image_url': _safe_get(doc, 'image_url', ''),
330
  'publishedAt': _safe_get(doc, 'published_at'),
331
  'published_at': _safe_get(doc, 'published_at'), # Standard schema field
332
  'source': _safe_get(doc, 'source', ''),
@@ -403,12 +408,17 @@ class AppwriteDatabase:
403
  articles = []
404
  for doc in _safe_get(response, 'rows', []):
405
  try:
 
 
 
 
 
406
  article = {
407
  '$id': _safe_get(doc, '$id'),
408
  'title': _safe_get(doc, 'title'),
409
  'description': _safe_get(doc, 'description') or _safe_get(doc, 'summary', ''),
410
  'url': _safe_get(doc, 'url'),
411
- 'image_url': _safe_get(doc, 'image_url', ''),
412
  'publishedAt': _safe_get(doc, 'published_at'),
413
  'published_at': _safe_get(doc, 'published_at'),
414
  'source': _safe_get(doc, 'source', ''),
@@ -472,8 +482,15 @@ class AppwriteDatabase:
472
  return obj.get(field, default)
473
  return getattr(obj, field, default)
474
 
 
 
 
 
 
 
 
475
  # Route to correct collection
476
- category_val = str(get_field(article, 'category', ''))
477
  target_collection_id = self.get_collection_id(category_val)
478
 
479
  # Prepare document data - STRICT SCHEMA MAPPING (New Schema Enforcement)
@@ -489,17 +506,17 @@ class AppwriteDatabase:
489
  pub_date_str = str(pub_date or datetime.now().isoformat())
490
 
491
  document_data = {
492
- 'title': str(get_field(article, 'title', ''))[:500],
493
- 'description': str(get_field(article, 'description', ''))[:2000],
494
  'url': url[:2048],
495
- 'image_url': str(get_field(article, 'image_url') or get_field(article, 'image', ''))[:2048] or None,
496
  'published_at': pub_date_str,
497
- 'source': str(get_field(article, 'source', ''))[:200],
498
- 'category': str(get_field(article, 'category', ''))[:100],
499
  'fetched_at': datetime.now().isoformat(),
500
  'url_hash': url_hash_full, # 64 chars
501
- 'slug': str(get_field(article, 'slug', ''))[:200] if get_field(article, 'slug', '') else None,
502
- 'quality_score': int(get_field(article, 'quality_score', 50)),
503
  # ENGAGEMENT METRICS
504
  'likes': 0,
505
  'dislike': 0,
 
321
  if not url and _safe_get(doc, 'pdf_url'):
322
  url = _safe_get(doc, 'pdf_url')
323
 
324
+ # Fix for legacy "None" string corruption in image_url
325
+ img_url = _safe_get(doc, 'image_url', '')
326
+ if img_url == "None":
327
+ img_url = ''
328
+
329
  article = {
330
  '$id': _safe_get(doc, '$id'), # Ensure $id is passed!
331
  'title': _safe_get(doc, 'title'),
332
  'description': description,
333
  'url': url,
334
+ 'image_url': img_url,
335
  'publishedAt': _safe_get(doc, 'published_at'),
336
  'published_at': _safe_get(doc, 'published_at'), # Standard schema field
337
  'source': _safe_get(doc, 'source', ''),
 
408
  articles = []
409
  for doc in _safe_get(response, 'rows', []):
410
  try:
411
+ # Fix for legacy "None" string corruption in image_url
412
+ img_url = _safe_get(doc, 'image_url', '')
413
+ if img_url == "None":
414
+ img_url = ''
415
+
416
  article = {
417
  '$id': _safe_get(doc, '$id'),
418
  'title': _safe_get(doc, 'title'),
419
  'description': _safe_get(doc, 'description') or _safe_get(doc, 'summary', ''),
420
  'url': _safe_get(doc, 'url'),
421
+ 'image_url': img_url,
422
  'publishedAt': _safe_get(doc, 'published_at'),
423
  'published_at': _safe_get(doc, 'published_at'),
424
  'source': _safe_get(doc, 'source', ''),
 
482
  return obj.get(field, default)
483
  return getattr(obj, field, default)
484
 
485
+ # Helper to safely cast to string and prevent "None" strings
486
+ def clean_str(val, max_len=None):
487
+ if val is None or str(val).strip() == "None":
488
+ return ''
489
+ s = str(val).strip()
490
+ return s[:max_len] if max_len else s
491
+
492
  # Route to correct collection
493
+ category_val = clean_str(get_field(article, 'category', ''))
494
  target_collection_id = self.get_collection_id(category_val)
495
 
496
  # Prepare document data - STRICT SCHEMA MAPPING (New Schema Enforcement)
 
506
  pub_date_str = str(pub_date or datetime.now().isoformat())
507
 
508
  document_data = {
509
+ 'title': clean_str(get_field(article, 'title', ''), 500),
510
+ 'description': clean_str(get_field(article, 'description', ''), 2000),
511
  'url': url[:2048],
512
+ 'image_url': clean_str(get_field(article, 'image_url') or get_field(article, 'image', ''), 2048) or None,
513
  'published_at': pub_date_str,
514
+ 'source': clean_str(get_field(article, 'source', ''), 200),
515
+ 'category': clean_str(get_field(article, 'category', ''), 100),
516
  'fetched_at': datetime.now().isoformat(),
517
  'url_hash': url_hash_full, # 64 chars
518
+ 'slug': clean_str(get_field(article, 'slug', ''), 200) or None,
519
+ 'quality_score': int(get_field(article, 'quality_score', 50) or 50),
520
  # ENGAGEMENT METRICS
521
  'likes': 0,
522
  'dislike': 0,
graphify-out/.graphify_labels.json CHANGED
@@ -83,6 +83,11 @@
83
  "81": "Community 81",
84
  "82": "Community 82",
85
  "83": "Community 83",
 
 
 
 
 
86
  "89": "Community 89",
87
  "90": "Community 90",
88
  "91": "Community 91",
@@ -128,5 +133,6 @@
128
  "131": "code:bash (# Fetch AI news)",
129
  "132": "code:bash (pip install -r requirements.txt)",
130
  "133": "bool",
131
- "134": "deploy.ps1"
 
132
  }
 
83
  "81": "Community 81",
84
  "82": "Community 82",
85
  "83": "Community 83",
86
+ "84": "._fetch_and_parse_feed",
87
+ "85": ".get_articles",
88
+ "86": "id_generator.py",
89
+ "87": "fetch_and_validate_category",
90
+ "88": "analytics.py",
91
  "89": "Community 89",
92
  "90": "Community 90",
93
  "91": "Community 91",
 
133
  "131": "code:bash (# Fetch AI news)",
134
  "132": "code:bash (pip install -r requirements.txt)",
135
  "133": "bool",
136
+ "134": "deploy.ps1",
137
+ "135": "firebase_service.py"
138
  }
graphify-out/2026-08-24/.graphify_labels.json CHANGED
@@ -83,11 +83,6 @@
83
  "81": "Community 81",
84
  "82": "Community 82",
85
  "83": "Community 83",
86
- "84": "Community 84",
87
- "85": "Community 85",
88
- "86": "Community 86",
89
- "87": "Community 87",
90
- "88": "Community 88",
91
  "89": "Community 89",
92
  "90": "Community 90",
93
  "91": "Community 91",
 
83
  "81": "Community 81",
84
  "82": "Community 82",
85
  "83": "Community 83",
 
 
 
 
 
86
  "89": "Community 89",
87
  "90": "Community 90",
88
  "91": "Community 91",
graphify-out/2026-08-24/GRAPH_REPORT.md CHANGED
@@ -1,16 +1,16 @@
1
- # Graph Report - backend (2026-08-21)
2
 
3
  ## Corpus Check
4
- - 82 files · ~70,871 words
5
  - Verdict: corpus is large enough that graph structure adds value.
6
 
7
  ## Summary
8
- - 1063 nodes · 1755 edges · 135 communities (100 shown, 35 thin omitted)
9
- - Extraction: 96% EXTRACTED · 4% INFERRED · 0% AMBIGUOUS · INFERRED: 76 edges (avg confidence: 0.53)
10
  - Token cost: 0 input · 0 output
11
 
12
  ## Graph Freshness
13
- - Built from commit: `8e2e06c9`
14
  - Run `git rev-parse HEAD` and compare to check if the graph is stale.
15
  - Run `graphify update .` after code changes (no API cost).
16
 
@@ -72,16 +72,10 @@
72
  - [[_COMMUNITY_Community 63|Community 63]]
73
  - [[_COMMUNITY_Community 77|Community 77]]
74
  - [[_COMMUNITY_Community 78|Community 78]]
75
- - [[_COMMUNITY_Community 79|Community 79]]
76
  - [[_COMMUNITY_Community 80|Community 80]]
77
  - [[_COMMUNITY_Community 81|Community 81]]
78
  - [[_COMMUNITY_Community 82|Community 82]]
79
  - [[_COMMUNITY_Community 83|Community 83]]
80
- - [[_COMMUNITY_Community 84|Community 84]]
81
- - [[_COMMUNITY_Community 85|Community 85]]
82
- - [[_COMMUNITY_Community 86|Community 86]]
83
- - [[_COMMUNITY_Community 87|Community 87]]
84
- - [[_COMMUNITY_Community 88|Community 88]]
85
  - [[_COMMUNITY_Community 89|Community 89]]
86
  - [[_COMMUNITY_Community 92|Community 92]]
87
  - [[_COMMUNITY_Community 94|Community 94]]
@@ -123,81 +117,81 @@
123
  10. `NewsProvider` - 19 edges
124
 
125
  ## Surprising Connections (you probably didn't know these)
 
 
 
 
 
 
126
  - `AppwriteDatabase` --uses--> `Article` [INFERRED]
127
  app/services/appwrite_db.py → app/models.py
128
  - `TablesDBWrapper` --uses--> `Article` [INFERRED]
129
  app/services/appwrite_db.py → app/models.py
130
- - `CacheService` --uses--> `Article` [INFERRED]
131
- app/services/cache_service.py → app/models.py
132
- - `NewsAggregator` --uses--> `Article` [INFERRED]
133
- app/services/news_aggregator.py → app/models.py
134
- - `GNewsProvider` --uses--> `Article` [INFERRED]
135
- app/services/news_providers.py → app/models.py
136
 
137
  ## Import Cycles
138
  - None detected.
139
 
140
- ## Communities (135 total, 35 thin omitted)
141
 
142
  ### Community 0 - "Community 0"
143
- Cohesion: 0.13
144
- Nodes (15): _build_category_regex(), calculate_quality_score(), generate_slug(), Data Validation and Sanitization Layer FAANG-Level Quality Control for News Art, Clean and normalize article data HOTFIX: Now handles both Pydantic Ar, Generate URL-friendly slug from title Example: "Google Announces New, Score article quality from 0-100 Higher scores = better quality artic, # NOTE: 'cloud-computing' is kept here because it is an active category in (+7 more)
145
 
146
  ### Community 1 - "Community 1"
147
  Cohesion: 0.12
148
- Nodes (17): ErrorResponse, NewsResponse, Response model for news endpoints, get_news_by_category(), get_provider_stats(), get_rss_feed(), get_umbrella_news(), Get news articles by category with cursor pagination and stale-while-revalidate (+9 more)
149
 
150
  ### Community 2 - "Community 2"
151
  Cohesion: 0.08
152
  Nodes (20): _DatetimeEncoder, Any, Execute Redis command via REST API. WARN-002 fixed: was using blockin, Get value from cache Args: key: Cache key, Set value in cache with TTL Args: key: Cache key, Delete key from cache Args: key: Cache key to de, JSON encoder that converts datetime/date objects to ISO-8601 strings. Preve, Push an item to the left of a Redis list (Producer action) Ar (+12 more)
153
 
154
  ### Community 4 - "Community 4"
155
- Cohesion: 0.08
156
- Nodes (27): ABC, NewsAggregator, Service for aggregating news from multiple sources with automatic failover, Get usage statistics for monitoring, GNewsProvider, GoogleNewsRSSProvider, NewsAPIProvider, NewsDataProvider (+19 more)
157
 
158
  ### Community 6 - "Community 6"
159
- Cohesion: 0.67
160
- Nodes (3): CircuitState, Circuit breaker states, str
161
 
162
  ### Community 8 - "Community 8"
163
- Cohesion: 0.08
164
- Nodes (22): bloom_filter_health_check(), get_bloom_filter_stats(), Reset Scalable Bloom Filter - Integration Sync Mechanism **USE CASE**, Get Scalable Bloom Filter statistics - Observability Endpoint Shows:, Quick health check for Bloom Filter - Production Monitoring Returns:, reset_bloom_filter(), Save articles to Appwrite database with TRUE parallel writes, get_url_filter() (+14 more)
165
 
166
  ### Community 9 - "Community 9"
167
  Cohesion: 0.08
168
- Nodes (30): # NOTE: 'inshorts' removed — 100% connection-reset failures on HF Spaces (geo-bl, # NOTE: 'wikinews' removed — returns stale 2009-era political articles (0 keywor, NewsProvider, ProviderStatus, Check if this provider is ready to accept a fetch request. Returns Fa, Task 4: Implement exponential backoff for 429 (Too Many Requests). Inst, Call this when the API returns a 429 (Too Many Requests). The status ch, Reset this provider's call counter back to zero. Called once per day (m (+22 more)
169
 
170
  ### Community 10 - "Community 10"
171
- Cohesion: 0.06
172
- Nodes (25): Request model for view count increment, Response model for view count, ViewCountRequest, ViewCountResponse, get_view_count(), increment_view_count(), Increment view count for an article, Get view count for an article (+17 more)
173
 
174
  ### Community 11 - "Community 11"
175
- Cohesion: 0.11
176
- Nodes (14): ProviderCircuitBreaker, Build the Redis key for a provider's circuit state., On server boot, check Redis for any circuit states that were open befor, Write 'circuit:{provider}:state = open' to Redis with a 1-hour TTL. Cal, Delete 'circuit:{provider}:state' from Redis. Called whenever a circuit, Check if provider should be skipped Args: provider: Prov, Record successful request Args: provider: Provider name, Record failed request Args: provider: Provider name (+6 more)
177
 
178
  ### Community 12 - "Community 12"
179
- Cohesion: 0.19
180
- Nodes (13): cache_health_check(), clear_cache(), get_cache_stats(), get_quota_stats(), _get_recommendations(), Cache Monitoring and Metrics API ================================= Provides, Simple health check endpoint for cache connectivity. Returns:, Generate recommendations based on cache performance. (+5 more)
181
 
182
  ### Community 13 - "Community 13"
183
- Cohesion: 0.14
184
- Nodes (18): Live Health Dashboard — Phase 23 What this shows: Instead of a h, root(), cleanup_old_articles(), get_database_stats(), Get Appwrite database statistics (Phase 2) Returns: - Total, Delete articles older than specified days from Appwrite database Args, AudioGenerationRequest, AudioResponse (+10 more)
185
 
186
  ### Community 14 - "Community 14"
187
  Cohesion: 0.10
188
  Nodes (11): get_professional_logger(), IngestionStats, ProfessionalLogger, Professional Logging Module for Segmento Pulse Provides structured logging with, Log scheduler activity, Print comprehensive statistics summary, Get a professional logger instance, Track ingestion pipeline statistics (+3 more)
189
 
190
  ### Community 15 - "Community 15"
191
- Cohesion: 0.12
192
- Nodes (13): AdaptiveScheduler, Update velocity tracking and calculate new interval Args:, Save velocity data to Redis using a non-blocking async HTTP call. Why, Get current interval for a category, Get velocity statistics for all categories, Print velocity summary, Dynamically adjusts fetch intervals based on category activity Tracks, Initialize adaptive scheduler Args: categories: (+5 more)
193
 
194
  ### Community 16 - "Community 16"
195
- Cohesion: 0.17
196
- Nodes (17): Subscription API Routes Handles newsletter subscriptions and unsubscribe functi, Unsubscribe user via email link Supports Granular Unsubscribe (e.g., 'Morni, Unsubscribe via email address (for forms/dashboard) Supports Granular Unsub, Send newsletter to all subscribers (LEGACY ENDPOINT - Use scheduled newsletters, Subscribe a user to the newsletter - Adds subscriber to Appwrite (Sol, send_newsletter(), subscribe(), SubscribeRequest (+9 more)
197
 
198
  ### Community 17 - "Community 17"
199
- Cohesion: 0.18
200
- Nodes (16): alert_high_failure_rate(), alert_quota_exhausted(), alert_zero_articles(), Admin Alerting Service Sends real-time alerts via webhooks (Discord/Slack) for, Alert: Warning - Brevo API quota exhausted, Alert: Error - High email failure rate, Send alert to admin via webhook (Discord/Slack) This converts passive, Alert: Critical - No articles available for newsletter (+8 more)
201
 
202
  ### Community 18 - "Community 18"
203
  Cohesion: 0.14
@@ -208,12 +202,12 @@ Cohesion: 0.14
208
  Nodes (11): estimate_tokens(), Text Chunking Service - Replacing LlamaIndex SentenceSplitter This provides s, Get overlap text from previous chunk Args: chunk, Split text and attach metadata to each chunk Args:, Intelligent text chunker that splits on sentence boundaries Replaces, Rough estimate of token count Args: text: Input text, Initialize SentenceSplitter Args: chunk_size: Ma, Split text into semantic chunks Args: text: Text (+3 more)
209
 
210
  ### Community 20 - "Community 20"
211
- Cohesion: 0.17
212
- Nodes (6): Create a new subscriber in Appwrite (Dual-Write) Uses Boolean Flags sch, Get subscriber by email, Update subscriber preferences, Update specific subscription preference (Granular Unsubscribe), Update global subscription status (Global Unsubscribe), Update lastSentAt timestamp for a subscriber
213
 
214
  ### Community 21 - "Community 21"
215
- Cohesion: 0.12
216
- Nodes (12): get_ingestion_alerts(), get_ingestion_stats(), Get ingestion statistics Returns metrics about news ingestion perform, Check for ingestion alerts Monitors: - High duplicate rate (>90%, get_ingestion_metrics(), IngestionMetrics, Ingestion Statistics Tracking Monitors ingestion performance, duplicate rates,, Get or create global ingestion metrics instance (+4 more)
217
 
218
  ### Community 22 - "Community 22"
219
  Cohesion: 0.13
@@ -228,64 +222,60 @@ Cohesion: 0.12
228
  Nodes (15): comma_separated_to_list(), detect_html(), extract_domain(), list_to_comma_separated(), normalize_url(), Utility Functions for Segmento Pulse Provides common helpers for text processin, Intelligently strip HTML only if HTML tags are detected. This optimiz, Extract domain from URL. Args: url: Full URL (+7 more)
229
 
230
  ### Community 26 - "Community 26"
231
- Cohesion: 0.16
232
- Nodes (12): OpenRSSProvider, AsyncClient, Fetches RSS feeds from dev.to, Hashnode, and GitHub Blog via OpenRSS.org., Fetch articles from all OpenRSS feeds — but only if 60 minutes have pas, Fetch one OpenRSS feed URL and parse its XML into Article objects. Ar, Parse raw XML from an OpenRSS feed into Article objects. Uses feedpar, get_provider_timestamp(), Save a provider's last-fetch timestamp to Redis. Always call this BEFORE (+4 more)
233
 
234
  ### Community 27 - "Community 27"
235
- Cohesion: 0.07
236
- Nodes (20): Article, Parse datetime from various formats including RFC 2822 (RSS feeds), Fetch news from ALL available sources for a category. Strategy (Phase, Fetch news specifically from a named provider (bypassing priority/failover), Fetch RSS from cloud providers, Search news articles using hybrid approach Currently uses Google News R, Parse GNews API response, Parse NewsAPI response (+12 more)
237
 
238
  ### Community 28 - "Community 28"
239
- Cohesion: 0.14
240
- Nodes (13): process_category(), News Processor Service Handles the heavy lifting of fetching, validating, and s, Core logic: Fetch -> Validate -> Save -> Update Adaptive Interval, Upstash Redis Cache Service (REST API) ======================================, Worker Manager Service Consumer process that pulls categories from Redis and ex, # NOTE: Do NOT create a new NewsAggregator here., AlignedColorFormatter, get_logger() (+5 more)
241
 
242
  ### Community 29 - "Community 29"
243
- Cohesion: 0.08
244
- Nodes (35): get_adaptive_scheduler(), Adaptive Scheduler for Dynamic Category Fetching Automatically adjusts fetch, # NOTE: We no longer call _save_velocity_data() here., Get or create adaptive scheduler instance, background_image_enricher_job(), cleanup_old_news(), enrich_missing_images_in_batch(), fetch_and_validate_category() (+27 more)
245
 
246
  ### Community 31 - "Community 31"
247
- Cohesion: 0.21
248
- Nodes (14): dislike_article(), EngagementRequest, get_article_stats(), like_article(), Engagement API Endpoints Handles article likes, views tracking, and trending ar, Increment like count for an article., Increment dislike count with Upsert logic., Increment view count with Upsert logic. (+6 more)
249
 
250
  ### Community 32 - "Community 32"
251
- Cohesion: 0.08
252
- Nodes (29): health_check(), lifespan(), Enhanced health check endpoint with scheduler status Used by external monit, Application lifespan manager Handles startup and shutdown events for, get_scheduler_status(), preview_newsletter_content(), Manually trigger the cleanup job (Phase 3) Deletes articles older tha, Get background scheduler status and job information Returns: (+21 more)
253
-
254
- ### Community 33 - "Community 33"
255
- Cohesion: 0.15
256
- Nodes (5): Appwrite Database Service - Phase 2 Provides persistent storage for news articl, Future-Proofing Wrapper (Migration Phase) Wraps legacy 'documents' API into, # NOTE: Cloud collection DOES accept 'published_at' (snake_case), TablesDBWrapper, Optimized Retrieval Service - UI Performance Enhancement ======================
257
 
258
  ### Community 34 - "Community 34"
259
- Cohesion: 0.17
260
- Nodes (8): OptimizedRetrieval, Fetch articles from Appwrite with ONLY the fields needed for list view., Get full article details for article view page. Includes ALL fields (de, Background task to refresh cache (SWR pattern)., Determine which Appwrite collection to query. CRITICAL: Must, Invalidate cache for a specific category (call after new articles added)., Optimized article retrieval with multi-tier caching and field projection., Get articles optimized for list view (projected fields only).
261
 
262
  ### Community 38 - "Community 38"
263
- Cohesion: 0.18
264
- Nodes (7): APIQuotaTracker, Get current quota usage statistics, Track API usage and enforce rate limits, Check if we can still call this paid provider today. Reads the curren, Record that we just used one API credit for this provider. Writes to, Check if approaching rate limits, Check if an API call can be made without exceeding quotas
265
 
266
  ### Community 39 - "Community 39"
267
  Cohesion: 0.21
268
  Nodes (8): HackerNewsProvider, AsyncClient, Step 1: Ask Hacker News for the IDs of its top stories. Returns a lis, Step 2 (single unit): Fetch the details for one Hacker News story. Ar, Convert raw Hacker News JSON items into Segmento Pulse Article objects., For every article that has an empty image_url, visit its URL and try to, Fetches top stories from the Hacker News API. No API key needed. No rate, Fetch the top stories from Hacker News. Args: category (
269
 
270
  ### Community 40 - "Community 40"
271
- Cohesion: 0.12
272
- Nodes (10): AppwriteDatabase, Any, Appwrite Database service for persistent article storage (L2 cache), Initialize Appwrite client and database connection, Generate a unique hash for an article URL. **INTEGRATION UPDATE**: Ma, Generic list_rows wrapper for any table, Generic delete_row wrapper for any table, Generic update_row wrapper for any table (+2 more)
273
 
274
  ### Community 41 - "Community 41"
275
- Cohesion: 0.19
276
- Nodes (7): clear_cache(), Clear all cached news data Useful for testing or forcing a fresh data, CacheService, Set cached articles with TTL, Unified Cache Service Delegates to Upstash (if enabled) or Local Redis (if, Connect to Redis (if using local redis), Get cached articles by key
277
 
278
  ### Community 43 - "Community 43"
279
- Cohesion: 0.25
280
  Nodes (6): API Endpoints, Configuration, Features, Local Development, SegmentoPulse Backend API, Usage
281
 
282
  ### Community 44 - "Community 44"
283
- Cohesion: 0.12
284
- Nodes (12): get_subscriber_analytics(), Get subscriber distribution by preference from Appwrite Shows how man, get_popular_cloud_articles(), get_trending_articles(), Get trending articles based on views and likes. Phase 3: Discover pop, Get popular cloud articles, optionally filtered by provider. Phase 3:, Get all subscribers (Source of Truth) Used by admin analytics., Get database statistics Returns: Dictionary with (+4 more)
285
 
286
  ### Community 45 - "Community 45"
287
  Cohesion: 0.33
288
- Nodes (3): Phase 4: Strict Routing Algorithm (Vertical Architecture), Get articles by category with pagination and projection (FAANG-Level), Get articles with custom query filters (for cursor pagination)
289
 
290
  ### Community 46 - "Community 46"
291
  Cohesion: 0.22
@@ -307,10 +297,6 @@ Nodes (6): AudioService, Synchronous wrapper for Groq API, Generate a concise au
307
  Cohesion: 0.23
308
  Nodes (7): AsyncClient, Fetches technology news from Wikinews using the MediaWiki search API. Fre, Fetch tech articles from Wikinews's Computing and Internet categories., Run one MediaWiki search query for articles in a given Wikinews category., Convert MediaWiki search result items into Segmento Pulse Article objects., For every article that has an empty image_url, visit its Wikinews curid, WikinewsProvider
309
 
310
- ### Community 53 - "Community 53"
311
- Cohesion: 0.12
312
- Nodes (17): get_cache_stats(), populate_database(), Start a background cache-warm job for all categories. Fix 2: The old vers, Populate Appwrite database by fetching fresh articles for all categories, Manually trigger the news fetch job (Phase 3) Useful for: - Test, The actual cache-warming work — runs in the background so the HTTP request, Get cache statistics Returns information about: - Which cate, trigger_fetch_job() (+9 more)
313
-
314
  ### Community 54 - "Community 54"
315
  Cohesion: 0.20
316
  Nodes (4): BrowserManager, Initialize the global browser instance, Gracefully close the global browser instance, Fetch dynamic content using a fresh context from the shared browser. Co
@@ -320,16 +306,16 @@ Cohesion: 0.50
320
  Nodes (3): Parse comma-separated string into list (for HF Spaces secrets), Settings, BaseSettings
321
 
322
  ### Community 57 - "Community 57"
323
- Cohesion: 0.24
324
- Nodes (6): Fetch news from GNews API. Why no 'from'/'to' date filter here?, Fetch news from NewsAPI. Phase 20 upgrade: The query string is now bu, Fetch news from NewsData.io, Parse NewsData.io response, build_dynamic_query(), Build a query string for the given category using the Anchor + Round-Robin
325
 
326
  ### Community 58 - "Community 58"
327
  Cohesion: 0.22
328
  Nodes (5): Extract XML tag content, Remove HTML tags and decode entities, Parse Google News RSS feed with advanced XML parsing, Extract image from multiple XML sources with fallbacks, Clean Google News description - they typically only contain links, not actual co
329
 
330
  ### Community 62 - "Community 62"
331
- Cohesion: 0.31
332
- Nodes (8): is_url_seen_or_mark(), Redis URL Deduplication Bouncer ================================ This is the, Check if we have seen this article URL in the last 48 hours. If we have NOT, canonicalize_url(), get_url_hash(), URL Canonicalization for Better Deduplication Normalizes URLs before hashing, Generate hash from canonical URL Args: url: Original URL, Normalize URL for better deduplication Args: url: Original U
333
 
334
  ### Community 63 - "Community 63"
335
  Cohesion: 0.31
@@ -343,10 +329,6 @@ Nodes (5): InshortsProvider, Fetch technology articles from the Inshorts communi
343
  Cohesion: 0.28
344
  Nodes (8): apply_engagement_boost(), apply_time_decay(), filter_by_recency(), Any, Ranking Utilities - Time Decay & Relevance ====================================, Filter out articles older than max_hours. Args: results: Lis, Apply time decay ranking to search results. Formula: Final Score = (1, Boost articles with high engagement (likes, views). Formula: Engageme
345
 
346
- ### Community 79 - "Community 79"
347
- Cohesion: 0.29
348
- Nodes (3): The Reaper: Scans the processing queue for tasks that timed out. If a w, Lazy-load the shared aggregator singleton from scheduler., WorkerManager
349
-
350
  ### Community 80 - "Community 80"
351
  Cohesion: 0.33
352
  Nodes (4): Fetches global technology news from WorldNewsAI.com. Paid provider (point, Fetch global technology news from WorldNewsAI. Args: cat, Convert WorldNewsAI JSON items into Segmento Pulse Article objects. K, WorldNewsAIProvider
@@ -360,40 +342,28 @@ Cohesion: 0.33
360
  Nodes (6): extract_top_image(), _fetch_and_extract(), app/services/utils/image_enricher.py ──────────────────────────────────────────, Internal helper: download the HTML and pull out the og:image tag. Separat, # NOTE: We pass only the first 10,000 characters to avoid processing huge, Visit an article URL and extract its main (top) image. Looks for the imag
361
 
362
  ### Community 83 - "Community 83"
363
- Cohesion: 0.33
364
- Nodes (5): parse_date_to_iso(), Date Parsing and Normalization Utility FAANG-Level Quality Control for Publishe, Validate that a date string is in strict ISO-8601 UTC format Expected, Parse any date format and convert to strict ISO-8601 UTC Handles:, validate_date_format()
365
-
366
- ### Community 84 - "Community 84"
367
- Cohesion: 0.33
368
- Nodes (5): generate_article_id_uuid(), Article ID Generation Utilities ================================ Generates A, Generate Appwrite-compatible UUID from URL Alternative method using U, Validate that document ID meets Appwrite requirements Appwrite docume, validate_appwrite_id()
369
-
370
- ### Community 85 - "Community 85"
371
- Cohesion: 0.50
372
- Nodes (4): Response model for search endpoints, SearchResponse, Search news articles by keyword (Direct Aggregation), search_news()
373
-
374
- ### Community 86 - "Community 86"
375
- Cohesion: 0.50
376
- Nodes (3): get_quota_tracker(), API Quota Tracking Service Monitors API usage and prevents hitting rate limits, Get or create global quota tracker instance
377
 
378
  ## Knowledge Gaps
379
- - **37 isolated node(s):** `graphify`, `Workflow: graphify`, `Features`, `API Endpoints`, `Configuration` (+32 more)
380
  These have ≤1 connection - possible missing edges or undocumented components.
381
  - **35 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
382
 
383
  ## Suggested Questions
384
  _Questions this graph is uniquely positioned to answer:_
385
 
386
- - **Why does `Article` connect `Community 27` to `Community 4`, `Community 9`, `Community 16`, `Community 24`, `Community 26`, `Community 28`, `Community 29`, `Community 32`, `Community 33`, `Community 39`, `Community 40`, `Community 41`, `Community 52`, `Community 57`, `Community 58`, `Community 63`, `Community 77`, `Community 80`, `Community 81`?**
387
- _High betweenness centrality (0.181) - this node is a cross-community bridge._
388
- - **Why does `get_appwrite_db()` connect `Community 13` to `Community 32`, `Community 1`, `Community 33`, `Community 34`, `Community 8`, `Community 40`, `Community 44`, `Community 46`, `Community 16`, `Community 17`, `Community 51`, `Community 53`, `Community 87`, `Community 88`, `Community 28`, `Community 29`, `Community 31`?**
389
- _High betweenness centrality (0.097) - this node is a cross-community bridge._
390
- - **Why does `get_upstash_cache()` connect `Community 12` to `Community 32`, `Community 1`, `Community 2`, `Community 38`, `Community 41`, `Community 9`, `Community 11`, `Community 79`, `Community 53`, `Community 86`, `Community 26`, `Community 28`, `Community 29`, `Community 62`?**
391
- _High betweenness centrality (0.087) - this node is a cross-community bridge._
392
  - **Are the 26 inferred relationships involving `Article` (e.g. with `AppwriteDatabase` and `TablesDBWrapper`) actually correct?**
393
  _`Article` has 26 INFERRED edges - model-reasoned connections that need verification._
394
  - **Are the 12 inferred relationships involving `RSSParser` (e.g. with `NewsAggregator` and `GNewsProvider`) actually correct?**
395
  _`RSSParser` has 12 INFERRED edges - model-reasoned connections that need verification._
396
  - **What connects `Segmento Pulse Backend API FastAPI application for real-time technology news ag`, `Parse comma-separated string into list (for HF Spaces secrets)`, `Application lifespan manager Handles startup and shutdown events for` to the rest of the system?**
397
- _475 weakly-connected nodes found - possible documentation gaps or missing edges._
398
- - **Should `Community 0` be split into smaller, more focused modules?**
399
- _Cohesion score 0.1323529411764706 - nodes in this community are weakly interconnected._
 
1
+ # Graph Report - backend (2026-08-24)
2
 
3
  ## Corpus Check
4
+ - 87 files · ~74,093 words
5
  - Verdict: corpus is large enough that graph structure adds value.
6
 
7
  ## Summary
8
+ - 1093 nodes · 1800 edges · 130 communities (95 shown, 35 thin omitted)
9
+ - Extraction: 96% EXTRACTED · 4% INFERRED · 0% AMBIGUOUS · INFERRED: 79 edges (avg confidence: 0.53)
10
  - Token cost: 0 input · 0 output
11
 
12
  ## Graph Freshness
13
+ - Built from commit: `f7d7d04d`
14
  - Run `git rev-parse HEAD` and compare to check if the graph is stale.
15
  - Run `graphify update .` after code changes (no API cost).
16
 
 
72
  - [[_COMMUNITY_Community 63|Community 63]]
73
  - [[_COMMUNITY_Community 77|Community 77]]
74
  - [[_COMMUNITY_Community 78|Community 78]]
 
75
  - [[_COMMUNITY_Community 80|Community 80]]
76
  - [[_COMMUNITY_Community 81|Community 81]]
77
  - [[_COMMUNITY_Community 82|Community 82]]
78
  - [[_COMMUNITY_Community 83|Community 83]]
 
 
 
 
 
79
  - [[_COMMUNITY_Community 89|Community 89]]
80
  - [[_COMMUNITY_Community 92|Community 92]]
81
  - [[_COMMUNITY_Community 94|Community 94]]
 
117
  10. `NewsProvider` - 19 edges
118
 
119
  ## Surprising Connections (you probably didn't know these)
120
+ - `TestNewsProcessorMetrics` --uses--> `IngestionMetrics` [INFERRED]
121
+ tests/test_quality_rescue.py → app/services/ingestion_metrics.py
122
+ - `TestQualityScoreRescue` --uses--> `IngestionMetrics` [INFERRED]
123
+ tests/test_quality_rescue.py → app/services/ingestion_metrics.py
124
+ - `TestIngestionMetrics` --uses--> `IngestionMetrics` [INFERRED]
125
+ tests/test_quality_rescue.py → app/services/ingestion_metrics.py
126
  - `AppwriteDatabase` --uses--> `Article` [INFERRED]
127
  app/services/appwrite_db.py → app/models.py
128
  - `TablesDBWrapper` --uses--> `Article` [INFERRED]
129
  app/services/appwrite_db.py → app/models.py
 
 
 
 
 
 
130
 
131
  ## Import Cycles
132
  - None detected.
133
 
134
+ ## Communities (130 total, 35 thin omitted)
135
 
136
  ### Community 0 - "Community 0"
137
+ Cohesion: 0.22
138
+ Nodes (10): _build_category_regex(), calculate_quality_score(), generate_slug(), Data Validation and Sanitization Layer FAANG-Level Quality Control for News Art, Clean and normalize article data HOTFIX: Now handles both Pydantic Ar, Generate URL-friendly slug from title Example: "Google Announces New, Score article quality from 0-100 Higher scores = better quality artic, # NOTE: 'cloud-computing' is kept here because it is an active category in (+2 more)
139
 
140
  ### Community 1 - "Community 1"
141
  Cohesion: 0.12
142
+ Nodes (14): NewsResponse, Response model for news endpoints, get_news_by_category(), get_rss_feed(), get_umbrella_news(), Get news articles by category with cursor pagination and stale-while-revalidate, Aggregation endpoint for umbrella categories (data, cloud, latest-articles)., Get RSS feed from cloud providers Providers: aws, gcp, azure, ibm, or (+6 more)
143
 
144
  ### Community 2 - "Community 2"
145
  Cohesion: 0.08
146
  Nodes (20): _DatetimeEncoder, Any, Execute Redis command via REST API. WARN-002 fixed: was using blockin, Get value from cache Args: key: Cache key, Set value in cache with TTL Args: key: Cache key, Delete key from cache Args: key: Cache key to de, JSON encoder that converts datetime/date objects to ISO-8601 strings. Preve, Push an item to the left of a Redis list (Producer action) Ar (+12 more)
147
 
148
  ### Community 4 - "Community 4"
149
+ Cohesion: 0.09
150
+ Nodes (27): NewsAggregator, # NOTE: 'inshorts' removed — 100% connection-reset failures on HF Spaces (geo-bl, # NOTE: 'wikinews' removed — returns stale 2009-era political articles (0 keywor, Service for aggregating news from multiple sources with automatic failover, Get usage statistics for monitoring, GNewsProvider, GoogleNewsRSSProvider, NewsAPIProvider (+19 more)
151
 
152
  ### Community 6 - "Community 6"
153
+ Cohesion: 0.27
154
+ Nodes (6): AsyncClient, Fetch tech headlines from the India and US static JSON files. Both fi, Download one regional JSON file and parse its articles. Args:, Convert raw NewsAPI-format JSON items into Segmento Pulse Article objects., Reads top tech headlines from two static JSON files on GitHub Pages. Cove, SauravKanchanProvider
155
 
156
  ### Community 8 - "Community 8"
157
+ Cohesion: 0.11
158
+ Nodes (13): URL Deduplication Service using Scalable Bloom Filter =========================, Create a new scalable bloom filter, Check if URL is new and add it to the filter Args:, Persist Scalable Bloom Filter to disk using pickle, Get deduplication statistics, Print deduplication statistics, Reset the filter (use with caution), Estimate current memory usage Note: ScalableBloomFilter memor (+5 more)
159
 
160
  ### Community 9 - "Community 9"
161
  Cohesion: 0.08
162
+ Nodes (28): ABC, NewsProvider, ProviderStatus, Check if this provider is ready to accept a fetch request. Returns Fa, Task 4: Implement exponential backoff for 429 (Too Many Requests). Inst, Call this when the API returns a 429 (Too Many Requests). The status ch, Reset this provider's call counter back to zero. Called once per day (m, Represents the health of a provider at any given moment. ACTIVE → P (+20 more)
163
 
164
  ### Community 10 - "Community 10"
165
+ Cohesion: 0.08
166
+ Nodes (14): FirebaseService, Increment view count for an article, Get view count for an article, Firebase Realtime Database service for analytics (optional), Add or Update subscriber in database Now supports merging 'subscription, Get subscriber by email, Get subscriber by unsubscribe token, Initialize Firebase Admin SDK (+6 more)
167
 
168
  ### Community 11 - "Community 11"
169
+ Cohesion: 0.07
170
+ Nodes (24): CircuitState, get_circuit_breaker(), ProviderCircuitBreaker, Provider Circuit Breaker ======================== Prevents wasting time/band, # NOTE: We deliberately do NOT try to load Redis state here., Build the Redis key for a provider's circuit state., On server boot, check Redis for any circuit states that were open befor, Write 'circuit:{provider}:state = open' to Redis with a 1-hour TTL. Cal (+16 more)
171
 
172
  ### Community 12 - "Community 12"
173
+ Cohesion: 0.15
174
+ Nodes (15): cache_health_check(), clear_cache(), get_cache_stats(), get_ingestion_alerts(), get_ingestion_stats(), _get_recommendations(), Cache Monitoring and Metrics API ================================= Provides, Simple health check endpoint for cache connectivity. Returns: (+7 more)
175
 
176
  ### Community 13 - "Community 13"
177
+ Cohesion: 0.31
178
+ Nodes (4): is_relevant_to_category(), Check whether an article belongs to the given category. Uses pre-compiled, TestNewsProcessorMetrics, TestQualityScoreRescue
179
 
180
  ### Community 14 - "Community 14"
181
  Cohesion: 0.10
182
  Nodes (11): get_professional_logger(), IngestionStats, ProfessionalLogger, Professional Logging Module for Segmento Pulse Provides structured logging with, Log scheduler activity, Print comprehensive statistics summary, Get a professional logger instance, Track ingestion pipeline statistics (+3 more)
183
 
184
  ### Community 15 - "Community 15"
185
+ Cohesion: 0.11
186
+ Nodes (15): AdaptiveScheduler, Adaptive Scheduler for Dynamic Category Fetching Automatically adjusts fetch, Update velocity tracking and calculate new interval Args:, # NOTE: We no longer call _save_velocity_data() here., Save velocity data to Redis using a non-blocking async HTTP call. Why, Get current interval for a category, Get velocity statistics for all categories, Print velocity summary (+7 more)
187
 
188
  ### Community 16 - "Community 16"
189
+ Cohesion: 0.07
190
+ Nodes (38): ErrorResponse, Request model for view count increment, Response model for view count, ViewCountRequest, ViewCountResponse, get_view_count(), increment_view_count(), Increment view count for an article (+30 more)
191
 
192
  ### Community 17 - "Community 17"
193
+ Cohesion: 0.10
194
+ Nodes (26): get_research_paper(), Get a single research paper by ID., alert_high_failure_rate(), alert_quota_exhausted(), alert_zero_articles(), Admin Alerting Service Sends real-time alerts via webhooks (Discord/Slack) for, Alert: Warning - Brevo API quota exhausted, Alert: Error - High email failure rate (+18 more)
195
 
196
  ### Community 18 - "Community 18"
197
  Cohesion: 0.14
 
202
  Nodes (11): estimate_tokens(), Text Chunking Service - Replacing LlamaIndex SentenceSplitter This provides s, Get overlap text from previous chunk Args: chunk, Split text and attach metadata to each chunk Args:, Intelligent text chunker that splits on sentence boundaries Replaces, Rough estimate of token count Args: text: Input text, Initialize SentenceSplitter Args: chunk_size: Ma, Split text into semantic chunks Args: text: Text (+3 more)
203
 
204
  ### Community 20 - "Community 20"
205
+ Cohesion: 0.22
206
+ Nodes (8): Further Notes, Implementation Decisions, Out of Scope, Problem Statement, Solution, Spec: Quality-Score Rescue Reduce Wrongful Article Rejections, Testing Decisions, User Stories
207
 
208
  ### Community 21 - "Community 21"
209
+ Cohesion: 0.17
210
+ Nodes (7): IngestionMetrics, Ingestion Statistics Tracking Monitors ingestion performance, duplicate rates,, Track ingestion metrics over time, Record metrics from an ingestion run, Get current ingestion statistics, Check if any metrics exceed thresholds, TestIngestionMetrics
211
 
212
  ### Community 22 - "Community 22"
213
  Cohesion: 0.13
 
222
  Nodes (15): comma_separated_to_list(), detect_html(), extract_domain(), list_to_comma_separated(), normalize_url(), Utility Functions for Segmento Pulse Provides common helpers for text processin, Intelligently strip HTML only if HTML tags are detected. This optimiz, Extract domain from URL. Args: url: Full URL (+7 more)
223
 
224
  ### Community 26 - "Community 26"
225
+ Cohesion: 0.18
226
+ Nodes (10): AsyncClient, Fetch articles from all OpenRSS feeds — but only if 60 minutes have pas, Fetch one OpenRSS feed URL and parse its XML into Article objects. Ar, Parse raw XML from an OpenRSS feed into Article objects. Uses feedpar, get_provider_timestamp(), Save a provider's last-fetch timestamp to Redis. Always call this BEFORE, Build the Redis key string for a provider's last-fetch timestamp. Example, Read the last-fetch timestamp for a provider from Redis. Returns a Unix t (+2 more)
227
 
228
  ### Community 27 - "Community 27"
229
+ Cohesion: 0.08
230
+ Nodes (16): Article, Parse datetime from various formats including RFC 2822 (RSS feeds), Fetch news from ALL available sources for a category. Strategy (Phase, Fetch news specifically from a named provider (bypassing priority/failover), Fetch RSS from cloud providers, Search news articles using hybrid approach Currently uses Google News R, Parse GNews API response, Parse NewsAPI response (+8 more)
231
 
232
  ### Community 28 - "Community 28"
233
+ Cohesion: 0.09
234
+ Nodes (23): get_adaptive_scheduler(), Get or create adaptive scheduler instance, Cache Service using Redis Provides caching layer to reduce external API calls w, process_category(), News Processor Service Handles the heavy lifting of fetching, validating, and s, Core logic: Fetch -> Validate -> Save -> Update Adaptive Interval, # NOTE: fetched_approx excludes Redis-dedup volume (not returned by, get_upstash_cache() (+15 more)
235
 
236
  ### Community 29 - "Community 29"
237
+ Cohesion: 0.09
238
+ Nodes (29): health_check(), lifespan(), Live Health Dashboard Phase 23 What this shows: Instead of a h, Enhanced health check endpoint with scheduler status Used by external monit, Application lifespan manager Handles startup and shutdown events for, root(), get_provider_stats(), Get statistics about news provider usage and health Returns informati (+21 more)
239
 
240
  ### Community 31 - "Community 31"
241
+ Cohesion: 0.12
242
+ Nodes (25): dislike_article(), EngagementRequest, get_article_stats(), get_popular_cloud_articles(), get_trending_articles(), like_article(), Engagement API Endpoints Handles article likes, views tracking, and trending ar, Increment like count for an article. (+17 more)
243
 
244
  ### Community 32 - "Community 32"
245
+ Cohesion: 0.07
246
+ Nodes (35): bloom_filter_health_check(), cleanup_old_articles(), get_bloom_filter_stats(), get_database_stats(), get_scheduler_status(), get_subscriber_analytics(), populate_database(), preview_newsletter_content() (+27 more)
 
 
 
 
247
 
248
  ### Community 34 - "Community 34"
249
+ Cohesion: 0.06
250
+ Nodes (26): Response model for search endpoints, SearchResponse, clear_cache(), get_cache_stats(), Clear all cached news data Useful for testing or forcing a fresh data, Start a background cache-warm job for all categories. Fix 2: The old vers, The actual cache-warming work runs in the background so the HTTP request, Get cache statistics Returns information about: - Which cate (+18 more)
251
 
252
  ### Community 38 - "Community 38"
253
+ Cohesion: 0.12
254
+ Nodes (12): get_quota_stats(), Get API quota usage statistics Tracks usage for: - GNews API (10, APIQuotaTracker, get_quota_tracker(), API Quota Tracking Service Monitors API usage and prevents hitting rate limits, Get current quota usage statistics, Track API usage and enforce rate limits, Check if we can still call this paid provider today. Reads the curren (+4 more)
255
 
256
  ### Community 39 - "Community 39"
257
  Cohesion: 0.21
258
  Nodes (8): HackerNewsProvider, AsyncClient, Step 1: Ask Hacker News for the IDs of its top stories. Returns a lis, Step 2 (single unit): Fetch the details for one Hacker News story. Ar, Convert raw Hacker News JSON items into Segmento Pulse Article objects., For every article that has an empty image_url, visit its URL and try to, Fetches top stories from the Hacker News API. No API key needed. No rate, Fetch the top stories from Hacker News. Args: category (
259
 
260
  ### Community 40 - "Community 40"
261
+ Cohesion: 0.05
262
+ Nodes (24): AppwriteDatabase, Any, Get all subscribers (Source of Truth) Used by admin analytics., Get database statistics Returns: Dictionary with, Appwrite Database service for persistent article storage (L2 cache), Initialize Appwrite client and database connection, Phase 4: Strict Routing Algorithm (Vertical Architecture), Generate a unique hash for an article URL. **INTEGRATION UPDATE**: Ma (+16 more)
263
 
264
  ### Community 41 - "Community 41"
265
+ Cohesion: 0.29
266
+ Nodes (6): Final verification checklist (run after all tickets complete), Ticket 0 pytest harness setup, Ticket 1 `QUALITY_RESCUE_THRESHOLD` constant + rescue path in `is_relevant_to_category()`, Ticket 2 `irrelevant_count` tracking in `IngestionMetrics` (with `_approx` naming), Ticket 3 Wire `irrelevant_count` through `news_processor.py` into `record_run()`, Tickets: Quality-Score Rescue
267
 
268
  ### Community 43 - "Community 43"
269
+ Cohesion: 0.29
270
  Nodes (6): API Endpoints, Configuration, Features, Local Development, SegmentoPulse Backend API, Usage
271
 
272
  ### Community 44 - "Community 44"
273
+ Cohesion: 0.33
274
+ Nodes (6): Manually trigger the cleanup job (Phase 3) Deletes articles older tha, trigger_cleanup_job(), cleanup_old_news(), Background Job: Delete articles older than 48 hours from ALL collections, Manually trigger cleanup, trigger_cleanup_now()
275
 
276
  ### Community 45 - "Community 45"
277
  Cohesion: 0.33
278
+ Nodes (5): _chunk_list(), _format_for_api(), Query Builder Utility (Phase 20 Dynamic Round-Robin Query Builder) =========, Splits a flat list into groups of `size`. Example: _chunk_list([, Converts a list of keywords into the query string format a specific API expects.
279
 
280
  ### Community 46 - "Community 46"
281
  Cohesion: 0.22
 
297
  Cohesion: 0.23
298
  Nodes (7): AsyncClient, Fetches technology news from Wikinews using the MediaWiki search API. Fre, Fetch tech articles from Wikinews's Computing and Internet categories., Run one MediaWiki search query for articles in a given Wikinews category., Convert MediaWiki search result items into Segmento Pulse Article objects., For every article that has an empty image_url, visit its Wikinews curid, WikinewsProvider
299
 
 
 
 
 
300
  ### Community 54 - "Community 54"
301
  Cohesion: 0.20
302
  Nodes (4): BrowserManager, Initialize the global browser instance, Gracefully close the global browser instance, Fetch dynamic content using a fresh context from the shared browser. Co
 
306
  Nodes (3): Parse comma-separated string into list (for HF Spaces secrets), Settings, BaseSettings
307
 
308
  ### Community 57 - "Community 57"
309
+ Cohesion: 0.19
310
+ Nodes (8): Fetch news from GNews API. Why no 'from'/'to' date filter here?, Fetch news from NewsAPI. Phase 20 upgrade: The query string is now bu, Fetch news from NewsData.io, Parse NewsData.io response, Implement exponential backoff for 429 Too Many Requests, Fetch news from Google News RSS, build_dynamic_query(), Build a query string for the given category using the Anchor + Round-Robin
311
 
312
  ### Community 58 - "Community 58"
313
  Cohesion: 0.22
314
  Nodes (5): Extract XML tag content, Remove HTML tags and decode entities, Parse Google News RSS feed with advanced XML parsing, Extract image from multiple XML sources with fallbacks, Clean Google News description - they typically only contain links, not actual co
315
 
316
  ### Community 62 - "Community 62"
317
+ Cohesion: 0.19
318
+ Nodes (13): fetch_and_validate_category(), Fetch and validate articles for a single category. Args: categor, is_valid_article(), Validate article data quality before database insertion HOTFIX: Now h, is_url_seen_or_mark(), Redis URL Deduplication Bouncer ================================ This is the, Check if we have seen this article URL in the last 48 hours. If we have NOT, canonicalize_url() (+5 more)
319
 
320
  ### Community 63 - "Community 63"
321
  Cohesion: 0.31
 
329
  Cohesion: 0.28
330
  Nodes (8): apply_engagement_boost(), apply_time_decay(), filter_by_recency(), Any, Ranking Utilities - Time Decay & Relevance ====================================, Filter out articles older than max_hours. Args: results: Lis, Apply time decay ranking to search results. Formula: Final Score = (1, Boost articles with high engagement (likes, views). Formula: Engageme
331
 
 
 
 
 
332
  ### Community 80 - "Community 80"
333
  Cohesion: 0.33
334
  Nodes (4): Fetches global technology news from WorldNewsAI.com. Paid provider (point, Fetch global technology news from WorldNewsAI. Args: cat, Convert WorldNewsAI JSON items into Segmento Pulse Article objects. K, WorldNewsAIProvider
 
342
  Nodes (6): extract_top_image(), _fetch_and_extract(), app/services/utils/image_enricher.py ──────────────────────────────────────────, Internal helper: download the HTML and pull out the og:image tag. Separat, # NOTE: We pass only the first 10,000 characters to avoid processing huge, Visit an article URL and extract its main (top) image. Looks for the imag
343
 
344
  ### Community 83 - "Community 83"
345
+ Cohesion: 0.29
346
+ Nodes (7): normalize_article_date(), parse_date_to_iso(), Date Parsing and Normalization Utility FAANG-Level Quality Control for Publishe, Validate that a date string is in strict ISO-8601 UTC format Expected, Parse any date format and convert to strict ISO-8601 UTC Handles:, Normalize the publishedAt field in an article HOTFIX (2026-01-23): No, validate_date_format()
 
 
 
 
 
 
 
 
 
 
 
 
347
 
348
  ## Knowledge Gaps
349
+ - **50 isolated node(s):** `graphify`, `Workflow: graphify`, `Features`, `API Endpoints`, `Configuration` (+45 more)
350
  These have ≤1 connection - possible missing edges or undocumented components.
351
  - **35 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
352
 
353
  ## Suggested Questions
354
  _Questions this graph is uniquely positioned to answer:_
355
 
356
+ - **Why does `Article` connect `Community 27` to `Community 4`, `Community 6`, `Community 9`, `Community 16`, `Community 17`, `Community 24`, `Community 26`, `Community 28`, `Community 29`, `Community 33`, `Community 34`, `Community 39`, `Community 40`, `Community 52`, `Community 57`, `Community 58`, `Community 62`, `Community 63`, `Community 77`, `Community 80`, `Community 81`?**
357
+ _High betweenness centrality (0.193) - this node is a cross-community bridge._
358
+ - **Why does `get_appwrite_db()` connect `Community 17` to `Community 32`, `Community 34`, `Community 40`, `Community 44`, `Community 46`, `Community 16`, `Community 51`, `Community 28`, `Community 29`, `Community 31`?**
359
+ _High betweenness centrality (0.096) - this node is a cross-community bridge._
360
+ - **Why does `get_upstash_cache()` connect `Community 28` to `Community 32`, `Community 34`, `Community 2`, `Community 38`, `Community 9`, `Community 11`, `Community 12`, `Community 26`, `Community 29`, `Community 62`?**
361
+ _High betweenness centrality (0.077) - this node is a cross-community bridge._
362
  - **Are the 26 inferred relationships involving `Article` (e.g. with `AppwriteDatabase` and `TablesDBWrapper`) actually correct?**
363
  _`Article` has 26 INFERRED edges - model-reasoned connections that need verification._
364
  - **Are the 12 inferred relationships involving `RSSParser` (e.g. with `NewsAggregator` and `GNewsProvider`) actually correct?**
365
  _`RSSParser` has 12 INFERRED edges - model-reasoned connections that need verification._
366
  - **What connects `Segmento Pulse Backend API FastAPI application for real-time technology news ag`, `Parse comma-separated string into list (for HF Spaces secrets)`, `Application lifespan manager Handles startup and shutdown events for` to the rest of the system?**
367
+ _489 weakly-connected nodes found - possible documentation gaps or missing edges._
368
+ - **Should `Community 1` be split into smaller, more focused modules?**
369
+ _Cohesion score 0.12418300653594772 - nodes in this community are weakly interconnected._
graphify-out/2026-08-24/graph.json CHANGED
The diff for this file is too large to render. See raw diff
 
graphify-out/2026-08-24/manifest.json CHANGED
@@ -140,9 +140,9 @@
140
  "semantic_hash": "9aed768ac1ab1b097db8c3495e4accde"
141
  },
142
  "app/services/ingestion_metrics.py": {
143
- "mtime": 1781514962.4688468,
144
- "ast_hash": "019cc2aba22e4c9d1a32bdf1f2029fc7",
145
- "semantic_hash": "019cc2aba22e4c9d1a32bdf1f2029fc7"
146
  },
147
  "app/services/news_aggregator.py": {
148
  "mtime": 1781514962.4688468,
@@ -150,9 +150,9 @@
150
  "semantic_hash": "b7a259c6252f6477c6bdb1c14b76c70d"
151
  },
152
  "app/services/news_processor.py": {
153
- "mtime": 1781514962.4703689,
154
- "ast_hash": "ed1e7813d7bbc2bb67b7feffa7c97855",
155
- "semantic_hash": "ed1e7813d7bbc2bb67b7feffa7c97855"
156
  },
157
  "app/services/news_providers.py": {
158
  "mtime": 1781514962.4703689,
@@ -335,9 +335,9 @@
335
  "semantic_hash": "86f0e38b40cd9a4e2d526085d1713194"
336
  },
337
  "app/utils/data_validation.py": {
338
- "mtime": 1781523682.7687106,
339
- "ast_hash": "2a4beecfcac95fc07ccc0c12a09f2cd3",
340
- "semantic_hash": "2a4beecfcac95fc07ccc0c12a09f2cd3"
341
  },
342
  "app/utils/date_parser.py": {
343
  "mtime": 1781514962.5117342,
@@ -413,5 +413,35 @@
413
  "mtime": 1781514962.608238,
414
  "ast_hash": "c6d261f13470968633d01d75c69bccd5",
415
  "semantic_hash": "c6d261f13470968633d01d75c69bccd5"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
416
  }
417
  }
 
140
  "semantic_hash": "9aed768ac1ab1b097db8c3495e4accde"
141
  },
142
  "app/services/ingestion_metrics.py": {
143
+ "mtime": 1787313822.596181,
144
+ "ast_hash": "fa6ffea26638acd6322834fe8950d394",
145
+ "semantic_hash": ""
146
  },
147
  "app/services/news_aggregator.py": {
148
  "mtime": 1781514962.4688468,
 
150
  "semantic_hash": "b7a259c6252f6477c6bdb1c14b76c70d"
151
  },
152
  "app/services/news_processor.py": {
153
+ "mtime": 1787313906.6372898,
154
+ "ast_hash": "3bdc72481805c9e06b2762f1f10605c7",
155
+ "semantic_hash": ""
156
  },
157
  "app/services/news_providers.py": {
158
  "mtime": 1781514962.4703689,
 
335
  "semantic_hash": "86f0e38b40cd9a4e2d526085d1713194"
336
  },
337
  "app/utils/data_validation.py": {
338
+ "mtime": 1787313714.3286016,
339
+ "ast_hash": "3c05cce47717f23479699c8770ff7a0f",
340
+ "semantic_hash": ""
341
  },
342
  "app/utils/date_parser.py": {
343
  "mtime": 1781514962.5117342,
 
413
  "mtime": 1781514962.608238,
414
  "ast_hash": "c6d261f13470968633d01d75c69bccd5",
415
  "semantic_hash": "c6d261f13470968633d01d75c69bccd5"
416
+ },
417
+ "tests/test_quality_rescue.py": {
418
+ "mtime": 1787313849.4597816,
419
+ "ast_hash": "81487865f9af449752468d6eb2320007",
420
+ "semantic_hash": ""
421
+ },
422
+ "tests/test_smoke.py": {
423
+ "mtime": 1787313339.8659484,
424
+ "ast_hash": "4ec114b151d942bb1c1ca67228d5998c",
425
+ "semantic_hash": ""
426
+ },
427
+ "SPEC_quality_score_rescue.md": {
428
+ "mtime": 1787312784.771174,
429
+ "ast_hash": "cc34f04777ee9580e98d5f2d48a7bd88",
430
+ "semantic_hash": ""
431
+ },
432
+ "TICKETS_quality_score_rescue.md": {
433
+ "mtime": 1787312756.814512,
434
+ "ast_hash": "2d41b128ced733adc19f0edaa3048cce",
435
+ "semantic_hash": ""
436
+ },
437
+ "UBIQUITOUS_LANGUAGE.md": {
438
+ "mtime": 1787312797.962652,
439
+ "ast_hash": "fd78fddcd85ee12d5eede6021a61eeb0",
440
+ "semantic_hash": ""
441
+ },
442
+ "requirements-dev.txt": {
443
+ "mtime": 1787313321.3640547,
444
+ "ast_hash": "eac373b319f56841db5563a98f9c98c4",
445
+ "semantic_hash": ""
446
  }
447
  }
graphify-out/GRAPH_REPORT.md CHANGED
@@ -1,16 +1,16 @@
1
  # Graph Report - backend (2026-08-24)
2
 
3
  ## Corpus Check
4
- - 87 files · ~74,093 words
5
  - Verdict: corpus is large enough that graph structure adds value.
6
 
7
  ## Summary
8
- - 1093 nodes · 1800 edges · 130 communities (95 shown, 35 thin omitted)
9
- - Extraction: 96% EXTRACTED · 4% INFERRED · 0% AMBIGUOUS · INFERRED: 79 edges (avg confidence: 0.53)
10
  - Token cost: 0 input · 0 output
11
 
12
  ## Graph Freshness
13
- - Built from commit: `f7d7d04d`
14
  - Run `git rev-parse HEAD` and compare to check if the graph is stale.
15
  - Run `graphify update .` after code changes (no API cost).
16
 
@@ -76,6 +76,10 @@
76
  - [[_COMMUNITY_Community 81|Community 81]]
77
  - [[_COMMUNITY_Community 82|Community 82]]
78
  - [[_COMMUNITY_Community 83|Community 83]]
 
 
 
 
79
  - [[_COMMUNITY_Community 89|Community 89]]
80
  - [[_COMMUNITY_Community 92|Community 92]]
81
  - [[_COMMUNITY_Community 94|Community 94]]
@@ -108,8 +112,8 @@
108
  1. `Article` - 89 edges
109
  2. `get_appwrite_db()` - 47 edges
110
  3. `get_upstash_cache()` - 33 edges
111
- 4. `RSSParser` - 31 edges
112
- 5. `_safe_get()` - 29 edges
113
  6. `NewsProvider` - 28 edges
114
  7. `AppwriteDatabase` - 26 edges
115
  8. `NewsAggregator` - 24 edges
@@ -131,71 +135,71 @@
131
  ## Import Cycles
132
  - None detected.
133
 
134
- ## Communities (130 total, 35 thin omitted)
135
 
136
  ### Community 0 - "Community 0"
137
  Cohesion: 0.22
138
  Nodes (10): _build_category_regex(), calculate_quality_score(), generate_slug(), Data Validation and Sanitization Layer FAANG-Level Quality Control for News Art, Clean and normalize article data HOTFIX: Now handles both Pydantic Ar, Generate URL-friendly slug from title Example: "Google Announces New, Score article quality from 0-100 Higher scores = better quality artic, # NOTE: 'cloud-computing' is kept here because it is an active category in (+2 more)
139
 
140
  ### Community 1 - "Community 1"
141
- Cohesion: 0.12
142
- Nodes (14): NewsResponse, Response model for news endpoints, get_news_by_category(), get_rss_feed(), get_umbrella_news(), Get news articles by category with cursor pagination and stale-while-revalidate, Aggregation endpoint for umbrella categories (data, cloud, latest-articles)., Get RSS feed from cloud providers Providers: aws, gcp, azure, ibm, or (+6 more)
143
 
144
  ### Community 2 - "Community 2"
145
  Cohesion: 0.08
146
  Nodes (20): _DatetimeEncoder, Any, Execute Redis command via REST API. WARN-002 fixed: was using blockin, Get value from cache Args: key: Cache key, Set value in cache with TTL Args: key: Cache key, Delete key from cache Args: key: Cache key to de, JSON encoder that converts datetime/date objects to ISO-8601 strings. Preve, Push an item to the left of a Redis list (Producer action) Ar (+12 more)
147
 
148
  ### Community 4 - "Community 4"
149
- Cohesion: 0.09
150
- Nodes (27): NewsAggregator, # NOTE: 'inshorts' removed — 100% connection-reset failures on HF Spaces (geo-bl, # NOTE: 'wikinews' removed returns stale 2009-era political articles (0 keywor, Service for aggregating news from multiple sources with automatic failover, Get usage statistics for monitoring, GNewsProvider, GoogleNewsRSSProvider, NewsAPIProvider (+19 more)
151
 
152
  ### Community 6 - "Community 6"
153
  Cohesion: 0.27
154
  Nodes (6): AsyncClient, Fetch tech headlines from the India and US static JSON files. Both fi, Download one regional JSON file and parse its articles. Args:, Convert raw NewsAPI-format JSON items into Segmento Pulse Article objects., Reads top tech headlines from two static JSON files on GitHub Pages. Cove, SauravKanchanProvider
155
 
156
  ### Community 8 - "Community 8"
157
- Cohesion: 0.11
158
- Nodes (13): URL Deduplication Service using Scalable Bloom Filter =========================, Create a new scalable bloom filter, Check if URL is new and add it to the filter Args:, Persist Scalable Bloom Filter to disk using pickle, Get deduplication statistics, Print deduplication statistics, Reset the filter (use with caution), Estimate current memory usage Note: ScalableBloomFilter memor (+5 more)
159
 
160
  ### Community 9 - "Community 9"
161
  Cohesion: 0.08
162
- Nodes (28): ABC, NewsProvider, ProviderStatus, Check if this provider is ready to accept a fetch request. Returns Fa, Task 4: Implement exponential backoff for 429 (Too Many Requests). Inst, Call this when the API returns a 429 (Too Many Requests). The status ch, Reset this provider's call counter back to zero. Called once per day (m, Represents the health of a provider at any given moment. ACTIVE → P (+20 more)
163
 
164
  ### Community 10 - "Community 10"
165
- Cohesion: 0.08
166
- Nodes (14): FirebaseService, Increment view count for an article, Get view count for an article, Firebase Realtime Database service for analytics (optional), Add or Update subscriber in database Now supports merging 'subscription, Get subscriber by email, Get subscriber by unsubscribe token, Initialize Firebase Admin SDK (+6 more)
167
 
168
  ### Community 11 - "Community 11"
169
- Cohesion: 0.07
170
- Nodes (24): CircuitState, get_circuit_breaker(), ProviderCircuitBreaker, Provider Circuit Breaker ======================== Prevents wasting time/band, # NOTE: We deliberately do NOT try to load Redis state here., Build the Redis key for a provider's circuit state., On server boot, check Redis for any circuit states that were open befor, Write 'circuit:{provider}:state = open' to Redis with a 1-hour TTL. Cal (+16 more)
171
 
172
  ### Community 12 - "Community 12"
173
- Cohesion: 0.15
174
- Nodes (15): cache_health_check(), clear_cache(), get_cache_stats(), get_ingestion_alerts(), get_ingestion_stats(), _get_recommendations(), Cache Monitoring and Metrics API ================================= Provides, Simple health check endpoint for cache connectivity. Returns: (+7 more)
175
 
176
  ### Community 13 - "Community 13"
177
- Cohesion: 0.31
178
- Nodes (4): is_relevant_to_category(), Check whether an article belongs to the given category. Uses pre-compiled, TestNewsProcessorMetrics, TestQualityScoreRescue
179
 
180
  ### Community 14 - "Community 14"
181
  Cohesion: 0.10
182
  Nodes (11): get_professional_logger(), IngestionStats, ProfessionalLogger, Professional Logging Module for Segmento Pulse Provides structured logging with, Log scheduler activity, Print comprehensive statistics summary, Get a professional logger instance, Track ingestion pipeline statistics (+3 more)
183
 
184
  ### Community 15 - "Community 15"
185
- Cohesion: 0.11
186
- Nodes (15): AdaptiveScheduler, Adaptive Scheduler for Dynamic Category Fetching Automatically adjusts fetch, Update velocity tracking and calculate new interval Args:, # NOTE: We no longer call _save_velocity_data() here., Save velocity data to Redis using a non-blocking async HTTP call. Why, Get current interval for a category, Get velocity statistics for all categories, Print velocity summary (+7 more)
187
 
188
  ### Community 16 - "Community 16"
189
- Cohesion: 0.07
190
- Nodes (38): ErrorResponse, Request model for view count increment, Response model for view count, ViewCountRequest, ViewCountResponse, get_view_count(), increment_view_count(), Increment view count for an article (+30 more)
191
 
192
  ### Community 17 - "Community 17"
193
- Cohesion: 0.10
194
- Nodes (26): get_research_paper(), Get a single research paper by ID., alert_high_failure_rate(), alert_quota_exhausted(), alert_zero_articles(), Admin Alerting Service Sends real-time alerts via webhooks (Discord/Slack) for, Alert: Warning - Brevo API quota exhausted, Alert: Error - High email failure rate (+18 more)
195
 
196
  ### Community 18 - "Community 18"
197
- Cohesion: 0.14
198
- Nodes (10): BrevoEmailService, any, Generate unique token for unsubscribe links, Generate unsubscribe URL with optional preference, Send welcome email to new subscriber, Email service using Brevo API, Send newsletter to subscribers with QUOTA-AWARE sending Args:, Get Brevo account information including email credits Returns (+2 more)
199
 
200
  ### Community 19 - "Community 19"
201
  Cohesion: 0.14
@@ -206,60 +210,60 @@ Cohesion: 0.22
206
  Nodes (8): Further Notes, Implementation Decisions, Out of Scope, Problem Statement, Solution, Spec: Quality-Score Rescue — Reduce Wrongful Article Rejections, Testing Decisions, User Stories
207
 
208
  ### Community 21 - "Community 21"
209
- Cohesion: 0.17
210
- Nodes (7): IngestionMetrics, Ingestion Statistics Tracking Monitors ingestion performance, duplicate rates,, Track ingestion metrics over time, Record metrics from an ingestion run, Get current ingestion statistics, Check if any metrics exceed thresholds, TestIngestionMetrics
211
 
212
  ### Community 22 - "Community 22"
213
  Cohesion: 0.13
214
  Nodes (10): create_document_from_rss_entry(), Document, Custom Document Class - Replacing LlamaIndex Document This provides the same, Helper function to create Document from RSS feed entry Args:, Custom Document class that standardizes data structure Replaces Llama, Initialize a Document Args: text: The document c, Generate unique document ID from URL or content hash Returns:, Convert Document to dictionary for serialization Returns: (+2 more)
215
 
216
  ### Community 24 - "Community 24"
217
- Cohesion: 0.15
218
- Nodes (9): Fetch technology articles from TheNewsAPI.com. Args: cat, Convert TheNewsAPI JSON items into Segmento Pulse Article objects. Th, Fetches technology news from TheNewsAPI.com. Paid provider — needs THENEW, TheNewsAPIProvider, Fetches enterprise-grade news articles from Webz.io News API Lite. Paid p, Fetch news articles from Webz.io for the given category. Args:, Convert Webz.io JSON 'posts' items into Segmento Pulse Article objects., WebzProvider (+1 more)
219
 
220
  ### Community 25 - "Community 25"
221
  Cohesion: 0.12
222
  Nodes (15): comma_separated_to_list(), detect_html(), extract_domain(), list_to_comma_separated(), normalize_url(), Utility Functions for Segmento Pulse Provides common helpers for text processin, Intelligently strip HTML only if HTML tags are detected. This optimiz, Extract domain from URL. Args: url: Full URL (+7 more)
223
 
224
  ### Community 26 - "Community 26"
225
- Cohesion: 0.18
226
- Nodes (10): AsyncClient, Fetch articles from all OpenRSS feeds — but only if 60 minutes have pas, Fetch one OpenRSS feed URL and parse its XML into Article objects. Ar, Parse raw XML from an OpenRSS feed into Article objects. Uses feedpar, get_provider_timestamp(), Save a provider's last-fetch timestamp to Redis. Always call this BEFORE, Build the Redis key string for a provider's last-fetch timestamp. Example, Read the last-fetch timestamp for a provider from Redis. Returns a Unix t (+2 more)
227
 
228
  ### Community 27 - "Community 27"
229
- Cohesion: 0.08
230
- Nodes (16): Article, Parse datetime from various formats including RFC 2822 (RSS feeds), Fetch news from ALL available sources for a category. Strategy (Phase, Fetch news specifically from a named provider (bypassing priority/failover), Fetch RSS from cloud providers, Search news articles using hybrid approach Currently uses Google News R, Parse GNews API response, Parse NewsAPI response (+8 more)
231
 
232
  ### Community 28 - "Community 28"
233
- Cohesion: 0.09
234
- Nodes (23): get_adaptive_scheduler(), Get or create adaptive scheduler instance, Cache Service using Redis Provides caching layer to reduce external API calls w, process_category(), News Processor Service Handles the heavy lifting of fetching, validating, and s, Core logic: Fetch -> Validate -> Save -> Update Adaptive Interval, # NOTE: fetched_approx excludes Redis-dedup volume (not returned by, get_upstash_cache() (+15 more)
235
 
236
  ### Community 29 - "Community 29"
237
- Cohesion: 0.09
238
- Nodes (29): health_check(), lifespan(), Live Health Dashboard Phase 23 What this shows: Instead of a h, Enhanced health check endpoint with scheduler status Used by external monit, Application lifespan manager Handles startup and shutdown events for, root(), get_provider_stats(), Get statistics about news provider usage and health Returns informati (+21 more)
239
 
240
  ### Community 31 - "Community 31"
241
- Cohesion: 0.12
242
- Nodes (25): dislike_article(), EngagementRequest, get_article_stats(), get_popular_cloud_articles(), get_trending_articles(), like_article(), Engagement API Endpoints Handles article likes, views tracking, and trending ar, Increment like count for an article. (+17 more)
243
 
244
  ### Community 32 - "Community 32"
245
- Cohesion: 0.07
246
- Nodes (35): bloom_filter_health_check(), cleanup_old_articles(), get_bloom_filter_stats(), get_database_stats(), get_scheduler_status(), get_subscriber_analytics(), populate_database(), preview_newsletter_content() (+27 more)
247
 
248
  ### Community 34 - "Community 34"
249
- Cohesion: 0.06
250
- Nodes (26): Response model for search endpoints, SearchResponse, clear_cache(), get_cache_stats(), Clear all cached news data Useful for testing or forcing a fresh data, Start a background cache-warm job for all categories. Fix 2: The old vers, The actual cache-warming work — runs in the background so the HTTP request, Get cache statistics Returns information about: - Which cate (+18 more)
251
 
252
  ### Community 38 - "Community 38"
253
- Cohesion: 0.12
254
- Nodes (12): get_quota_stats(), Get API quota usage statistics Tracks usage for: - GNews API (10, APIQuotaTracker, get_quota_tracker(), API Quota Tracking Service Monitors API usage and prevents hitting rate limits, Get current quota usage statistics, Track API usage and enforce rate limits, Check if we can still call this paid provider today. Reads the curren (+4 more)
255
 
256
  ### Community 39 - "Community 39"
257
  Cohesion: 0.21
258
  Nodes (8): HackerNewsProvider, AsyncClient, Step 1: Ask Hacker News for the IDs of its top stories. Returns a lis, Step 2 (single unit): Fetch the details for one Hacker News story. Ar, Convert raw Hacker News JSON items into Segmento Pulse Article objects., For every article that has an empty image_url, visit its URL and try to, Fetches top stories from the Hacker News API. No API key needed. No rate, Fetch the top stories from Hacker News. Args: category (
259
 
260
  ### Community 40 - "Community 40"
261
- Cohesion: 0.05
262
- Nodes (24): AppwriteDatabase, Any, Get all subscribers (Source of Truth) Used by admin analytics., Get database statistics Returns: Dictionary with, Appwrite Database service for persistent article storage (L2 cache), Initialize Appwrite client and database connection, Phase 4: Strict Routing Algorithm (Vertical Architecture), Generate a unique hash for an article URL. **INTEGRATION UPDATE**: Ma (+16 more)
263
 
264
  ### Community 41 - "Community 41"
265
  Cohesion: 0.29
@@ -270,8 +274,8 @@ Cohesion: 0.29
270
  Nodes (6): API Endpoints, Configuration, Features, Local Development, SegmentoPulse Backend API, Usage
271
 
272
  ### Community 44 - "Community 44"
273
- Cohesion: 0.33
274
- Nodes (6): Manually trigger the cleanup job (Phase 3) Deletes articles older tha, trigger_cleanup_job(), cleanup_old_news(), Background Job: Delete articles older than 48 hours from ALL collections, Manually trigger cleanup, trigger_cleanup_now()
275
 
276
  ### Community 45 - "Community 45"
277
  Cohesion: 0.33
@@ -306,45 +310,61 @@ Cohesion: 0.50
306
  Nodes (3): Parse comma-separated string into list (for HF Spaces secrets), Settings, BaseSettings
307
 
308
  ### Community 57 - "Community 57"
309
- Cohesion: 0.19
310
- Nodes (8): Fetch news from GNews API. Why no 'from'/'to' date filter here?, Fetch news from NewsAPI. Phase 20 upgrade: The query string is now bu, Fetch news from NewsData.io, Parse NewsData.io response, Implement exponential backoff for 429 Too Many Requests, Fetch news from Google News RSS, build_dynamic_query(), Build a query string for the given category using the Anchor + Round-Robin
311
 
312
  ### Community 58 - "Community 58"
313
  Cohesion: 0.22
314
  Nodes (5): Extract XML tag content, Remove HTML tags and decode entities, Parse Google News RSS feed with advanced XML parsing, Extract image from multiple XML sources with fallbacks, Clean Google News description - they typically only contain links, not actual co
315
 
316
  ### Community 62 - "Community 62"
317
- Cohesion: 0.19
318
- Nodes (13): fetch_and_validate_category(), Fetch and validate articles for a single category. Args: categor, is_valid_article(), Validate article data quality before database insertion HOTFIX: Now h, is_url_seen_or_mark(), Redis URL Deduplication Bouncer ================================ This is the, Check if we have seen this article URL in the last 48 hours. If we have NOT, canonicalize_url() (+5 more)
319
 
320
  ### Community 63 - "Community 63"
321
- Cohesion: 0.31
322
- Nodes (5): MediumRSSProvider, Medium RSS Provider Fetches latest 10 articles per tag. Handles CDATA image, Fetch and parse Medium RSS feed, Extracts the first valid image URL from Medium's HTML content. Medium u, Removes HTML tags for a clean description
323
 
324
  ### Community 77 - "Community 77"
325
- Cohesion: 0.28
326
- Nodes (5): InshortsProvider, Fetch technology articles from the Inshorts community API. Args:, Solve the split date/time problem. Inshorts gives us date and time as, Convert raw Inshorts JSON items into Segmento Pulse Article objects., Fetches 60-word technology summaries from the Inshorts community API. Fre
327
 
328
  ### Community 78 - "Community 78"
329
  Cohesion: 0.28
330
  Nodes (8): apply_engagement_boost(), apply_time_decay(), filter_by_recency(), Any, Ranking Utilities - Time Decay & Relevance ====================================, Filter out articles older than max_hours. Args: results: Lis, Apply time decay ranking to search results. Formula: Final Score = (1, Boost articles with high engagement (likes, views). Formula: Engageme
331
 
332
  ### Community 80 - "Community 80"
333
- Cohesion: 0.33
334
- Nodes (4): Fetches global technology news from WorldNewsAI.com. Paid provider (point, Fetch global technology news from WorldNewsAI. Args: cat, Convert WorldNewsAI JSON items into Segmento Pulse Article objects. K, WorldNewsAIProvider
335
 
336
  ### Community 81 - "Community 81"
337
  Cohesion: 0.29
338
- Nodes (4): datetime, Parse cloud provider RSS feed, Extract image URL from feed entry, Parse date string to datetime
339
 
340
  ### Community 82 - "Community 82"
341
- Cohesion: 0.33
342
- Nodes (6): extract_top_image(), _fetch_and_extract(), app/services/utils/image_enricher.py ──────────────────────────────────────────, Internal helper: download the HTML and pull out the og:image tag. Separat, # NOTE: We pass only the first 10,000 characters to avoid processing huge, Visit an article URL and extract its main (top) image. Looks for the imag
343
 
344
  ### Community 83 - "Community 83"
345
  Cohesion: 0.29
346
  Nodes (7): normalize_article_date(), parse_date_to_iso(), Date Parsing and Normalization Utility FAANG-Level Quality Control for Publishe, Validate that a date string is in strict ISO-8601 UTC format Expected, Parse any date format and convert to strict ISO-8601 UTC Handles:, Normalize the publishedAt field in an article HOTFIX (2026-01-23): No, validate_date_format()
347
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
348
  ## Knowledge Gaps
349
  - **50 isolated node(s):** `graphify`, `Workflow: graphify`, `Features`, `API Endpoints`, `Configuration` (+45 more)
350
  These have ≤1 connection - possible missing edges or undocumented components.
@@ -353,17 +373,17 @@ Nodes (7): normalize_article_date(), parse_date_to_iso(), Date Parsing and Norma
353
  ## Suggested Questions
354
  _Questions this graph is uniquely positioned to answer:_
355
 
356
- - **Why does `Article` connect `Community 27` to `Community 4`, `Community 6`, `Community 9`, `Community 16`, `Community 17`, `Community 24`, `Community 26`, `Community 28`, `Community 29`, `Community 33`, `Community 34`, `Community 39`, `Community 40`, `Community 52`, `Community 57`, `Community 58`, `Community 62`, `Community 63`, `Community 77`, `Community 80`, `Community 81`?**
357
- _High betweenness centrality (0.193) - this node is a cross-community bridge._
358
- - **Why does `get_appwrite_db()` connect `Community 17` to `Community 32`, `Community 34`, `Community 40`, `Community 44`, `Community 46`, `Community 16`, `Community 51`, `Community 28`, `Community 29`, `Community 31`?**
359
- _High betweenness centrality (0.096) - this node is a cross-community bridge._
360
- - **Why does `get_upstash_cache()` connect `Community 28` to `Community 32`, `Community 34`, `Community 2`, `Community 38`, `Community 9`, `Community 11`, `Community 12`, `Community 26`, `Community 29`, `Community 62`?**
361
- _High betweenness centrality (0.077) - this node is a cross-community bridge._
362
  - **Are the 26 inferred relationships involving `Article` (e.g. with `AppwriteDatabase` and `TablesDBWrapper`) actually correct?**
363
  _`Article` has 26 INFERRED edges - model-reasoned connections that need verification._
364
  - **Are the 12 inferred relationships involving `RSSParser` (e.g. with `NewsAggregator` and `GNewsProvider`) actually correct?**
365
  _`RSSParser` has 12 INFERRED edges - model-reasoned connections that need verification._
366
  - **What connects `Segmento Pulse Backend API FastAPI application for real-time technology news ag`, `Parse comma-separated string into list (for HF Spaces secrets)`, `Application lifespan manager Handles startup and shutdown events for` to the rest of the system?**
367
- _489 weakly-connected nodes found - possible documentation gaps or missing edges._
368
  - **Should `Community 1` be split into smaller, more focused modules?**
369
- _Cohesion score 0.12418300653594772 - nodes in this community are weakly interconnected._
 
1
  # Graph Report - backend (2026-08-24)
2
 
3
  ## Corpus Check
4
+ - 87 files · ~72,722 words
5
  - Verdict: corpus is large enough that graph structure adds value.
6
 
7
  ## Summary
8
+ - 1059 nodes · 1751 edges · 136 communities (101 shown, 35 thin omitted)
9
+ - Extraction: 95% EXTRACTED · 5% INFERRED · 0% AMBIGUOUS · INFERRED: 79 edges (avg confidence: 0.53)
10
  - Token cost: 0 input · 0 output
11
 
12
  ## Graph Freshness
13
+ - Built from commit: `98ca1d1c`
14
  - Run `git rev-parse HEAD` and compare to check if the graph is stale.
15
  - Run `graphify update .` after code changes (no API cost).
16
 
 
76
  - [[_COMMUNITY_Community 81|Community 81]]
77
  - [[_COMMUNITY_Community 82|Community 82]]
78
  - [[_COMMUNITY_Community 83|Community 83]]
79
+ - [[_COMMUNITY_._fetch_and_parse_feed|._fetch_and_parse_feed]]
80
+ - [[_COMMUNITY_.get_articles|.get_articles]]
81
+ - [[_COMMUNITY_id_generator.py|id_generator.py]]
82
+ - [[_COMMUNITY_fetch_and_validate_category|fetch_and_validate_category]]
83
  - [[_COMMUNITY_Community 89|Community 89]]
84
  - [[_COMMUNITY_Community 92|Community 92]]
85
  - [[_COMMUNITY_Community 94|Community 94]]
 
112
  1. `Article` - 89 edges
113
  2. `get_appwrite_db()` - 47 edges
114
  3. `get_upstash_cache()` - 33 edges
115
+ 4. `_safe_get()` - 31 edges
116
+ 5. `RSSParser` - 31 edges
117
  6. `NewsProvider` - 28 edges
118
  7. `AppwriteDatabase` - 26 edges
119
  8. `NewsAggregator` - 24 edges
 
135
  ## Import Cycles
136
  - None detected.
137
 
138
+ ## Communities (136 total, 35 thin omitted)
139
 
140
  ### Community 0 - "Community 0"
141
  Cohesion: 0.22
142
  Nodes (10): _build_category_regex(), calculate_quality_score(), generate_slug(), Data Validation and Sanitization Layer FAANG-Level Quality Control for News Art, Clean and normalize article data HOTFIX: Now handles both Pydantic Ar, Generate URL-friendly slug from title Example: "Google Announces New, Score article quality from 0-100 Higher scores = better quality artic, # NOTE: 'cloud-computing' is kept here because it is an active category in (+2 more)
143
 
144
  ### Community 1 - "Community 1"
145
+ Cohesion: 0.09
146
+ Nodes (22): ErrorResponse, NewsResponse, Response model for news endpoints, Request model for view count increment, Response model for view count, ViewCountRequest, ViewCountResponse, get_news_by_category() (+14 more)
147
 
148
  ### Community 2 - "Community 2"
149
  Cohesion: 0.08
150
  Nodes (20): _DatetimeEncoder, Any, Execute Redis command via REST API. WARN-002 fixed: was using blockin, Get value from cache Args: key: Cache key, Set value in cache with TTL Args: key: Cache key, Delete key from cache Args: key: Cache key to de, JSON encoder that converts datetime/date objects to ISO-8601 strings. Preve, Push an item to the left of a Redis list (Producer action) Ar (+12 more)
151
 
152
  ### Community 4 - "Community 4"
153
+ Cohesion: 0.06
154
+ Nodes (26): get_quota_tracker(), API Quota Tracking Service Monitors API usage and prevents hitting rate limits, Get or create global quota tracker instance, GNewsProvider, GoogleNewsRSSProvider, MediumRSSProvider, NewsAPIProvider, NewsProvider (+18 more)
155
 
156
  ### Community 6 - "Community 6"
157
  Cohesion: 0.27
158
  Nodes (6): AsyncClient, Fetch tech headlines from the India and US static JSON files. Both fi, Download one regional JSON file and parse its articles. Args:, Convert raw NewsAPI-format JSON items into Segmento Pulse Article objects., Reads top tech headlines from two static JSON files on GitHub Pages. Cove, SauravKanchanProvider
159
 
160
  ### Community 8 - "Community 8"
161
+ Cohesion: 0.08
162
+ Nodes (21): bloom_filter_health_check(), get_bloom_filter_stats(), Reset Scalable Bloom Filter - Integration Sync Mechanism **USE CASE**, Get Scalable Bloom Filter statistics - Observability Endpoint Shows:, Quick health check for Bloom Filter - Production Monitoring Returns:, reset_bloom_filter(), get_url_filter(), URL Deduplication Service using Scalable Bloom Filter ========================= (+13 more)
163
 
164
  ### Community 9 - "Community 9"
165
  Cohesion: 0.08
166
+ Nodes (24): ABC, # NOTE: 'inshorts' removed — 100% connection-reset failures on HF Spaces (geo-bl, # NOTE: 'wikinews' removed — returns stale 2009-era political articles (0 keywor, NewsProvider, Check if this provider is ready to accept a fetch request. Returns Fa, Task 4: Implement exponential backoff for 429 (Too Many Requests). Inst, Call this when the API returns a 429 (Too Many Requests). The status ch, Reset this provider's call counter back to zero. Called once per day (m (+16 more)
167
 
168
  ### Community 10 - "Community 10"
169
+ Cohesion: 0.12
170
+ Nodes (16): Live Health Dashboard Phase 23 What this shows: Instead of a h, root(), cleanup_old_articles(), get_database_stats(), get_subscriber_analytics(), Get Appwrite database statistics (Phase 2) Returns: - Total, Delete articles older than specified days from Appwrite database Args, Get subscriber distribution by preference from Appwrite Shows how man (+8 more)
171
 
172
  ### Community 11 - "Community 11"
173
+ Cohesion: 0.11
174
+ Nodes (14): ProviderCircuitBreaker, Build the Redis key for a provider's circuit state., On server boot, check Redis for any circuit states that were open befor, Write 'circuit:{provider}:state = open' to Redis with a 1-hour TTL. Cal, Delete 'circuit:{provider}:state' from Redis. Called whenever a circuit, Check if provider should be skipped Args: provider: Prov, Record successful request Args: provider: Provider name, Record failed request Args: provider: Provider name (+6 more)
175
 
176
  ### Community 12 - "Community 12"
177
+ Cohesion: 0.13
178
+ Nodes (18): health_check(), lifespan(), Enhanced health check endpoint with scheduler status Used by external monit, Application lifespan manager Handles startup and shutdown events for, get_cache_stats(), get_quota_stats(), _get_recommendations(), Cache Monitoring and Metrics API ================================= Provides (+10 more)
179
 
180
  ### Community 13 - "Community 13"
181
+ Cohesion: 0.43
182
+ Nodes (3): is_relevant_to_category(), Check whether an article belongs to the given category. Uses pre-compiled, TestQualityScoreRescue
183
 
184
  ### Community 14 - "Community 14"
185
  Cohesion: 0.10
186
  Nodes (11): get_professional_logger(), IngestionStats, ProfessionalLogger, Professional Logging Module for Segmento Pulse Provides structured logging with, Log scheduler activity, Print comprehensive statistics summary, Get a professional logger instance, Track ingestion pipeline statistics (+3 more)
187
 
188
  ### Community 15 - "Community 15"
189
+ Cohesion: 0.12
190
+ Nodes (13): AdaptiveScheduler, Update velocity tracking and calculate new interval Args:, Save velocity data to Redis using a non-blocking async HTTP call. Why, Get current interval for a category, Get velocity statistics for all categories, Print velocity summary, Dynamically adjusts fetch intervals based on category activity Tracks, Initialize adaptive scheduler Args: categories: (+5 more)
191
 
192
  ### Community 16 - "Community 16"
193
+ Cohesion: 0.05
194
+ Nodes (44): get_subscriber_count(), Subscription API Routes Handles newsletter subscriptions and unsubscribe functi, Unsubscribe user via email link Supports Granular Unsubscribe (e.g., 'Morni, Unsubscribe via email address (for forms/dashboard) Supports Granular Unsub, Get total number of active subscribers from Appwrite, Send newsletter to all subscribers (LEGACY ENDPOINT - Use scheduled newsletters, Subscribe a user to the newsletter - Adds subscriber to Appwrite (Sol, send_newsletter() (+36 more)
195
 
196
  ### Community 17 - "Community 17"
197
+ Cohesion: 0.19
198
+ Nodes (11): AudioGenerationRequest, AudioResponse, _find_article(), generate_audio_summary(), get_audio_status(), Generate audio summary for an article by URL, Helper to find an article across multiple collections. Returns (article, co, Check if audio/text summary exists for an article. (+3 more)
199
 
200
  ### Community 18 - "Community 18"
201
+ Cohesion: 0.12
202
+ Nodes (16): Emergency Circuit Breaker Reset Run this endpoint right after any redeplo, reset_circuit_breakers(), cache_health_check(), clear_cache(), Simple health check endpoint for cache connectivity. Returns:, Clear all cached data (admin endpoint). USE WITH CAUTION: This will f, CircuitState, get_circuit_breaker() (+8 more)
203
 
204
  ### Community 19 - "Community 19"
205
  Cohesion: 0.14
 
210
  Nodes (8): Further Notes, Implementation Decisions, Out of Scope, Problem Statement, Solution, Spec: Quality-Score Rescue — Reduce Wrongful Article Rejections, Testing Decisions, User Stories
211
 
212
  ### Community 21 - "Community 21"
213
+ Cohesion: 0.20
214
+ Nodes (6): IngestionMetrics, Track ingestion metrics over time, Record metrics from an ingestion run, Get current ingestion statistics, Check if any metrics exceed thresholds, TestIngestionMetrics
215
 
216
  ### Community 22 - "Community 22"
217
  Cohesion: 0.13
218
  Nodes (10): create_document_from_rss_entry(), Document, Custom Document Class - Replacing LlamaIndex Document This provides the same, Helper function to create Document from RSS feed entry Args:, Custom Document class that standardizes data structure Replaces Llama, Initialize a Document Args: text: The document c, Generate unique document ID from URL or content hash Returns:, Convert Document to dictionary for serialization Returns: (+2 more)
219
 
220
  ### Community 24 - "Community 24"
221
+ Cohesion: 0.09
222
+ Nodes (23): ProviderStatus, Represents the health of a provider at any given moment. ACTIVE → P, providers/thenewsapi/client.py ────────────────────────────────────────────────, Fetch technology articles from TheNewsAPI.com. Args: cat, # NOTE: We deliberately do NOT add 'published_after' or, Convert TheNewsAPI JSON items into Segmento Pulse Article objects. Th, Fetches technology news from TheNewsAPI.com. Paid provider — needs THENEW, TheNewsAPIProvider (+15 more)
223
 
224
  ### Community 25 - "Community 25"
225
  Cohesion: 0.12
226
  Nodes (15): comma_separated_to_list(), detect_html(), extract_domain(), list_to_comma_separated(), normalize_url(), Utility Functions for Segmento Pulse Provides common helpers for text processin, Intelligently strip HTML only if HTML tags are detected. This optimiz, Extract domain from URL. Args: url: Full URL (+7 more)
227
 
228
  ### Community 26 - "Community 26"
229
+ Cohesion: 0.22
230
+ Nodes (9): AsyncClient, Fetch articles from all OpenRSS feeds — but only if 60 minutes have pas, Fetch one OpenRSS feed URL and parse its XML into Article objects. Ar, get_provider_timestamp(), Save a provider's last-fetch timestamp to Redis. Always call this BEFORE, Build the Redis key string for a provider's last-fetch timestamp. Example, Read the last-fetch timestamp for a provider from Redis. Returns a Unix t, set_provider_timestamp() (+1 more)
231
 
232
  ### Community 27 - "Community 27"
233
+ Cohesion: 0.17
234
+ Nodes (7): NewsAggregator, Fetch news from ALL available sources for a category. Strategy (Phase, Service for aggregating news from multiple sources with automatic failover, Fetch news specifically from a named provider (bypassing priority/failover), Fetch RSS from cloud providers, Search news articles using hybrid approach Currently uses Google News R, Get usage statistics for monitoring
235
 
236
  ### Community 28 - "Community 28"
237
+ Cohesion: 0.18
238
+ Nodes (9): Worker Manager Service Consumer process that pulls categories from Redis and ex, # NOTE: Do NOT create a new NewsAggregator here., AlignedColorFormatter, get_logger(), backend/app/utils/custom_logger.py ────────────────────────────────────────────, Get a logger that flows into the root logger configured in main.py. How t, Custom log formatter that produces perfectly aligned, ANSI-colored output., Logger (+1 more)
239
 
240
  ### Community 29 - "Community 29"
241
+ Cohesion: 0.14
242
+ Nodes (18): Cache Service using Redis Provides caching layer to reduce external API calls w, cleanup_old_news(), fetch_daily_research(), fetch_single_category_job(), _get_adaptive(), keepalive_job(), Background Scheduler Service - Phase 3 Automates news fetching and database cle, Per-category background job (Phase 6). This is what each of the 22 adapti (+10 more)
243
 
244
  ### Community 31 - "Community 31"
245
+ Cohesion: 0.16
246
+ Nodes (20): dislike_article(), EngagementRequest, get_article_stats(), get_popular_cloud_articles(), get_trending_articles(), like_article(), Engagement API Endpoints Handles article likes, views tracking, and trending ar, Increment like count for an article. (+12 more)
247
 
248
  ### Community 32 - "Community 32"
249
+ Cohesion: 0.09
250
+ Nodes (29): get_cache_stats(), get_scheduler_status(), populate_database(), preview_newsletter_content(), Start a background cache-warm job for all categories. Fix 2: The old vers, Populate Appwrite database by fetching fresh articles for all categories, Manually trigger the news fetch job (Phase 3) Useful for: - Test, Manually trigger the cleanup job (Phase 3) Deletes articles older tha (+21 more)
251
 
252
  ### Community 34 - "Community 34"
253
+ Cohesion: 0.08
254
+ Nodes (19): Response model for search endpoints, SearchResponse, clear_cache(), Clear all cached news data Useful for testing or forcing a fresh data, Search news articles by keyword (Direct Aggregation), search_news(), CacheService, Set cached articles with TTL (+11 more)
255
 
256
  ### Community 38 - "Community 38"
257
+ Cohesion: 0.18
258
+ Nodes (7): APIQuotaTracker, Get current quota usage statistics, Track API usage and enforce rate limits, Check if we can still call this paid provider today. Reads the curren, Record that we just used one API credit for this provider. Writes to, Check if approaching rate limits, Check if an API call can be made without exceeding quotas
259
 
260
  ### Community 39 - "Community 39"
261
  Cohesion: 0.21
262
  Nodes (8): HackerNewsProvider, AsyncClient, Step 1: Ask Hacker News for the IDs of its top stories. Returns a lis, Step 2 (single unit): Fetch the details for one Hacker News story. Ar, Convert raw Hacker News JSON items into Segmento Pulse Article objects., For every article that has an empty image_url, visit its URL and try to, Fetches top stories from the Hacker News API. No API key needed. No rate, Fetch the top stories from Hacker News. Args: category (
263
 
264
  ### Community 40 - "Community 40"
265
+ Cohesion: 0.07
266
+ Nodes (15): AppwriteDatabase, Any, Get all subscribers (Source of Truth) Used by admin analytics., Get database statistics Returns: Dictionary with, Appwrite Database service for persistent article storage (L2 cache), Initialize Appwrite client and database connection, Generate a unique hash for an article URL. **INTEGRATION UPDATE**: Ma, Save articles to Appwrite database with TRUE parallel writes (+7 more)
267
 
268
  ### Community 41 - "Community 41"
269
  Cohesion: 0.29
 
274
  Nodes (6): API Endpoints, Configuration, Features, Local Development, SegmentoPulse Backend API, Usage
275
 
276
  ### Community 44 - "Community 44"
277
+ Cohesion: 0.17
278
+ Nodes (6): Create a new subscriber in Appwrite (Dual-Write) Uses Boolean Flags sch, Get subscriber by email, Update subscriber preferences, Update specific subscription preference (Granular Unsubscribe), Update global subscription status (Global Unsubscribe), Update lastSentAt timestamp for a subscriber
279
 
280
  ### Community 45 - "Community 45"
281
  Cohesion: 0.33
 
310
  Nodes (3): Parse comma-separated string into list (for HF Spaces secrets), Settings, BaseSettings
311
 
312
  ### Community 57 - "Community 57"
313
+ Cohesion: 0.11
314
+ Nodes (17): Article, Parse datetime from various formats including RFC 2822 (RSS feeds), NewsDataProvider, Fetch news from GNews API. Why no 'from'/'to' date filter here?, Fetch news from NewsAPI. Phase 20 upgrade: The query string is now bu, Fetch news from NewsData.io, Parse NewsData.io response, Implement exponential backoff for 429 Too Many Requests (+9 more)
315
 
316
  ### Community 58 - "Community 58"
317
  Cohesion: 0.22
318
  Nodes (5): Extract XML tag content, Remove HTML tags and decode entities, Parse Google News RSS feed with advanced XML parsing, Extract image from multiple XML sources with fallbacks, Clean Google News description - they typically only contain links, not actual co
319
 
320
  ### Community 62 - "Community 62"
321
+ Cohesion: 0.31
322
+ Nodes (8): is_url_seen_or_mark(), Redis URL Deduplication Bouncer ================================ This is the, Check if we have seen this article URL in the last 48 hours. If we have NOT, canonicalize_url(), get_url_hash(), URL Canonicalization for Better Deduplication Normalizes URLs before hashing, Generate hash from canonical URL Args: url: Original URL, Normalize URL for better deduplication Args: url: Original U
323
 
324
  ### Community 63 - "Community 63"
325
+ Cohesion: 0.20
326
+ Nodes (8): get_ingestion_alerts(), get_ingestion_stats(), Get ingestion statistics Returns metrics about news ingestion perform, Check for ingestion alerts Monitors: - High duplicate rate (>90%, get_ingestion_metrics(), Ingestion Statistics Tracking Monitors ingestion performance, duplicate rates,, Get or create global ingestion metrics instance, TestNewsProcessorMetrics
327
 
328
  ### Community 77 - "Community 77"
329
+ Cohesion: 0.15
330
+ Nodes (9): InshortsProvider, Fetch technology articles from the Inshorts community API. Args:, Solve the split date/time problem. Inshorts gives us date and time as, Convert raw Inshorts JSON items into Segmento Pulse Article objects., Fetches 60-word technology summaries from the Inshorts community API. Fre, OpenRSSProvider, Fetches RSS feeds from dev.to, Hashnode, and GitHub Blog via OpenRSS.org., Parse raw XML from an OpenRSS feed into Article objects. Uses feedpar (+1 more)
331
 
332
  ### Community 78 - "Community 78"
333
  Cohesion: 0.28
334
  Nodes (8): apply_engagement_boost(), apply_time_decay(), filter_by_recency(), Any, Ranking Utilities - Time Decay & Relevance ====================================, Filter out articles older than max_hours. Args: results: Lis, Apply time decay ranking to search results. Formula: Final Score = (1, Boost articles with high engagement (likes, views). Formula: Engageme
335
 
336
  ### Community 80 - "Community 80"
337
+ Cohesion: 0.24
338
+ Nodes (8): get_adaptive_scheduler(), Adaptive Scheduler for Dynamic Category Fetching Automatically adjusts fetch, # NOTE: We no longer call _save_velocity_data() here., Get or create adaptive scheduler instance, process_category(), News Processor Service Handles the heavy lifting of fetching, validating, and s, Core logic: Fetch -> Validate -> Save -> Update Adaptive Interval, # NOTE: fetched_approx excludes Redis-dedup volume (not returned by
339
 
340
  ### Community 81 - "Community 81"
341
  Cohesion: 0.29
342
+ Nodes (3): The Reaper: Scans the processing queue for tasks that timed out. If a w, Lazy-load the shared aggregator singleton from scheduler., WorkerManager
343
 
344
  ### Community 82 - "Community 82"
345
+ Cohesion: 0.25
346
+ Nodes (8): enrich_missing_images_in_batch(), Scan a list of fully-vetted articles and fill in any missing images. Only, extract_top_image(), _fetch_and_extract(), app/services/utils/image_enricher.py ──────────────────────────────────────────, Internal helper: download the HTML and pull out the og:image tag. Separat, # NOTE: We pass only the first 10,000 characters to avoid processing huge, Visit an article URL and extract its main (top) image. Looks for the imag
347
 
348
  ### Community 83 - "Community 83"
349
  Cohesion: 0.29
350
  Nodes (7): normalize_article_date(), parse_date_to_iso(), Date Parsing and Normalization Utility FAANG-Level Quality Control for Publishe, Validate that a date string is in strict ISO-8601 UTC format Expected, Parse any date format and convert to strict ISO-8601 UTC Handles:, Normalize the publishedAt field in an article HOTFIX (2026-01-23): No, validate_date_format()
351
 
352
+ ### Community 84 - "._fetch_and_parse_feed"
353
+ Cohesion: 0.33
354
+ Nodes (4): AsyncClient, Fetch articles from all premium tech RSS feeds concurrently. Args:, Fetch one RSS feed URL and parse it into Article objects. Args:, Parse raw XML text from a feed into a list of Article objects. Uses f
355
+
356
+ ### Community 85 - ".get_articles"
357
+ Cohesion: 0.33
358
+ Nodes (3): Phase 4: Strict Routing Algorithm (Vertical Architecture), Get articles by category with pagination and projection (FAANG-Level), Get articles with custom query filters (for cursor pagination)
359
+
360
+ ### Community 86 - "id_generator.py"
361
+ Cohesion: 0.33
362
+ Nodes (5): generate_article_id_uuid(), Article ID Generation Utilities ================================ Generates A, Generate Appwrite-compatible UUID from URL Alternative method using U, Validate that document ID meets Appwrite requirements Appwrite docume, validate_appwrite_id()
363
+
364
+ ### Community 87 - "fetch_and_validate_category"
365
+ Cohesion: 0.40
366
+ Nodes (5): fetch_and_validate_category(), Fetch and validate articles for a single category. Args: categor, is_valid_article(), Validate article data quality before database insertion HOTFIX: Now h, canonicalize_url
367
+
368
  ## Knowledge Gaps
369
  - **50 isolated node(s):** `graphify`, `Workflow: graphify`, `Features`, `API Endpoints`, `Configuration` (+45 more)
370
  These have ≤1 connection - possible missing edges or undocumented components.
 
373
  ## Suggested Questions
374
  _Questions this graph is uniquely positioned to answer:_
375
 
376
+ - **Why does `Article` connect `Community 57` to `Community 1`, `Community 4`, `Community 6`, `Community 9`, `Community 10`, `Community 17`, `Community 24`, `Community 26`, `Community 27`, `Community 29`, `Community 33`, `Community 34`, `Community 39`, `Community 40`, `Community 52`, `Community 58`, `Community 77`, `Community 80`, `._fetch_and_parse_feed`, `fetch_and_validate_category`?**
377
+ _High betweenness centrality (0.175) - this node is a cross-community bridge._
378
+ - **Why does `get_upstash_cache()` connect `Community 18` to `Community 32`, `Community 1`, `Community 34`, `Community 2`, `Community 4`, `Community 38`, `Community 11`, `Community 12`, `Community 80`, `Community 81`, `Community 24`, `Community 26`, `Community 28`, `Community 29`, `Community 62`?**
379
+ _High betweenness centrality (0.114) - this node is a cross-community bridge._
380
+ - **Why does `get_appwrite_db()` connect `Community 10` to `Community 32`, `Community 1`, `Community 34`, `Community 8`, `Community 40`, `Community 12`, `Community 46`, `Community 16`, `Community 17`, `Community 80`, `Community 51`, `Community 29`, `Community 31`?**
381
+ _High betweenness centrality (0.079) - this node is a cross-community bridge._
382
  - **Are the 26 inferred relationships involving `Article` (e.g. with `AppwriteDatabase` and `TablesDBWrapper`) actually correct?**
383
  _`Article` has 26 INFERRED edges - model-reasoned connections that need verification._
384
  - **Are the 12 inferred relationships involving `RSSParser` (e.g. with `NewsAggregator` and `GNewsProvider`) actually correct?**
385
  _`RSSParser` has 12 INFERRED edges - model-reasoned connections that need verification._
386
  - **What connects `Segmento Pulse Backend API FastAPI application for real-time technology news ag`, `Parse comma-separated string into list (for HF Spaces secrets)`, `Application lifespan manager Handles startup and shutdown events for` to the rest of the system?**
387
+ _472 weakly-connected nodes found - possible documentation gaps or missing edges._
388
  - **Should `Community 1` be split into smaller, more focused modules?**
389
+ _Cohesion score 0.09401709401709402 - nodes in this community are weakly interconnected._
graphify-out/cache/ast/v0.9.5/1c3f57689ce70e2b13e423b55681cdaaed4d952d420c978f01327190664f0e67.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"nodes": [{"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_firebase_service_py", "label": "firebase_service.py", "file_type": "code", "source_file": "app/services/firebase_service.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
graphify-out/cache/ast/v0.9.5/4015dd2120abc1b10e107930ad2e461104dc0f8d4b92099117657b7401ead048.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"nodes": [{"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "label": "main.py", "file_type": "code", "source_file": "app/main.py", "source_location": "L1"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "label": "lifespan()", "file_type": "code", "source_file": "app/main.py", "source_location": "L66", "_callable": true}, {"id": "fastapi", "label": "FastAPI", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "label": "root()", "file_type": "code", "source_file": "app/main.py", "source_location": "L160", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "label": "health_check()", "file_type": "code", "source_file": "app/main.py", "source_location": "L262", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_rationale_67", "label": "Application lifespan manager Handles startup and shutdown events for", "file_type": "rationale", "source_file": "app/main.py", "source_location": "L67"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_rationale_161", "label": "Live Health Dashboard \u2014 Phase 23 What this shows: Instead of a h", "file_type": "rationale", "source_file": "app/main.py", "source_location": "L161"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_rationale_263", "label": "Enhanced health check endpoint with scheduler status Used by external monit", "file_type": "rationale", "source_file": "app/main.py", "source_location": "L263"}], "edges": [{"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "asyncio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L1", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L2", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "logging", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L3", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L4", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "warnings", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L5", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "fastapi_middleware_cors", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L6", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_utils_custom_logger", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L7", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "nest_asyncio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L31", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "contextlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L36", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_config", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L37", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "pydantic_warnings", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L40", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_routes", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L51", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_services_scheduler", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L54", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_services_worker_manager", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L57", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_services_circuit_breaker", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L60", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_services_browser_manager", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L63", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L66", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "target": "fastapi", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L66", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_routes", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L147", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_routes", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L151", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "app_routes", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L156", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L160", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L262", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_py", "target": "uvicorn", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L297", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_rationale_67", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L67", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_rationale_161", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L161", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_rationale_263", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/main.py", "source_location": "L263", "weight": 1.0}], "raw_calls": [{"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "callee": "start_scheduler", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L77", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "callee": "create_task", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L91", "receiver": "asyncio"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "callee": "run_worker", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L91", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "callee": "startup_circuit_breaker", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L96", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "callee": "start", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L98", "receiver": "browser_manager"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "callee": "cancel", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L109", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "callee": "shutdown_scheduler", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L115", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_lifespan", "callee": "shutdown", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L116", "receiver": "browser_manager"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "now", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L181", "receiver": "datetime"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get_jobs", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L185", "receiver": "scheduler"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "startswith", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L188", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "startswith", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L189", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "isoformat", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L195", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get_appwrite_db", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L198", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "info", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L203", "receiver": "logger"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get_summary", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L214", "receiver": "ingestion_stats"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "isoformat", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L225", "receiver": "now_utc"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L247", "receiver": "stats"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L248", "receiver": "stats"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L249", "receiver": "stats"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L250", "receiver": "stats"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L251", "receiver": "stats"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L252", "receiver": "stats"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L253", "receiver": "stats"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_root", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L254", "receiver": "stats"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "callee": "get_jobs", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L272", "receiver": "scheduler"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "callee": "get_jobs", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L276", "receiver": "scheduler"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "callee": "append", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L277", "receiver": "jobs_info"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "callee": "isoformat", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L280", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "callee": "isoformat", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L285", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "callee": "now", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L285", "receiver": "datetime"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "callee": "strftime", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L286", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_main_health_check", "callee": "now", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py", "source_location": "L286", "receiver": "datetime"}]}
graphify-out/cache/ast/v0.9.5/5b8213932acd73feafcf8cc6da4a06622d078b983b20eec92bf30d59ab2c9c3e.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"nodes": [{"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "label": "subscription.py", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L1"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberequest", "label": "SubscribeRequest", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L17", "_callable": true}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberequest_validate_preference", "label": ".validate_preference()", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L25", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberesponse", "label": "SubscribeResponse", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L32", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscriberesponse", "label": "UnsubscribeResponse", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L38", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "label": "subscribe()", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L45", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "label": "unsubscribe()", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L108", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscriberequest", "label": "UnsubscribeRequest", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L172", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "label": "unsubscribe_post()", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L177", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscriber_count", "label": "get_subscriber_count()", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L240", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "label": "send_newsletter()", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L263", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "label": "get_subscription_status()", "file_type": "code", "source_file": "app/routes/subscription.py", "source_location": "L315", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_1", "label": "Subscription API Routes Handles newsletter subscriptions and unsubscribe functi", "file_type": "rationale", "source_file": "app/routes/subscription.py", "source_location": "L1"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_46", "label": "Subscribe a user to the newsletter - Adds subscriber to Appwrite (Sol", "file_type": "rationale", "source_file": "app/routes/subscription.py", "source_location": "L46"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_112", "label": "Unsubscribe user via email link Supports Granular Unsubscribe (e.g., 'Morni", "file_type": "rationale", "source_file": "app/routes/subscription.py", "source_location": "L112"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_178", "label": "Unsubscribe via email address (for forms/dashboard) Supports Granular Unsub", "file_type": "rationale", "source_file": "app/routes/subscription.py", "source_location": "L178"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_241", "label": "Get total number of active subscribers from Appwrite", "file_type": "rationale", "source_file": "app/routes/subscription.py", "source_location": "L241"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_267", "label": "Send newsletter to all subscribers (LEGACY ENDPOINT - Use scheduled newsletters", "file_type": "rationale", "source_file": "app/routes/subscription.py", "source_location": "L267"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_316", "label": "Get subscription status by email Required for Dashboard to sync with Appwri", "file_type": "rationale", "source_file": "app/routes/subscription.py", "source_location": "L316"}], "edges": [{"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L5", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "pydantic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L6", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L7", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L8", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "app_services_brevo_email_service", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L10", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "app_services_appwrite_db", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L11", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberequest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L17", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberequest", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L17", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberequest", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberequest_validate_preference", "relation": "method", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L25", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberesponse", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L32", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberesponse", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L32", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscriberesponse", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L38", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscriberesponse", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L38", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L45", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberequest", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L45", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L108", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscriberequest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L172", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscriberequest", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L172", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L177", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscriberequest", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L177", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscriber_count", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L240", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L263", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L315", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberesponse", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L85", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscriberesponse", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L156", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscriberesponse", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L223", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_1", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L1", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_46", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L46", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_112", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L112", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_178", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L178", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_241", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscriber_count", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L241", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_267", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L267", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_rationale_316", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/routes/subscription.py", "source_location": "L316", "weight": 1.0}], "raw_calls": [{"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscriberequest_validate_preference", "callee": "ValueError", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L28", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "callee": "get_brevo_service", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L54", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "callee": "get_appwrite_db", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L55", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "callee": "generate_unsubscribe_token", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L58", "receiver": "brevo"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "callee": "create_subscriber", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L64", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L72", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "callee": "send_welcome_email", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L78", "receiver": "brevo"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L101", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_subscribe", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L103"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "get_appwrite_db", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L117", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "get_brevo_service", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L118", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "get_subscriber_by_token", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L121", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L124", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L129", "receiver": "subscriber"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L130", "receiver": "subscriber"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "update_subscription_status", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L137", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "update_subscriber_status", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L141", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L145", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "send_unsubscribe_confirmation", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L154", "receiver": "brevo"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L166", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L168"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "get_appwrite_db", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L183", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "get_brevo_service", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L184", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "get_subscriber", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L187", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L190", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L195", "receiver": "subscriber"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "update_subscription_status", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L203", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "update_subscriber_status", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L207", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L211", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "send_unsubscribe_confirmation", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L221", "receiver": "brevo"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L233", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_unsubscribe_post", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L235"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscriber_count", "callee": "get_appwrite_db", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L243", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscriber_count", "callee": "get_all_subscribers", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L244", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscriber_count", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L246", "receiver": "s"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscriber_count", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L256", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "callee": "get_appwrite_db", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L275", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "callee": "get_brevo_service", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L276", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "callee": "get_all_subscribers", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L279", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L280", "receiver": "s"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "callee": "fetch_by_category", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L292", "receiver": "news_aggregator"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L309", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_send_newsletter", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L311"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "get_appwrite_db", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L322", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "get_subscriber", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L323", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L335", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L336", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L337", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L338", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L339", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "items", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L345", "receiver": "subscriptions"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L351", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L352", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L353", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L354", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "_safe_get", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L355", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "HTTPException", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L363", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_subscription_get_subscription_status", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py", "source_location": "L365"}]}
graphify-out/cache/ast/v0.9.5/783347828a08021007c473737ad3efc13cc87a66f06f3fd9b43c629af0098924.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"nodes": [{"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "label": "newsletter_service.py", "file_type": "code", "source_file": "app/services/newsletter_service.py", "source_location": "L1"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "label": "get_newsletter_content()", "file_type": "code", "source_file": "app/services/newsletter_service.py", "source_location": "L56", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "label": "send_scheduled_newsletter()", "file_type": "code", "source_file": "app/services/newsletter_service.py", "source_location": "L187", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_preview_newsletter_content", "label": "preview_newsletter_content()", "file_type": "code", "source_file": "app/services/newsletter_service.py", "source_location": "L318", "_callable": true}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_rationale_1", "label": "Newsletter Service Orchestrates newsletter sending with time-based preferences", "file_type": "rationale", "source_file": "app/services/newsletter_service.py", "source_location": "L1"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_rationale_57", "label": "Fetch articles from Appwrite using precise time-windowed application logic.", "file_type": "rationale", "source_file": "app/services/newsletter_service.py", "source_location": "L57"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_rationale_188", "label": "Main newsletter orchestrator. CRITICAL SAFETY CHECKS: 1. Validat", "file_type": "rationale", "source_file": "app/services/newsletter_service.py", "source_location": "L188"}, {"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_rationale_319", "label": "Preview newsletter content without sending emails. Useful for testing and d", "file_type": "rationale", "source_file": "app/services/newsletter_service.py", "source_location": "L319"}], "edges": [{"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L6", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L7", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "pytz", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L8", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "app_services_appwrite_db", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L9", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "app_services_brevo_email_service", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L11", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "app_services_alert_service", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L12", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "app_config", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L13", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L56", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L187", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_preview_newsletter_content", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L318", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L211", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_preview_newsletter_content", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L323", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_rationale_1", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L1", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_rationale_57", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L57", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_rationale_188", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L188", "weight": 1.0}, {"source": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_rationale_319", "target": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_preview_newsletter_content", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/newsletter_service.py", "source_location": "L319", "weight": 1.0}], "raw_calls": [{"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "get_appwrite_db", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L75", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "now", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L83", "receiver": "datetime"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "IST", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L83"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "replace", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L87", "receiver": "now_ist"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "replace", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L88", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "timedelta", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L88", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "replace", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L95", "receiver": "now_ist"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "replace", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L96", "receiver": "now_ist"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "replace", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L103", "receiver": "now_ist"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "replace", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L104", "receiver": "now_ist"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "timedelta", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L112", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "timedelta", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L117", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "timedelta", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L122", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "astimezone", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L125", "receiver": "start_time"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "UTC", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L125"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "astimezone", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L126", "receiver": "end_time"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "UTC", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L126"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "strftime", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L129", "receiver": "start_time"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "strftime", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L129", "receiver": "end_time"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "isoformat", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L130", "receiver": "start_utc"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "isoformat", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L130", "receiver": "end_utc"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "greater_than", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L139", "receiver": "Query"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "isoformat", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L139", "receiver": "start_utc"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "less_than_equal", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L140", "receiver": "Query"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "isoformat", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L140", "receiver": "end_utc"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "order_desc", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L141", "receiver": "Query"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "limit", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L142", "receiver": "Query"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "append", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L150", "receiver": "fetch_tasks"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "get_articles_with_queries", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L150", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "gather", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L152", "receiver": "asyncio"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "list", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L156"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "append", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L157", "receiver": "collections_articles"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "append", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L171", "receiver": "final_articles"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "pop", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L171", "receiver": "list_to_pull_from"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "pop", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L174", "receiver": "collections_articles"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_get_newsletter_content", "callee": "print_exc", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L183", "receiver": "traceback"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "strftime", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L202", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "now", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L202", "receiver": "datetime"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "IST", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L202"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "strftime", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L216", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "now", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L216", "receiver": "datetime"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "IST", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L216"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "alert_zero_articles", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L234", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get_appwrite_db", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L239", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get_subscribers_by_preference", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L240", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get_brevo_service", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L252", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "send_newsletter", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L254", "receiver": "brevo"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L263", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L268", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L269", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "alert_quota_exhausted", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L276", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L279", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L280", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L284", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L284", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L286", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "alert_high_failure_rate", "is_member_call": false, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L287", "receiver": null}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L289", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L290", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L295", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L296", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L297", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L298", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L299", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L303", "receiver": "result"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L306", "receiver": "subscriber"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_send_scheduled_newsletter", "callee": "update_last_sent", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L308", "receiver": "appwrite_db"}, {"caller_nid": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_services_newsletter_service_preview_newsletter_content", "callee": "get", "is_member_call": true, "source_file": "C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py", "source_location": "L329", "receiver": "PREFERENCE_CONFIG"}]}
graphify-out/cache/ast/v0.9.5/de78637e85bfbabca7e0e6f845d1dc532f78b61ea1bc259c11d6a107013f34ff.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"nodes": [{"id": "c_users_hp_desktop_segmento_segmentopulse_backend_segmentopulse_backend_app_routes_analytics_py", "label": "analytics.py", "file_type": "code", "source_file": "app/routes/analytics.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
graphify-out/cache/stat-index.json CHANGED
@@ -1 +1 @@
1
- {"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\__init__.py":{"size":126,"mtime_ns":1781514962444458700,"hash":"eecc1507a271ee3a4f18beb081bf213d5f9bd4cf9f2f556a281a0d8fa29b2e89"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\config.py":{"size":6582,"mtime_ns":1781514962444458700,"hash":"430d2b7dc65a9a4637c73a7fbde416314de7cfa7e5bf5c54dda7f6bbff9500be"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py":{"size":11605,"mtime_ns":1781514962445976100,"hash":"64f695dced18f2112430338c38f35b7ead27b86c8d5730fa3ba39f90263edbca"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\models.py":{"size":3127,"mtime_ns":1781514962445976100,"hash":"d9001854e1ab93723ad394fa1f949fc19738b46e7ae90cc0e478b7161ccddd9d"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\__init__.py":{"size":22,"mtime_ns":1781514962445976100,"hash":"742ae2add47b68e650fef8504d287af6abecf83978226af6af087560abb41722"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\admin.py":{"size":27727,"mtime_ns":1781514962445976100,"hash":"fb668b871345d497c882cbefcc28a1b9c4810c79c18351665bb1da09499678e8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\analytics.py":{"size":1192,"mtime_ns":1781514962445976100,"hash":"b355af6a99f1f55eee5ebe8b568c2d18ac1fe2f99a3711751d9b9ab8220ca592"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\audio.py":{"size":10530,"mtime_ns":1781514962445976100,"hash":"a103a1e162e0afb1a55706bb74a47085be8842c9c241c84b7f899d0af15b75b8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\engagement.py":{"size":15131,"mtime_ns":1781514962450727100,"hash":"eaff5db9762e3ca292b0dae35d8317b550ee1f46ce293002062dc22711cf9212"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\monitoring.py":{"size":9933,"mtime_ns":1781514962450727100,"hash":"134358b12f40b1165cd17b3738e63aca2044d37b94fabd167e6a7aa70b3e85d9"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\news.py":{"size":12605,"mtime_ns":1781514962452321000,"hash":"f90dd26fc055772128c4270e04a1fa516735542c741b17f5dcc461c58ba7be22"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\research.py":{"size":2218,"mtime_ns":1781514962452321000,"hash":"0d58dfceafe2c87e401f83489747af1f343cda1b22c1e33522cd726f92bb7c1c"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\search.py":{"size":1945,"mtime_ns":1781514962452321000,"hash":"efa5c809a91733ee7b1d6bd3f7cf66b762eaf173c7f6cb5fa083599dc810e857"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py":{"size":12168,"mtime_ns":1781514962452321000,"hash":"a1c0540ec3d8b57a66824eca9a8a80d36dc478cfeb76501589cc07740a9bc55e"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\__init__.py":{"size":24,"mtime_ns":1781514962455349800,"hash":"5b8cfe02cefbad85f03afb68d994d8d97405904b4bd0bd20d9b1e5cadecacde6"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\adaptive_scheduler.py":{"size":11160,"mtime_ns":1781514962455349800,"hash":"0a5d97f66b27c9f91b113d126ad03b11b812576d04d6ebe4c009f1f4d75146b8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\alert_service.py":{"size":4928,"mtime_ns":1781514962455349800,"hash":"038c6e84e3d98a1411264a9b3f615b31c9b9eace061618b402a280767b16dd81"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\api_quota.py":{"size":9878,"mtime_ns":1781514962457876500,"hash":"a20ef1242e1e211335205c250e774190d018a57d36401d1afdd78c0b3e7394b9"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\appwrite_db.py":{"size":47040,"mtime_ns":1781523703237664500,"hash":"8d2645050644f00e617cbd76eb1e1b53ccc9ba17ac0b305a98286ceb590011fc"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\audio_service.py":{"size":6012,"mtime_ns":1781514962457876500,"hash":"cc3b8414537f7479ecad0d433b5a309e615e9ff46c842fc7596be687dbf27b80"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\brevo_email_service.py":{"size":20975,"mtime_ns":1781514962462152900,"hash":"5d75bed9cb256f3619daac6abccdd7ebb70f4f218fcb725c719dfdba9a48682d"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\browser_manager.py":{"size":5189,"mtime_ns":1781514962462726000,"hash":"4d4823016603e9cceb42ce428a113db4382c3f5452e9310d22ffe8c057d3bf57"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\cache_service.py":{"size":7035,"mtime_ns":1781514962462726000,"hash":"cb955368034e99b13f8a393bfbc58eedd3fe22759e833bd09df1e8cca3587c05"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\chunker.py":{"size":5752,"mtime_ns":1781514962464232200,"hash":"7c36118097a97f7bd84f5726a15486314d6de5f15d08fb2a2346fb8b5e582166"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\circuit_breaker.py":{"size":22071,"mtime_ns":1781514962464232200,"hash":"90b9478c3634c38f63919559c24f8eb90dc29c97cf2b773ac14bfe1638878724"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\deduplication.py":{"size":11102,"mtime_ns":1781523653921168300,"hash":"000d2c855fcf9b8c76711cdac5d3fddffd4074d01c7cca362f7080a5740e7855"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\document.py":{"size":3884,"mtime_ns":1781514962464232200,"hash":"d621492d4765b4ccf2e838d166a159415e13a94079cd81696affc34d36b34582"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\firebase_service.py":{"size":17726,"mtime_ns":1781514962468275700,"hash":"64734334e205ca9b708003df206d0e28ba6cc58acd252c3bf645478ac80cf910"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\ingestion_metrics.py":{"size":5261,"mtime_ns":1787313822596181000,"hash":"35ba28d6364e854a56c7643c89931ff3515b1b204b084b10ae8b3712dee8007b"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\news_aggregator.py":{"size":26475,"mtime_ns":1781514962468846900,"hash":"c7dd59daa1c5e70ccd64ff4c179e4074c15412d276a2ef3ad5102cf86b177a78"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\news_processor.py":{"size":3809,"mtime_ns":1787313906637289700,"hash":"9e3e9edea2c890ec82498090ca612d5537f6bf932c2c36fada0ed146ed05e2a5"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\news_providers.py":{"size":34676,"mtime_ns":1781514962470368800,"hash":"56b1b3fa71faa6cc58efde0b1d1c0ca614c0bf9fa1bee4067324a6e58b516eb1"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py":{"size":12805,"mtime_ns":1781514962472398000,"hash":"1d765c3377c8bcd49bbfb08d0e84508cfefbebb133e8792f0e353895b39e2024"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\optimized_retrieval.py":{"size":9851,"mtime_ns":1781514962473928100,"hash":"fcbc89ed0c7a85540695901c7e284e34e503f1925db9fb8a87b69bf66a5f8fad"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\professional_logger.py":{"size":6399,"mtime_ns":1781514962473928100,"hash":"e85bbbd3b38075f719a0f6809bae87b4280e94dc4dad8e6028bca6f64df52625"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\__init__.py":{"size":1752,"mtime_ns":1781514962475455400,"hash":"385ab3321c950564601e62fc4218d26217c4f00304472f74c010345a095976ea"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\base.py":{"size":9313,"mtime_ns":1781514962476980300,"hash":"57b50ebdf0d73458cec735d5eac432e3f4334e47ed4dc725a59936184c4ddbc8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\direct_rss\\__init__.py":{"size":674,"mtime_ns":1781514962478503500,"hash":"cd043289907d910a3800cd5859edbc0f7da0ccbd91892df34a7eb8e9657a7661"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\direct_rss\\client.py":{"size":19688,"mtime_ns":1781514962479025500,"hash":"31614ada3763c9c17cf0f2a1ceaf2474e33a18fa7854493743788f79757bc28a"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\hackernews\\__init__.py":{"size":613,"mtime_ns":1781514962481119300,"hash":"2f17a61fd043bfd550ee30b1788d3424bab6e5001d9fa4cfdde03c6faaf8323c"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\hackernews\\client.py":{"size":18418,"mtime_ns":1781514962482236800,"hash":"ec532d68ff5a12d4b42909ac7827f34dfdb81ae86febce49bbb492339f778013"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\inshorts\\__init__.py":{"size":750,"mtime_ns":1781514962482236800,"hash":"6e838f96679fcfe0a20b58daaa05911c9b0347471c281c87b014d8f81880396e"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\inshorts\\client.py":{"size":18730,"mtime_ns":1781514962484182700,"hash":"6795095f0135d94c2913a584c395fb1b3c4662f8fd123b0459e097b36ea7dff6"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\openrss\\__init__.py":{"size":1051,"mtime_ns":1781514962485786300,"hash":"d17118862f8c962b6153c9bb0dc40a1cc722ca5ff016e10bacf96d927f1a0f27"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\openrss\\client.py":{"size":18552,"mtime_ns":1781514962485786300,"hash":"2875632a56bfc96ea45e23853673f42c384b3829fa832d14c163c8cadf976dc5"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\sauravkanchan\\__init__.py":{"size":841,"mtime_ns":1781514962487313200,"hash":"a2806a359871aafb0ded3287238ff5b4b242266369f29342e88b82236e291669"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\sauravkanchan\\client.py":{"size":18135,"mtime_ns":1781514962487313200,"hash":"d374f0d9ad604b36335d8f45d1f38264bf11dcfe2270cf00134bd4c00e7d4ed0"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\thenewsapi\\__init__.py":{"size":764,"mtime_ns":1781514962489946100,"hash":"1f1346de349d92722fccd70c5b70202ba30f5dd1ca199e964d2a3b97b08f79fa"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\thenewsapi\\client.py":{"size":18718,"mtime_ns":1781514962490470500,"hash":"db30db5c6deaa34356407cb6df61d2d16d776f7d29ece5f7c86e9e6c2f5dc3ce"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\webz\\__init__.py":{"size":995,"mtime_ns":1781514962490470500,"hash":"5989123cafe0c1ccde0a01bda7aa654fcc736ac5b50d031ee58070cf0a79091c"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\webz\\client.py":{"size":22054,"mtime_ns":1781514962493040000,"hash":"dfffd2cbf83adcb99fe2a72837cf7a29f1b8556d37ed7e9fcc2e19a60d6291d5"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\wikinews\\__init__.py":{"size":915,"mtime_ns":1781514962494189900,"hash":"d57fb68c4231418cd4ad87e6b1e1d63ef4a7b15e87a32ec9a25aa91381b25deb"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\wikinews\\client.py":{"size":21502,"mtime_ns":1781514962494716200,"hash":"0937e6b61dd4ae616dd81bb8050939fb2dba87f05228ecb124281344a26a05c8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\worldnewsai\\__init__.py":{"size":1275,"mtime_ns":1781514962494716200,"hash":"439895ca37a32b6ca6d8cfdc0cb3f5f23a38539bc19a0fd2071b85d04cd9b7f1"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\worldnewsai\\client.py":{"size":19640,"mtime_ns":1781514962494716200,"hash":"9096fc125452073983582af258bf2694e78cd70090a1dffe8cc4b761da64d84c"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\research_aggregator.py":{"size":8055,"mtime_ns":1781514962494716200,"hash":"3ad4b4d007bd06b46a03271b9c3e5c7ec5af8a4c14c50f1476fb790cdb410963"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\rss_parser.py":{"size":9502,"mtime_ns":1781514962494716200,"hash":"6bdd5339ab694d37483c2b55529056cef3d708354d6ee7f4a071e5cdde80080e"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\scheduler.py":{"size":46098,"mtime_ns":1781523637254985200,"hash":"498313dbadf4c80e12b52838baf31fbfbbc41b0c52052e2d8a8d785b200b66d6"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\upstash_cache.py":{"size":13597,"mtime_ns":1781514962500371800,"hash":"3bca0f62133e053bdd7c2b5b646e7c737faaeeb7a631eb546fd68b66c24ec941"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\utils\\__init__.py":{"size":561,"mtime_ns":1781514962502507000,"hash":"62681459c997dc2f764eb7b90cf025b9095064b21b2e85c3d9c94c103c26f3b2"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\utils\\image_enricher.py":{"size":8540,"mtime_ns":1781514962502507000,"hash":"09a84beee2fef2efdb41f6b79f199709b1e1b9da1c02fcd638d31401d953de3b"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\utils\\provider_state.py":{"size":12204,"mtime_ns":1781514962502507000,"hash":"816730167dce1598d851f012d64013c8098e0ed35a553080c9ac28b93314acb2"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\worker_manager.py":{"size":7826,"mtime_ns":1781514962502507000,"hash":"d20529d19e5acf76d92917f7b4eadce32ab0285c719f7dbddb027b4d9843ccc0"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils.py":{"size":3850,"mtime_ns":1781514962505597200,"hash":"af0157ce82f4a58535388740decebec619d76f8faebc5eb73ec68ec3dfd2ce59"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\__init__.py":{"size":167,"mtime_ns":1781514962508122200,"hash":"6e1c6fbce3c4af8b317a2deff50e734bbae17059b9cb68049ea3379bb991e9d2"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\cursor_pagination.py":{"size":4891,"mtime_ns":1781514962508122200,"hash":"d3b8e19cf36c2c735f7b861590a2d3016e0727567099960261085270a76090a9"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\custom_logger.py":{"size":8361,"mtime_ns":1781514962508122200,"hash":"7dc6ce505c69a89c92407433336106f836db682f85c8b9de9fc73f8a759b1b2f"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\data_validation.py":{"size":28386,"mtime_ns":1787313714328601600,"hash":"3bf3510609808b0c707c328e4bc30d60b25fd740bc72c1de8a770c743e2656c0"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\date_parser.py":{"size":3998,"mtime_ns":1781514962511734200,"hash":"a10aebfb8c15a302fb9b8e7b13e89bab305432cb99083619280257bef5a87aa8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\helpers.py":{"size":1338,"mtime_ns":1781514962512810600,"hash":"59d0384f99ed3de4cc9d97268caf6e80131f460aaf9afd271e673a050beaef48"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\id_generator.py":{"size":3986,"mtime_ns":1781523720441230400,"hash":"c0161c88cc0e31b4aeede40987b30e87316729b0e8fe75f7fd7051da3157805d"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\query_builder.py":{"size":7589,"mtime_ns":1781514962514335100,"hash":"734b875389b3fbe402ceff84faf0e0118dc756b7db41d7a1e0eb6d1b6e54edb3"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\ranking.py":{"size":6030,"mtime_ns":1781514962514335100,"hash":"92799c4fe91c5e6fd7147661b8e2efb28ec5851a99f6535bd2362b189d745b39"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\redis_dedup.py":{"size":4307,"mtime_ns":1781514962516417400,"hash":"ffedb3998d4563b85bc83e09de07d52afd72ba73229fe6b8bca5b213ecac8ef9"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\stale_while_revalidate.py":{"size":6160,"mtime_ns":1781514962516417400,"hash":"b2d24b031af38107a08723cd801da77bad66264d990c031ab1823ee83e2eda60"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\url_canonicalization.py":{"size":5184,"mtime_ns":1781514962516417400,"hash":"6b30bd425d89f59b871fc9528eeed5770082bdfadbc34c158bb644006c804480"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\data\\velocity_tracking.json":{"size":4982,"mtime_ns":1781514962518434200,"hash":"e2a3297a20d734d2eeecbfa746bb4c616730344478091b5924752f9afc1dcfef"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\deploy.ps1":{"size":2894,"mtime_ns":1781514962520446400,"hash":"25f371f466f58c988c5df1c00815af17f031ac53390f3304a436ea8599c53d9f"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\run.py":{"size":712,"mtime_ns":1781514962609903800,"hash":"b528c588351a8cb9b86263632c136a47809766b8417e98a8f1b41ad0c9737e8e"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\.agents\\rules\\graphify.md":{"size":963,"mtime_ns":1781514962439681700,"hash":"da57cf34efdec417e86e41fbbcc003efc293da263f6d2edf277f72f2429bd7d4"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\.agents\\workflows\\graphify.md":{"size":287,"mtime_ns":1781514962440723300,"hash":"02a10022db4416c89203d0bb199d5b2f48da01fb2962bb28adff3ca65ba10260"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\README.md":{"size":1780,"mtime_ns":1781514962443911200,"hash":"391cc76e75cc24c2baeeec4acc44ce8cc24660df2e51a926c7d29466e746a3ef"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\requirements.txt":{"size":1403,"mtime_ns":1781514962608238000,"hash":"7dfd75e13c9a9666f57548f107176909ac155140ad5ef07efa64612f7d7f61ba"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\tests\\test_quality_rescue.py":{"size":4158,"mtime_ns":1787313849459781700,"hash":"4079330b0e3ebe2d9619f40469ae90be4e88da73740935a2a71e58ff02d8180a"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\tests\\test_smoke.py":{"size":34,"mtime_ns":1787313339865948500,"hash":"5f4d982648bf6a9651645dad2592fd0d924e901ee47f36cf0746a54e7a60ecc3"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\SPEC_quality_score_rescue.md":{"size":8975,"mtime_ns":1787312784771173900,"hash":"788cd197abfbc6ecb1896cfb0a4512a9bb7603020857f20c592b45f4a7795a31"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\TICKETS_quality_score_rescue.md":{"size":7365,"mtime_ns":1787312756814512100,"hash":"2e14945c0cd4ef32cc5ae2c93f84447d94286a368c940f5d90168d2e6c5af3be"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\UBIQUITOUS_LANGUAGE.md":{"size":4060,"mtime_ns":1787312797962652000,"hash":"ecc920e9fbcafaa88997a0402105ff80b8c0edf22a726f4a8d870874669677c0"}}
 
1
+ {"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\__init__.py":{"size":126,"mtime_ns":1781514962444458700,"hash":"eecc1507a271ee3a4f18beb081bf213d5f9bd4cf9f2f556a281a0d8fa29b2e89"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\config.py":{"size":6582,"mtime_ns":1781514962444458700,"hash":"430d2b7dc65a9a4637c73a7fbde416314de7cfa7e5bf5c54dda7f6bbff9500be"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\main.py":{"size":11513,"mtime_ns":1787560164227792700,"hash":"4015dd2120abc1b10e107930ad2e461104dc0f8d4b92099117657b7401ead048"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\models.py":{"size":3127,"mtime_ns":1781514962445976100,"hash":"d9001854e1ab93723ad394fa1f949fc19738b46e7ae90cc0e478b7161ccddd9d"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\__init__.py":{"size":22,"mtime_ns":1781514962445976100,"hash":"742ae2add47b68e650fef8504d287af6abecf83978226af6af087560abb41722"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\admin.py":{"size":27727,"mtime_ns":1781514962445976100,"hash":"fb668b871345d497c882cbefcc28a1b9c4810c79c18351665bb1da09499678e8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\analytics.py":{"size":49,"mtime_ns":1787560197983953900,"hash":"de78637e85bfbabca7e0e6f845d1dc532f78b61ea1bc259c11d6a107013f34ff"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\audio.py":{"size":10530,"mtime_ns":1781514962445976100,"hash":"a103a1e162e0afb1a55706bb74a47085be8842c9c241c84b7f899d0af15b75b8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\engagement.py":{"size":15131,"mtime_ns":1781514962450727100,"hash":"eaff5db9762e3ca292b0dae35d8317b550ee1f46ce293002062dc22711cf9212"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\monitoring.py":{"size":9933,"mtime_ns":1781514962450727100,"hash":"134358b12f40b1165cd17b3738e63aca2044d37b94fabd167e6a7aa70b3e85d9"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\news.py":{"size":12605,"mtime_ns":1781514962452321000,"hash":"f90dd26fc055772128c4270e04a1fa516735542c741b17f5dcc461c58ba7be22"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\research.py":{"size":2218,"mtime_ns":1781514962452321000,"hash":"0d58dfceafe2c87e401f83489747af1f343cda1b22c1e33522cd726f92bb7c1c"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\search.py":{"size":1945,"mtime_ns":1781514962452321000,"hash":"efa5c809a91733ee7b1d6bd3f7cf66b762eaf173c7f6cb5fa083599dc810e857"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\routes\\subscription.py":{"size":12249,"mtime_ns":1787563549028880600,"hash":"5b8213932acd73feafcf8cc6da4a06622d078b983b20eec92bf30d59ab2c9c3e"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\__init__.py":{"size":24,"mtime_ns":1781514962455349800,"hash":"5b8cfe02cefbad85f03afb68d994d8d97405904b4bd0bd20d9b1e5cadecacde6"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\adaptive_scheduler.py":{"size":11160,"mtime_ns":1781514962455349800,"hash":"0a5d97f66b27c9f91b113d126ad03b11b812576d04d6ebe4c009f1f4d75146b8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\alert_service.py":{"size":4928,"mtime_ns":1781514962455349800,"hash":"038c6e84e3d98a1411264a9b3f615b31c9b9eace061618b402a280767b16dd81"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\api_quota.py":{"size":9878,"mtime_ns":1781514962457876500,"hash":"a20ef1242e1e211335205c250e774190d018a57d36401d1afdd78c0b3e7394b9"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\appwrite_db.py":{"size":47040,"mtime_ns":1781523703237664500,"hash":"8d2645050644f00e617cbd76eb1e1b53ccc9ba17ac0b305a98286ceb590011fc"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\audio_service.py":{"size":6012,"mtime_ns":1781514962457876500,"hash":"cc3b8414537f7479ecad0d433b5a309e615e9ff46c842fc7596be687dbf27b80"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\brevo_email_service.py":{"size":20975,"mtime_ns":1781514962462152900,"hash":"5d75bed9cb256f3619daac6abccdd7ebb70f4f218fcb725c719dfdba9a48682d"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\browser_manager.py":{"size":5189,"mtime_ns":1781514962462726000,"hash":"4d4823016603e9cceb42ce428a113db4382c3f5452e9310d22ffe8c057d3bf57"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\cache_service.py":{"size":7035,"mtime_ns":1781514962462726000,"hash":"cb955368034e99b13f8a393bfbc58eedd3fe22759e833bd09df1e8cca3587c05"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\chunker.py":{"size":5752,"mtime_ns":1781514962464232200,"hash":"7c36118097a97f7bd84f5726a15486314d6de5f15d08fb2a2346fb8b5e582166"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\circuit_breaker.py":{"size":22071,"mtime_ns":1781514962464232200,"hash":"90b9478c3634c38f63919559c24f8eb90dc29c97cf2b773ac14bfe1638878724"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\deduplication.py":{"size":11102,"mtime_ns":1781523653921168300,"hash":"000d2c855fcf9b8c76711cdac5d3fddffd4074d01c7cca362f7080a5740e7855"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\document.py":{"size":3884,"mtime_ns":1781514962464232200,"hash":"d621492d4765b4ccf2e838d166a159415e13a94079cd81696affc34d36b34582"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\firebase_service.py":{"size":84,"mtime_ns":1787560217544305700,"hash":"1c3f57689ce70e2b13e423b55681cdaaed4d952d420c978f01327190664f0e67"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\ingestion_metrics.py":{"size":5261,"mtime_ns":1787313822596181000,"hash":"35ba28d6364e854a56c7643c89931ff3515b1b204b084b10ae8b3712dee8007b"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\news_aggregator.py":{"size":26475,"mtime_ns":1781514962468846900,"hash":"c7dd59daa1c5e70ccd64ff4c179e4074c15412d276a2ef3ad5102cf86b177a78"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\news_processor.py":{"size":3809,"mtime_ns":1787313906637289700,"hash":"9e3e9edea2c890ec82498090ca612d5537f6bf932c2c36fada0ed146ed05e2a5"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\news_providers.py":{"size":34676,"mtime_ns":1781514962470368800,"hash":"56b1b3fa71faa6cc58efde0b1d1c0ca614c0bf9fa1bee4067324a6e58b516eb1"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\newsletter_service.py":{"size":12743,"mtime_ns":1787560901560863300,"hash":"783347828a08021007c473737ad3efc13cc87a66f06f3fd9b43c629af0098924"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\optimized_retrieval.py":{"size":9851,"mtime_ns":1781514962473928100,"hash":"fcbc89ed0c7a85540695901c7e284e34e503f1925db9fb8a87b69bf66a5f8fad"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\professional_logger.py":{"size":6399,"mtime_ns":1781514962473928100,"hash":"e85bbbd3b38075f719a0f6809bae87b4280e94dc4dad8e6028bca6f64df52625"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\__init__.py":{"size":1752,"mtime_ns":1781514962475455400,"hash":"385ab3321c950564601e62fc4218d26217c4f00304472f74c010345a095976ea"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\base.py":{"size":9313,"mtime_ns":1781514962476980300,"hash":"57b50ebdf0d73458cec735d5eac432e3f4334e47ed4dc725a59936184c4ddbc8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\direct_rss\\__init__.py":{"size":674,"mtime_ns":1781514962478503500,"hash":"cd043289907d910a3800cd5859edbc0f7da0ccbd91892df34a7eb8e9657a7661"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\direct_rss\\client.py":{"size":19688,"mtime_ns":1781514962479025500,"hash":"31614ada3763c9c17cf0f2a1ceaf2474e33a18fa7854493743788f79757bc28a"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\hackernews\\__init__.py":{"size":613,"mtime_ns":1781514962481119300,"hash":"2f17a61fd043bfd550ee30b1788d3424bab6e5001d9fa4cfdde03c6faaf8323c"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\hackernews\\client.py":{"size":18418,"mtime_ns":1781514962482236800,"hash":"ec532d68ff5a12d4b42909ac7827f34dfdb81ae86febce49bbb492339f778013"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\inshorts\\__init__.py":{"size":750,"mtime_ns":1781514962482236800,"hash":"6e838f96679fcfe0a20b58daaa05911c9b0347471c281c87b014d8f81880396e"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\inshorts\\client.py":{"size":18730,"mtime_ns":1781514962484182700,"hash":"6795095f0135d94c2913a584c395fb1b3c4662f8fd123b0459e097b36ea7dff6"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\openrss\\__init__.py":{"size":1051,"mtime_ns":1781514962485786300,"hash":"d17118862f8c962b6153c9bb0dc40a1cc722ca5ff016e10bacf96d927f1a0f27"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\openrss\\client.py":{"size":18552,"mtime_ns":1781514962485786300,"hash":"2875632a56bfc96ea45e23853673f42c384b3829fa832d14c163c8cadf976dc5"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\sauravkanchan\\__init__.py":{"size":841,"mtime_ns":1781514962487313200,"hash":"a2806a359871aafb0ded3287238ff5b4b242266369f29342e88b82236e291669"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\sauravkanchan\\client.py":{"size":18135,"mtime_ns":1781514962487313200,"hash":"d374f0d9ad604b36335d8f45d1f38264bf11dcfe2270cf00134bd4c00e7d4ed0"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\thenewsapi\\__init__.py":{"size":764,"mtime_ns":1781514962489946100,"hash":"1f1346de349d92722fccd70c5b70202ba30f5dd1ca199e964d2a3b97b08f79fa"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\thenewsapi\\client.py":{"size":18718,"mtime_ns":1781514962490470500,"hash":"db30db5c6deaa34356407cb6df61d2d16d776f7d29ece5f7c86e9e6c2f5dc3ce"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\webz\\__init__.py":{"size":995,"mtime_ns":1781514962490470500,"hash":"5989123cafe0c1ccde0a01bda7aa654fcc736ac5b50d031ee58070cf0a79091c"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\webz\\client.py":{"size":22054,"mtime_ns":1781514962493040000,"hash":"dfffd2cbf83adcb99fe2a72837cf7a29f1b8556d37ed7e9fcc2e19a60d6291d5"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\wikinews\\__init__.py":{"size":915,"mtime_ns":1781514962494189900,"hash":"d57fb68c4231418cd4ad87e6b1e1d63ef4a7b15e87a32ec9a25aa91381b25deb"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\wikinews\\client.py":{"size":21502,"mtime_ns":1781514962494716200,"hash":"0937e6b61dd4ae616dd81bb8050939fb2dba87f05228ecb124281344a26a05c8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\worldnewsai\\__init__.py":{"size":1275,"mtime_ns":1781514962494716200,"hash":"439895ca37a32b6ca6d8cfdc0cb3f5f23a38539bc19a0fd2071b85d04cd9b7f1"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\providers\\worldnewsai\\client.py":{"size":19640,"mtime_ns":1781514962494716200,"hash":"9096fc125452073983582af258bf2694e78cd70090a1dffe8cc4b761da64d84c"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\research_aggregator.py":{"size":8055,"mtime_ns":1781514962494716200,"hash":"3ad4b4d007bd06b46a03271b9c3e5c7ec5af8a4c14c50f1476fb790cdb410963"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\rss_parser.py":{"size":9502,"mtime_ns":1781514962494716200,"hash":"6bdd5339ab694d37483c2b55529056cef3d708354d6ee7f4a071e5cdde80080e"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\scheduler.py":{"size":46098,"mtime_ns":1781523637254985200,"hash":"498313dbadf4c80e12b52838baf31fbfbbc41b0c52052e2d8a8d785b200b66d6"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\upstash_cache.py":{"size":13597,"mtime_ns":1781514962500371800,"hash":"3bca0f62133e053bdd7c2b5b646e7c737faaeeb7a631eb546fd68b66c24ec941"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\utils\\__init__.py":{"size":561,"mtime_ns":1781514962502507000,"hash":"62681459c997dc2f764eb7b90cf025b9095064b21b2e85c3d9c94c103c26f3b2"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\utils\\image_enricher.py":{"size":8540,"mtime_ns":1781514962502507000,"hash":"09a84beee2fef2efdb41f6b79f199709b1e1b9da1c02fcd638d31401d953de3b"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\utils\\provider_state.py":{"size":12204,"mtime_ns":1781514962502507000,"hash":"816730167dce1598d851f012d64013c8098e0ed35a553080c9ac28b93314acb2"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\services\\worker_manager.py":{"size":7826,"mtime_ns":1781514962502507000,"hash":"d20529d19e5acf76d92917f7b4eadce32ab0285c719f7dbddb027b4d9843ccc0"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils.py":{"size":3850,"mtime_ns":1781514962505597200,"hash":"af0157ce82f4a58535388740decebec619d76f8faebc5eb73ec68ec3dfd2ce59"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\__init__.py":{"size":167,"mtime_ns":1781514962508122200,"hash":"6e1c6fbce3c4af8b317a2deff50e734bbae17059b9cb68049ea3379bb991e9d2"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\cursor_pagination.py":{"size":4891,"mtime_ns":1781514962508122200,"hash":"d3b8e19cf36c2c735f7b861590a2d3016e0727567099960261085270a76090a9"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\custom_logger.py":{"size":8361,"mtime_ns":1781514962508122200,"hash":"7dc6ce505c69a89c92407433336106f836db682f85c8b9de9fc73f8a759b1b2f"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\data_validation.py":{"size":28386,"mtime_ns":1787313714328601600,"hash":"3bf3510609808b0c707c328e4bc30d60b25fd740bc72c1de8a770c743e2656c0"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\date_parser.py":{"size":3998,"mtime_ns":1781514962511734200,"hash":"a10aebfb8c15a302fb9b8e7b13e89bab305432cb99083619280257bef5a87aa8"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\helpers.py":{"size":1338,"mtime_ns":1781514962512810600,"hash":"59d0384f99ed3de4cc9d97268caf6e80131f460aaf9afd271e673a050beaef48"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\id_generator.py":{"size":3986,"mtime_ns":1781523720441230400,"hash":"c0161c88cc0e31b4aeede40987b30e87316729b0e8fe75f7fd7051da3157805d"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\query_builder.py":{"size":7589,"mtime_ns":1781514962514335100,"hash":"734b875389b3fbe402ceff84faf0e0118dc756b7db41d7a1e0eb6d1b6e54edb3"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\ranking.py":{"size":6030,"mtime_ns":1781514962514335100,"hash":"92799c4fe91c5e6fd7147661b8e2efb28ec5851a99f6535bd2362b189d745b39"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\redis_dedup.py":{"size":4307,"mtime_ns":1781514962516417400,"hash":"ffedb3998d4563b85bc83e09de07d52afd72ba73229fe6b8bca5b213ecac8ef9"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\stale_while_revalidate.py":{"size":6160,"mtime_ns":1781514962516417400,"hash":"b2d24b031af38107a08723cd801da77bad66264d990c031ab1823ee83e2eda60"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\app\\utils\\url_canonicalization.py":{"size":5184,"mtime_ns":1781514962516417400,"hash":"6b30bd425d89f59b871fc9528eeed5770082bdfadbc34c158bb644006c804480"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\data\\velocity_tracking.json":{"size":4982,"mtime_ns":1781514962518434200,"hash":"e2a3297a20d734d2eeecbfa746bb4c616730344478091b5924752f9afc1dcfef"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\deploy.ps1":{"size":2894,"mtime_ns":1781514962520446400,"hash":"25f371f466f58c988c5df1c00815af17f031ac53390f3304a436ea8599c53d9f"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\run.py":{"size":712,"mtime_ns":1781514962609903800,"hash":"b528c588351a8cb9b86263632c136a47809766b8417e98a8f1b41ad0c9737e8e"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\.agents\\rules\\graphify.md":{"size":963,"mtime_ns":1781514962439681700,"hash":"da57cf34efdec417e86e41fbbcc003efc293da263f6d2edf277f72f2429bd7d4"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\.agents\\workflows\\graphify.md":{"size":287,"mtime_ns":1781514962440723300,"hash":"02a10022db4416c89203d0bb199d5b2f48da01fb2962bb28adff3ca65ba10260"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\README.md":{"size":1780,"mtime_ns":1781514962443911200,"hash":"391cc76e75cc24c2baeeec4acc44ce8cc24660df2e51a926c7d29466e746a3ef"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\requirements.txt":{"size":1403,"mtime_ns":1781514962608238000,"hash":"7dfd75e13c9a9666f57548f107176909ac155140ad5ef07efa64612f7d7f61ba"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\tests\\test_quality_rescue.py":{"size":4158,"mtime_ns":1787313849459781700,"hash":"4079330b0e3ebe2d9619f40469ae90be4e88da73740935a2a71e58ff02d8180a"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\tests\\test_smoke.py":{"size":34,"mtime_ns":1787313339865948500,"hash":"5f4d982648bf6a9651645dad2592fd0d924e901ee47f36cf0746a54e7a60ecc3"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\SPEC_quality_score_rescue.md":{"size":8975,"mtime_ns":1787312784771173900,"hash":"788cd197abfbc6ecb1896cfb0a4512a9bb7603020857f20c592b45f4a7795a31"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\TICKETS_quality_score_rescue.md":{"size":7365,"mtime_ns":1787312756814512100,"hash":"2e14945c0cd4ef32cc5ae2c93f84447d94286a368c940f5d90168d2e6c5af3be"},"C:\\Users\\HP\\Desktop\\Segmento\\SegmentoPulse-Backend\\SegmentoPulse\\backend\\UBIQUITOUS_LANGUAGE.md":{"size":4060,"mtime_ns":1787312797962652000,"hash":"ecc920e9fbcafaa88997a0402105ff80b8c0edf22a726f4a8d870874669677c0"}}
graphify-out/graph.html CHANGED
The diff for this file is too large to render. See raw diff
 
graphify-out/graph.json CHANGED
The diff for this file is too large to render. See raw diff
 
graphify-out/manifest.json CHANGED
@@ -10,9 +10,9 @@
10
  "semantic_hash": "387b663b09b63c21c265e656853e0400"
11
  },
12
  "app/main.py": {
13
- "mtime": 1781514962.445976,
14
- "ast_hash": "eddea8a538c5a6721ade6dbd4dab9589",
15
- "semantic_hash": "eddea8a538c5a6721ade6dbd4dab9589"
16
  },
17
  "app/models.py": {
18
  "mtime": 1781514962.445976,
@@ -30,9 +30,9 @@
30
  "semantic_hash": "67f26b72218fb0f3953b572ce1a5d1cc"
31
  },
32
  "app/routes/analytics.py": {
33
- "mtime": 1781514962.445976,
34
- "ast_hash": "4afb12153724a8816bd58caf48ad8c24",
35
- "semantic_hash": "4afb12153724a8816bd58caf48ad8c24"
36
  },
37
  "app/routes/audio.py": {
38
  "mtime": 1781514962.445976,
@@ -65,9 +65,9 @@
65
  "semantic_hash": "624423d802fb0621c1c130de6a96bc75"
66
  },
67
  "app/routes/subscription.py": {
68
- "mtime": 1781514962.452321,
69
- "ast_hash": "9febe3bd7d3e474f781cfe47a904ea94",
70
- "semantic_hash": "9febe3bd7d3e474f781cfe47a904ea94"
71
  },
72
  "app/services/__init__.py": {
73
  "mtime": 1781514962.4553497,
@@ -135,9 +135,9 @@
135
  "semantic_hash": "1fe592c432c159b50b7198ee0e3ce143"
136
  },
137
  "app/services/firebase_service.py": {
138
- "mtime": 1781514962.4682758,
139
- "ast_hash": "9aed768ac1ab1b097db8c3495e4accde",
140
- "semantic_hash": "9aed768ac1ab1b097db8c3495e4accde"
141
  },
142
  "app/services/ingestion_metrics.py": {
143
  "mtime": 1787313822.596181,
@@ -160,9 +160,9 @@
160
  "semantic_hash": "befbcb63100bc42f6374978bd6f474de"
161
  },
162
  "app/services/newsletter_service.py": {
163
- "mtime": 1781514962.472398,
164
- "ast_hash": "5ad6c439580e46a7ffab0dc1c53c4be1",
165
- "semantic_hash": "5ad6c439580e46a7ffab0dc1c53c4be1"
166
  },
167
  "app/services/optimized_retrieval.py": {
168
  "mtime": 1781514962.4739282,
@@ -410,9 +410,9 @@
410
  "semantic_hash": "4f0f6f724db6ac098ce46e58f924cd00"
411
  },
412
  "requirements.txt": {
413
- "mtime": 1781514962.608238,
414
- "ast_hash": "c6d261f13470968633d01d75c69bccd5",
415
- "semantic_hash": "c6d261f13470968633d01d75c69bccd5"
416
  },
417
  "tests/test_quality_rescue.py": {
418
  "mtime": 1787313849.4597816,
 
10
  "semantic_hash": "387b663b09b63c21c265e656853e0400"
11
  },
12
  "app/main.py": {
13
+ "mtime": 1787560164.2277927,
14
+ "ast_hash": "32c183e08563cde0425013898d9951da",
15
+ "semantic_hash": ""
16
  },
17
  "app/models.py": {
18
  "mtime": 1781514962.445976,
 
30
  "semantic_hash": "67f26b72218fb0f3953b572ce1a5d1cc"
31
  },
32
  "app/routes/analytics.py": {
33
+ "mtime": 1787560197.983954,
34
+ "ast_hash": "c09d7c9738a40d395d0b12923696c8e5",
35
+ "semantic_hash": ""
36
  },
37
  "app/routes/audio.py": {
38
  "mtime": 1781514962.445976,
 
65
  "semantic_hash": "624423d802fb0621c1c130de6a96bc75"
66
  },
67
  "app/routes/subscription.py": {
68
+ "mtime": 1787563549.0288806,
69
+ "ast_hash": "ceac23dd155a1a3efed2d054804df90b",
70
+ "semantic_hash": ""
71
  },
72
  "app/services/__init__.py": {
73
  "mtime": 1781514962.4553497,
 
135
  "semantic_hash": "1fe592c432c159b50b7198ee0e3ce143"
136
  },
137
  "app/services/firebase_service.py": {
138
+ "mtime": 1787560217.5443058,
139
+ "ast_hash": "eade08a32f368fca596965fd0ac09816",
140
+ "semantic_hash": ""
141
  },
142
  "app/services/ingestion_metrics.py": {
143
  "mtime": 1787313822.596181,
 
160
  "semantic_hash": "befbcb63100bc42f6374978bd6f474de"
161
  },
162
  "app/services/newsletter_service.py": {
163
+ "mtime": 1787560901.5608633,
164
+ "ast_hash": "8f66b5eced36015e4c0afe790000d6bf",
165
+ "semantic_hash": ""
166
  },
167
  "app/services/optimized_retrieval.py": {
168
  "mtime": 1781514962.4739282,
 
410
  "semantic_hash": "4f0f6f724db6ac098ce46e58f924cd00"
411
  },
412
  "requirements.txt": {
413
+ "mtime": 1787560182.8633618,
414
+ "ast_hash": "b3469a177d2afa5b7dfe5240a24642ba",
415
+ "semantic_hash": ""
416
  },
417
  "tests/test_quality_rescue.py": {
418
  "mtime": 1787313849.4597816,