diff --git a/graphify-out/.graphify_python b/graphify-out/.graphify_python
new file mode 100644
index 0000000..f43a6d5
--- /dev/null
+++ b/graphify-out/.graphify_python
@@ -0,0 +1 @@
+C:\Users\윤정민\AppData\Roaming\uv\tools\graphifyy\Scripts\python.exe
\ No newline at end of file
diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md
new file mode 100644
index 0000000..a61c402
--- /dev/null
+++ b/graphify-out/GRAPH_REPORT.md
@@ -0,0 +1,151 @@
+`# Graph Report - docs/data-patterns (2026-05-29)
+
+## Corpus Check
+- Corpus is ~13,070 words - fits in a single context window. You may not need a graph.
+
+## Summary
+- 173 nodes · 177 edges · 28 communities (12 shown, 16 thin omitted)
+- Extraction: 97% EXTRACTED · 3% INFERRED · 0% AMBIGUOUS · INFERRED: 5 edges (avg confidence: 0.91)
+- Token cost: 154,966 input · 0 output
+
+## Community Hubs (Navigation)
+- [[_COMMUNITY_ReadWrite Optimization Fixes|Read/Write Optimization Fixes]]
+- [[_COMMUNITY_Archive & Stats Pipeline|Archive & Stats Pipeline]]
+- [[_COMMUNITY_Scoreboard & User Write Fixes|Scoreboard & User Write Fixes]]
+- [[_COMMUNITY_Client User Auth & Profile|Client User Auth & Profile]]
+- [[_COMMUNITY_Server Cron & Game Sync|Server Cron & Game Sync]]
+- [[_COMMUNITY_Client KBO Data (RankPlayer)|Client KBO Data (Rank/Player)]]
+- [[_COMMUNITY_Client KBO Schedule & GameDetail|Client KBO Schedule & GameDetail]]
+- [[_COMMUNITY_Prediction Vote Flow|Prediction Vote Flow]]
+- [[_COMMUNITY_Server Vote & RTDB Layer|Server Vote & RTDB Layer]]
+- [[_COMMUNITY_Game Trigger & Stats Invalidation|Game Trigger & Stats Invalidation]]
+- [[_COMMUNITY_Attendance & Notification|Attendance & Notification]]
+- [[_COMMUNITY_Attendance Service (Server)|Attendance Service (Server)]]
+- [[_COMMUNITY_kboCache & Lock|kboCache & Lock]]
+- [[_COMMUNITY_User Profile Service|User Profile Service]]
+- [[_COMMUNITY_Scoreboard Cache|Scoreboard Cache]]
+- [[_COMMUNITY_Nickname Reservation|Nickname Reservation]]
+- [[_COMMUNITY_voteHistory Subcollection|voteHistory Subcollection]]
+- [[_COMMUNITY_pointLedger Subcollection|pointLedger Subcollection]]
+- [[_COMMUNITY_Firebase Auth (Client)|Firebase Auth (Client)]]
+- [[_COMMUNITY_Remote Config (Client)|Remote Config (Client)]]
+- [[_COMMUNITY_Firestore Trigger|Firestore Trigger]]
+- [[_COMMUNITY_rankSnapshot Service|rankSnapshot Service]]
+- [[_COMMUNITY_KBO External API|KBO External API]]
+- [[_COMMUNITY_MemCache (In-Memory)|MemCache (In-Memory)]]
+- [[_COMMUNITY_RTDB userVotes Path|RTDB userVotes Path]]
+- [[_COMMUNITY_RTDB scoreboardCache|RTDB scoreboardCache]]
+- [[_COMMUNITY_Client Prediction Provider|Client Prediction Provider]]
+- [[_COMMUNITY_Stats Cache (RTDB)|Stats Cache (RTDB)]]
+
+## God Nodes (most connected - your core abstractions)
+1. `userService (Server)` - 7 edges
+2. `dailyArchive Cron (03:00 KST)` - 7 edges
+3. `UserRepository (keepAlive)` - 7 edges
+4. `kboRepository (Server)` - 6 edges
+5. `dailyArchive.ts (setDay + judgeDay)` - 6 edges
+6. `Firestore users Collection` - 5 edges
+7. `Firestore games Collection` - 5 edges
+8. `RTDB /cache/stats/{uid} Path` - 5 edges
+9. `scoreboardService (Server)` - 5 edges
+10. `gameSyncService (Server)` - 5 edges
+
+## Surprising Connections (you probably didn't know these)
+- `RTDB: votes/{gameId}/counts (public read)` --semantically_similar_to--> `RTDB: voteAggregates/{gameId} (public read)` [INFERRED] [semantically similar]
+ graphify-out/tmp-corpus/backend_optimization-plan.md → graphify-out/tmp-corpus/client_improvements-client.md
+- `dailyArchive Cron (03:00 KST)` --writes_to--> `Firestore users Collection` [EXTRACTED]
+ graphify-out/tmp-corpus/backend_backend-writes.md → graphify-out/tmp-corpus/backend_backend-reads.md
+- `Client FCM / users.fcmTokens Direct Write` --writes_to--> `Firestore users Collection` [EXTRACTED]
+ graphify-out/tmp-corpus/backend_data-lifecycle.md → graphify-out/tmp-corpus/backend_backend-reads.md
+- `POST /admin/game/end Endpoint (markGameEnded)` --writes_to--> `Firestore games Collection` [EXTRACTED]
+ graphify-out/tmp-corpus/backend_backend-writes.md → graphify-out/tmp-corpus/backend_backend-reads.md
+- `gameResultService (Server)` --reads_from--> `RTDB /votes/{gameId} Path` [EXTRACTED]
+ graphify-out/tmp-corpus/backend_backend-writes.md → graphify-out/tmp-corpus/backend_backend-reads.md
+
+## Hyperedges (group relationships)
+- **KBO External Fetch to Cache to Client Endpoint Pipeline** — backend_reads_external_kbo, backend_reads_firestore_kbocache, backend_reads_repo_kbocacherepo, backend_reads_firestore_kbolocks, backend_lifecycle_concept_distributedlock [EXTRACTED 1.00]
+- **dailyArchive Cron Write Pipeline** — backend_writes_cron_dailyarchive, backend_reads_svc_judgmentservice, backend_reads_firestore_votehistory, backend_reads_firestore_users, backend_reads_svc_ranksnapshotservice, backend_reads_rtdb_scoreboardcache, backend_reads_rtdb_cachestats [EXTRACTED 1.00]
+- **onGameCompleted Fan-out Write Pattern** — backend_writes_trigger_ongamecompleted, backend_writes_svc_gameresultservice, backend_reads_rtdb_uservotes, backend_reads_rtdb_cachestats, backend_lifecycle_concept_fanout [EXTRACTED 1.00]
+- **Backend Read Optimization Set R1 R4 R5 R7** — backend_improvements_reads_r1_gamedaycache, backend_improvements_reads_r4_backoff, backend_improvements_reads_r5_fieldmask, backend_improvements_reads_r7_parallelrank [EXTRACTED 1.00]
+- **Backend Write Optimization Set W1 through W6** — backend_improvements_writes_w1_diff, backend_improvements_writes_w2_votehistory, backend_improvements_writes_w3_statsdedup, backend_improvements_writes_w4_ranksnapshot, backend_improvements_writes_w5r6_photourl, backend_improvements_writes_w6_gamedetailttl [EXTRACTED 1.00]
+- **User Prediction Vote Flow** — backend_writes_endpoint_post_prediction, backend_writes_endpoint_put_prediction, backend_reads_repo_voterepo, backend_reads_rtdb_votes, backend_reads_rtdb_uservotes [EXTRACTED 1.00]
+- **Tier 1 High-Impact Low-Risk Optimizations** — opt_W1, opt_W2, opt_R1, opt_C1 [EXTRACTED 1.00]
+- **Tier 2 Medium-Impact Optimizations** — opt_R2, opt_W3, opt_R3, opt_R4, opt_C2, opt_C3 [EXTRACTED 1.00]
+- **Tier 3 Small / Housekeeping Optimizations** — opt_W4, opt_W5, opt_W6, opt_R5, opt_R6, opt_R7, opt_C4 [EXTRACTED 1.00]
+- **Applied Client Optimizations (opt/client-rw branch)** — opt_C1, opt_C2, opt_C3, opt_C4, client_vote_repo_after, client_standings_provider_after, client_h2h_provider_after, client_ace_pitcher_after, client_current_user_after [EXTRACTED 1.00]
+- **SWR Cache Adapters (4 domains)** — client_schedule_cache, client_game_detail_cache, client_day_record_cache, client_game_record_dates_cache [EXTRACTED 1.00]
+- **All Client Repositories (keepAlive)** — client_game_repo, client_user_repo, client_prediction_repo, client_team_record_repo, client_player_repo, client_game_detail_repo, client_scoreboard_repo, client_attendance_repo [EXTRACTED 1.00]
+- **Duplicate CF Call Pattern (C2+C3)** — client_provider_h2h, client_provider_rank, client_ep_rank, client_provider_ace_pitcher, client_provider_pitchers, client_ep_player [EXTRACTED 1.00]
+
+## Communities (28 total, 16 thin omitted)
+
+### Community 0 - "Read/Write Optimization Fixes"
+Cohesion: 0.10
+Nodes (22): R4: Cache Stampede Exponential Backoff Fix, R7: Multi-Year Rank Parallel Fetch Fix, W1: games syncGamesForMonth getAll+diff Fix, W6: game_detail Cache Bulk Invalidation Stopped, Client SWR Cache (swr_cache.dart), Distributed Lock (kboLocks TTL 30s), GET /kbo/gameDetail Endpoint, GET /kbo/player Endpoint (+14 more)
+
+### Community 1 - "Archive & Stats Pipeline"
+Cohesion: 0.15
+Nodes (18): R1: GameDayCache Memoization Fix, W2: voteHistory Double-Write Consolidation Fix, W3: Archive Stats Invalidation Fan-out Dedup Fix, Fan-out Write Pattern (stats invalidation), GET /prediction/games Endpoint, GET /stats Endpoint, Firestore games Collection, Firestore voteHistory Subcollection (+10 more)
+
+### Community 2 - "Scoreboard & User Write Fixes"
+Cohesion: 0.13
+Nodes (16): R5: Scoreboard Self-User FieldMask Fix, W4: Rank Snapshot Merged Into Judgment Tx Fix, W5+R6: getMe photoUrl Hot-Write Suppression Fix, Client FCM / users.fcmTokens Direct Write, Precompute Scoreboard Cache Concept, GET /prediction/scoreboard Endpoint, Firestore users Collection, RTDB /nicknames Path (+8 more)
+
+### Community 3 - "Client User Auth & Profile"
+Cohesion: 0.14
+Nodes (16): currentUser Provider After C4 (keepAlive), CF Endpoint: GET /user/check-nickname, CF Endpoint: DELETE /user, CF Endpoint: GET /user, CF Endpoint: PATCH /user (profile update), CF Endpoint: POST /user (onboarding), CF Endpoint: GET /prediction/scoreboard, CF Endpoint: GET /stats (+8 more)
+
+### Community 4 - "Server Cron & Game Sync"
+Cohesion: 0.16
+Nodes (15): Cron Job: 02:00 daily (syncGamesForMonth + kboCache invalidation), dailyArchive.ts (setDay + judgeDay), debugHandlers.ts (Unauthenticated forceSync/dailyArchive), syncGamesForMonth (gameSyncService.ts:63), Firestore: dailyArchive collection, Firestore: games collection, Firestore/Cache: kboCache (game_detail__ TTL), R1: dailyArchive listByDate Sharing (+7 more)
+
+### Community 5 - "Client KBO Data (Rank/Player)"
+Cohesion: 0.16
+Nodes (14): acePitcher Provider After C3 (derived from pitchers), CF Endpoint: GET /kbo/player, CF Endpoint: GET /kbo/rank, headToHead Provider After C2 (watches standings), Client Improvements Summary (C1-C4 Applied), PlayerRepository (keepAlive), acePitcher Provider (autoDispose, duplicate player call), h2h Provider (autoDispose, no cache, duplicates rank call) (+6 more)
+
+### Community 6 - "Client KBO Schedule & GameDetail"
+Cohesion: 0.15
+Nodes (13): DayRecordCache (day_prediction_record, skip if settled), CF Endpoint: GET /kbo/gameDetail, CF Endpoint: GET /kbo/schedule, GameDetailCache (game_detail namespace), GameDetailRepository (keepAlive), GameRecordDatesCache (game_record_dates namespace), GameRepository (keepAlive), DayPredictionRecord Provider (autoDispose + SWR skip if settled) (+5 more)
+
+### Community 7 - "Prediction Vote Flow"
+Cohesion: 0.22
+Nodes (11): CF Endpoint: GET /prediction (by date), CF Endpoint: POST /prediction, CF Endpoint: PUT /prediction, CF Endpoint: GET /prediction/summary (10s polling), PredictionRepository (keepAlive), PredictionAction Notifier (keepAlive), voteSummary Provider (StreamProvider 10s poll), VoteRepository After C1 (RTDB onValue subscription) (+3 more)
+
+### Community 8 - "Server Vote & RTDB Layer"
+Cohesion: 0.20
+Nodes (10): GET /kbo/games Endpoint, GET /prediction Endpoint, GET /prediction/summary Endpoint, In-Memory MemCache (Server-side), voteRepository (Server), RTDB /votes/{gameId} Path, gameListService (Server), predictionService (Server) (+2 more)
+
+### Community 9 - "Game Trigger & Stats Invalidation"
+Cohesion: 0.22
+Nodes (10): gameResultService.ts:42 (stats fan-out on game complete), CF: /stats (getStats Cloud Function), invalidateStats (/cache/stats/{uid} delete), judgeDay (judgmentService.ts:94), onGameCompleted.ts:59 (Firestore trigger), Firestore/Cache: /cache/stats/{uid}, Firestore: voteHistory collection, R2: getStats Incremental Aggregation (+2 more)
+
+### Community 10 - "Attendance & Notification"
+Cohesion: 0.40
+Nodes (5): AttendanceRepository (keepAlive), CF Endpoint: GET /attendance/month, CF Endpoint: POST /attendance/check-in, CF Endpoint: PATCH /users/me/notifications, CheckInController Notifier (autoDispose)
+
+### Community 11 - "Attendance Service (Server)"
+Cohesion: 0.50
+Nodes (4): Firestore attendance Subcollection, Firestore pointLedger Subcollection, attendanceService (Server), POST /attendance/check-in Endpoint
+
+## Knowledge Gaps
+- **78 isolated node(s):** `Firestore attendance Subcollection`, `Firestore pointLedger Subcollection`, `RTDB /nicknames Path`, `RTDB /userNicknames Path`, `scoreboardCacheRepository (Server)` (+73 more)
+ These have ≤1 connection - possible missing edges or undocumented components.
+- **16 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
+
+## Suggested Questions
+_Questions this graph is uniquely positioned to answer:_
+
+- **Why does `C1: voteSummary Polling to RTDB Subscription` connect `Prediction Vote Flow` to `Server Cron & Game Sync`, `Client KBO Data (Rank/Player)`?**
+ _High betweenness centrality (0.090) - this node is a cross-community bridge._
+- **Why does `Client Improvements Summary (C1-C4 Applied)` connect `Client KBO Data (Rank/Player)` to `Client User Auth & Profile`, `Prediction Vote Flow`?**
+ _High betweenness centrality (0.088) - this node is a cross-community bridge._
+- **Why does `Cost Summary: Top Write/Read/Client Costs` connect `Server Cron & Game Sync` to `Prediction Vote Flow`?**
+ _High betweenness centrality (0.070) - this node is a cross-community bridge._
+- **What connects `Firestore attendance Subcollection`, `Firestore pointLedger Subcollection`, `RTDB /nicknames Path` to the rest of the system?**
+ _78 weakly-connected nodes found - possible documentation gaps or missing edges._
+- **Should `Read/Write Optimization Fixes` be split into smaller, more focused modules?**
+ _Cohesion score 0.1038961038961039 - nodes in this community are weakly interconnected._
+- **Should `Scoreboard & User Write Fixes` be split into smaller, more focused modules?**
+ _Cohesion score 0.13333333333333333 - nodes in this community are weakly interconnected._
+- **Should `Client User Auth & Profile` be split into smaller, more focused modules?**
+ _Cohesion score 0.14166666666666666 - nodes in this community are weakly interconnected._
\ No newline at end of file
diff --git a/graphify-out/cache/semantic/441055f47c3a0f3527431cd91c584675a6993b5a5c9beb2e50f73e2473b5a540.json b/graphify-out/cache/semantic/441055f47c3a0f3527431cd91c584675a6993b5a5c9beb2e50f73e2473b5a540.json
new file mode 100644
index 0000000..09d62ff
--- /dev/null
+++ b/graphify-out/cache/semantic/441055f47c3a0f3527431cd91c584675a6993b5a5c9beb2e50f73e2473b5a540.json
@@ -0,0 +1 @@
+{"nodes": [{"id": "readme_overview", "label": "Panit Data Pattern Documentation Overview", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_README.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "readme_cost_summary", "label": "Cost Summary: Top Write/Read/Client Costs", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_README.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "readme_index_ok", "label": "Firestore Composite Indexes (No Gaps)", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_README.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "readme_overview", "target": "readme_cost_summary", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_README.md", "source_location": null, "weight": 1.0}, {"source": "readme_overview", "target": "readme_index_ok", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_README.md", "source_location": null, "weight": 1.0}, {"source": "readme_cost_summary", "target": "opt_W1", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_README.md", "source_location": null, "weight": 1.0}, {"source": "readme_cost_summary", "target": "opt_R1", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_README.md", "source_location": null, "weight": 1.0}, {"source": "readme_cost_summary", "target": "opt_C1", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_README.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
\ No newline at end of file
diff --git a/graphify-out/cache/semantic/7629b9506707c9b5159dc65a70d82c1892c7423714bc34072bebaa1d732b6bad.json b/graphify-out/cache/semantic/7629b9506707c9b5159dc65a70d82c1892c7423714bc34072bebaa1d732b6bad.json
new file mode 100644
index 0000000..506a37e
--- /dev/null
+++ b/graphify-out/cache/semantic/7629b9506707c9b5159dc65a70d82c1892c7423714bc34072bebaa1d732b6bad.json
@@ -0,0 +1 @@
+{"nodes": [{"id": "backend_lifecycle_client_firebaseauth", "label": "Client Firebase Auth", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_lifecycle_client_remoteconfig", "label": "Client Remote Config (team_order_by_standing)", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_lifecycle_client_fcm", "label": "Client FCM / users.fcmTokens Direct Write", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_lifecycle_client_swrcache", "label": "Client SWR Cache (swr_cache.dart)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_lifecycle_concept_fanout", "label": "Fan-out Write Pattern (stats invalidation)", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_lifecycle_concept_precompute", "label": "Precompute Scoreboard Cache Concept", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_lifecycle_concept_distributedlock", "label": "Distributed Lock (kboLocks TTL 30s)", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "backend_lifecycle_client_fcm", "target": "backend_reads_firestore_users", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": "fcm_service.dart:40,58", "weight": 1.0}, {"source": "backend_reads_rtdb_scoreboardcache", "target": "backend_lifecycle_concept_precompute", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "weight": 0.8}, {"source": "backend_reads_firestore_kbolocks", "target": "backend_lifecycle_concept_distributedlock", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "weight": 0.8}, {"source": "backend_writes_svc_gameresultservice", "target": "backend_lifecycle_concept_fanout", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": null, "weight": 0.8}, {"source": "backend_lifecycle_client_swrcache", "target": "backend_reads_endpoint_kbo_schedule", "relation": "caches", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": "swr_cache.dart", "weight": 1.0}, {"source": "backend_lifecycle_client_swrcache", "target": "backend_reads_endpoint_kbo_gamedetail", "relation": "caches", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md", "source_location": "swr_cache.dart", "weight": 1.0}], "hyperedges": []}
\ No newline at end of file
diff --git a/graphify-out/cache/semantic/8cfe82a177e2713dd0053806c245802876fb1886d003508a2a04eaf72c5360d2.json b/graphify-out/cache/semantic/8cfe82a177e2713dd0053806c245802876fb1886d003508a2a04eaf72c5360d2.json
new file mode 100644
index 0000000..13370a7
--- /dev/null
+++ b/graphify-out/cache/semantic/8cfe82a177e2713dd0053806c245802876fb1886d003508a2a04eaf72c5360d2.json
@@ -0,0 +1 @@
+{"nodes": [{"id": "client_dio_provider", "label": "dioProvider \u2014 Single HTTP Gateway (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/api_client.dart:7", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_api_base", "label": "Cloud Functions Base URL (asia-northeast3-mmday-panit)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_game_repo", "label": "GameRepository (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/game_repository.dart:11", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_user_repo", "label": "UserRepository (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/user_repository.dart:11", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_prediction_repo", "label": "PredictionRepository (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/prediction_repository.dart:9", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_team_record_repo", "label": "TeamRecordRepository (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/team_record_repository.dart:9", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_player_repo", "label": "PlayerRepository (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/player_repository.dart:10", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_game_detail_repo", "label": "GameDetailRepository (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/game_detail/data/game_detail_repository.dart:8", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_scoreboard_repo", "label": "ScoreboardRepository (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/scoreboard/data/scoreboard_repository.dart:12", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_attendance_repo", "label": "AttendanceRepository (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/attendance/data/attendance_repository.dart:10", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_notice_repo", "label": "NoticeRepository (keepAlive, mock TODO)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/mypage/data/notice_repository.dart:6", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_schedule", "label": "CF Endpoint: GET /kbo/schedule", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/game_repository.dart:25", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_rank", "label": "CF Endpoint: GET /kbo/rank", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/team_record_repository.dart:20", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_player", "label": "CF Endpoint: GET /kbo/player", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/player_repository.dart:31", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_game_detail", "label": "CF Endpoint: GET /kbo/gameDetail", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/game_detail/data/game_detail_repository.dart:23", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_get_user", "label": "CF Endpoint: GET /user", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/user_repository.dart:24", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_check_nickname", "label": "CF Endpoint: GET /user/check-nickname", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/user_repository.dart:48", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_post_user", "label": "CF Endpoint: POST /user (onboarding)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/user_repository.dart:64", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_patch_user", "label": "CF Endpoint: PATCH /user (profile update)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/user_repository.dart:82", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_delete_user", "label": "CF Endpoint: DELETE /user", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/user_repository.dart:101", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_stats", "label": "CF Endpoint: GET /stats", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/user_repository.dart:108", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_stats_history", "label": "CF Endpoint: GET /stats/history", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/user_repository.dart:130", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_post_prediction", "label": "CF Endpoint: POST /prediction", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/prediction_repository.dart:22", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_put_prediction", "label": "CF Endpoint: PUT /prediction", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/prediction_repository.dart:32", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_get_prediction", "label": "CF Endpoint: GET /prediction (by date)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/prediction_repository.dart:41", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_vote_summary", "label": "CF Endpoint: GET /prediction/summary (10s polling)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/prediction_repository.dart:58", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_scoreboard", "label": "CF Endpoint: GET /prediction/scoreboard", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/scoreboard/data/scoreboard_repository.dart:39", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_attendance_month", "label": "CF Endpoint: GET /attendance/month", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/attendance/data/attendance_repository.dart:26", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_checkin", "label": "CF Endpoint: POST /attendance/check-in", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/attendance/data/attendance_repository.dart:52", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ep_notifications", "label": "CF Endpoint: PATCH /users/me/notifications", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/attendance/data/attendance_repository.dart:76", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_auth_repo", "label": "AuthRepository (Google/Apple signIn)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/auth_repository.dart", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_auth_state_provider", "label": "authStateChangesProvider (Live Stream, keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_remote_config", "label": "Remote Config Service (team_order_by_standing)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/core/services/remote_config_service.dart", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_fcm_service", "label": "FCM Service (token write to Firestore)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/core/services/fcm_service.dart:40,58", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fs_users_fcm_tokens", "label": "Firestore: users/{uid}.fcmTokens (direct write)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_swr_cache", "label": "SWR Cache (SharedPreferences + in-memory, no TTL)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/core/cache/swr_cache.dart", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_schedule_cache", "label": "ScheduleCache (monthly_schedule namespace)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_game_detail_cache", "label": "GameDetailCache (game_detail namespace)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_day_record_cache", "label": "DayRecordCache (day_prediction_record, skip if settled)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_game_record_dates_cache", "label": "GameRecordDatesCache (game_record_dates namespace)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_monthly_schedule", "label": "monthlySchedule Provider (keepAlive + SWR)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_game_detail", "label": "gameDetail Provider (keepAlive + SWR)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_vote_summary", "label": "voteSummary Provider (StreamProvider 10s poll)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/presentation/providers/prediction_providers.dart:31", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_current_user", "label": "currentUser Provider (autoDispose, no cache)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_rank", "label": "rank Provider (autoDispose, no cache)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_h2h", "label": "h2h Provider (autoDispose, no cache, duplicates rank call)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_pitchers", "label": "pitchers Provider (autoDispose, no cache)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_ace_pitcher", "label": "acePitcher Provider (autoDispose, duplicate player call)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_scoreboard", "label": "scoreboard Provider (autoDispose, no cache)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_user_stats", "label": "userStats Provider (autoDispose, no cache)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_day_prediction_record", "label": "DayPredictionRecord Provider (autoDispose + SWR skip if settled)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_game_record_dates", "label": "GameRecordDates Provider (keepAlive + SWR)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_prediction_action", "label": "PredictionAction Notifier (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_provider_checkin_controller", "label": "CheckInController Notifier (autoDispose)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_splash_page", "label": "splash_page.dart (duplicate GET /user on start)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/splash/presentation/pages/splash_page.dart:45", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "client_dio_provider", "target": "client_api_base", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/prediction/data/api_client.dart:7", "weight": 1.0}, {"source": "client_game_repo", "target": "client_ep_schedule", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_team_record_repo", "target": "client_ep_rank", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_player_repo", "target": "client_ep_player", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_game_detail_repo", "target": "client_ep_game_detail", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_user_repo", "target": "client_ep_get_user", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_user_repo", "target": "client_ep_check_nickname", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_user_repo", "target": "client_ep_post_user", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_user_repo", "target": "client_ep_patch_user", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_user_repo", "target": "client_ep_delete_user", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_user_repo", "target": "client_ep_stats", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_user_repo", "target": "client_ep_stats_history", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_prediction_repo", "target": "client_ep_post_prediction", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_prediction_repo", "target": "client_ep_put_prediction", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_prediction_repo", "target": "client_ep_get_prediction", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_prediction_repo", "target": "client_ep_vote_summary", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_scoreboard_repo", "target": "client_ep_scoreboard", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_attendance_repo", "target": "client_ep_attendance_month", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_attendance_repo", "target": "client_ep_checkin", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_attendance_repo", "target": "client_ep_notifications", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_fcm_service", "target": "fs_users_fcm_tokens", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/core/services/fcm_service.dart:40,58", "weight": 1.0}, {"source": "client_provider_monthly_schedule", "target": "client_schedule_cache", "relation": "caches", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_monthly_schedule", "target": "client_ep_schedule", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_game_detail", "target": "client_game_detail_cache", "relation": "caches", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_game_detail", "target": "client_ep_game_detail", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_day_prediction_record", "target": "client_day_record_cache", "relation": "caches", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_game_record_dates", "target": "client_game_record_dates_cache", "relation": "caches", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_schedule_cache", "target": "client_swr_cache", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_game_detail_cache", "target": "client_swr_cache", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_day_record_cache", "target": "client_swr_cache", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_game_record_dates_cache", "target": "client_swr_cache", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_vote_summary", "target": "client_ep_vote_summary", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_rank", "target": "client_ep_rank", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_h2h", "target": "client_ep_rank", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_pitchers", "target": "client_ep_player", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_ace_pitcher", "target": "client_ep_player", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_current_user", "target": "client_ep_get_user", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_splash_page", "target": "client_ep_get_user", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": "lib/features/splash/presentation/pages/splash_page.dart:45", "weight": 1.0}, {"source": "client_provider_user_stats", "target": "client_ep_stats", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_scoreboard", "target": "client_ep_scoreboard", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_prediction_action", "target": "client_ep_post_prediction", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_prediction_action", "target": "client_provider_vote_summary", "relation": "invalidates", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}, {"source": "client_provider_checkin_controller", "target": "client_ep_checkin", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md", "source_location": null, "weight": 1.0}], "hyperedges": [{"id": "swr_cache_adapters", "label": "SWR Cache Adapters (4 domains)", "nodes": ["client_schedule_cache", "client_game_detail_cache", "client_day_record_cache", "client_game_record_dates_cache"], "relation": "implement", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md"}, {"id": "client_keepalive_repos", "label": "All Client Repositories (keepAlive)", "nodes": ["client_game_repo", "client_user_repo", "client_prediction_repo", "client_team_record_repo", "client_player_repo", "client_game_detail_repo", "client_scoreboard_repo", "client_attendance_repo"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md"}, {"id": "duplicate_call_problem", "label": "Duplicate CF Call Pattern (C2+C3)", "nodes": ["client_provider_h2h", "client_provider_rank", "client_ep_rank", "client_provider_ace_pitcher", "client_provider_pitchers", "client_ep_player"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_client-patterns.md"}]}
\ No newline at end of file
diff --git a/graphify-out/cache/semantic/982e2ae7171fbeced1d621713764def17a7c62d43afbc2c33ec61bc24f4b2c46.json b/graphify-out/cache/semantic/982e2ae7171fbeced1d621713764def17a7c62d43afbc2c33ec61bc24f4b2c46.json
new file mode 100644
index 0000000..0df8972
--- /dev/null
+++ b/graphify-out/cache/semantic/982e2ae7171fbeced1d621713764def17a7c62d43afbc2c33ec61bc24f4b2c46.json
@@ -0,0 +1 @@
+{"nodes": [{"id": "backend_writes_cron_kbodailyrefresh", "label": "kboDailyRefresh Cron (02:00 KST)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_cron_dailyarchive", "label": "dailyArchive Cron (03:00 KST)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_trigger_ongamecompleted", "label": "onGameCompleted Firestore Trigger", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_svc_gameresultservice", "label": "gameResultService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_svc_nicknameservice", "label": "nicknameRepository (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_endpoint_post_user", "label": "POST /user Endpoint (createMe)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_endpoint_patch_user", "label": "PATCH /user Endpoint (updateMe)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_endpoint_get_user", "label": "GET /user Endpoint (getMe)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_endpoint_post_prediction", "label": "POST /prediction Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_endpoint_put_prediction", "label": "PUT /prediction Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_endpoint_post_checkin", "label": "POST /attendance/check-in Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_endpoint_post_admin_gameend", "label": "POST /admin/game/end Endpoint (markGameEnded)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_writes_endpoint_debug_forcesync", "label": "debug/forceSync Endpoint (unauthenticated)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "backend_writes_trigger_ongamecompleted", "target": "backend_writes_svc_gameresultservice", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "gameResultService.ts:25", "weight": 1.0}, {"source": "backend_writes_svc_gameresultservice", "target": "backend_reads_rtdb_votes", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "gameResultService.ts:25", "weight": 1.0}, {"source": "backend_writes_svc_gameresultservice", "target": "backend_reads_rtdb_uservotes", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "gameResultService.ts:33-34", "weight": 1.0}, {"source": "backend_writes_svc_gameresultservice", "target": "backend_reads_rtdb_cachestats", "relation": "invalidates", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "gameResultService.ts:42", "weight": 1.0}, {"source": "backend_writes_endpoint_post_prediction", "target": "backend_reads_repo_voterepo", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "voteRepository.ts:66", "weight": 1.0}, {"source": "backend_reads_repo_voterepo", "target": "backend_reads_rtdb_votes", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "voteRepository.ts:66-68", "weight": 1.0}, {"source": "backend_reads_repo_voterepo", "target": "backend_reads_rtdb_uservotes", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "voteRepository.ts:67-68", "weight": 1.0}, {"source": "backend_writes_endpoint_put_prediction", "target": "backend_reads_repo_voterepo", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "voteRepository.ts:92-95", "weight": 1.0}, {"source": "backend_writes_endpoint_post_checkin", "target": "backend_reads_svc_attendanceservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "attendanceService.ts:162,243", "weight": 1.0}, {"source": "backend_reads_svc_attendanceservice", "target": "backend_reads_firestore_attendance", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "attendanceService.ts:162,243", "weight": 1.0}, {"source": "backend_reads_svc_attendanceservice", "target": "backend_reads_firestore_pointledger", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "pointLedgerRepository.ts:61-78", "weight": 1.0}, {"source": "backend_writes_cron_kbodailyrefresh", "target": "backend_reads_svc_gamesyncservice", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "gameSyncService.ts:63-77", "weight": 1.0}, {"source": "backend_reads_svc_gamesyncservice", "target": "backend_reads_firestore_games", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "gameSyncService.ts:63-77", "weight": 1.0}, {"source": "backend_reads_svc_gamesyncservice", "target": "backend_reads_external_kbo", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "gameSyncService.ts:129", "weight": 1.0}, {"source": "backend_writes_cron_kbodailyrefresh", "target": "backend_reads_repo_kbocacherepo", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "kboRefresh.ts:16-25", "weight": 1.0}, {"source": "backend_reads_repo_kbocacherepo", "target": "backend_reads_firestore_kbocache", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "kboCacheRepository.ts:69-80", "weight": 1.0}, {"source": "backend_reads_repo_kbocacherepo", "target": "backend_reads_firestore_kbolocks", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "kboCacheRepository.ts:88-104", "weight": 1.0}, {"source": "backend_writes_endpoint_post_admin_gameend", "target": "backend_reads_firestore_games", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "gameResultService.ts:48-64", "weight": 1.0}, {"source": "backend_reads_firestore_games", "target": "backend_writes_trigger_ongamecompleted", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "index.ts onDocumentUpdated games/{gameId}", "weight": 1.0}, {"source": "backend_writes_cron_dailyarchive", "target": "backend_reads_firestore_votehistory", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "dailyArchive.ts:130", "weight": 1.0}, {"source": "backend_writes_cron_dailyarchive", "target": "backend_reads_firestore_users", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "userRepository.ts:182-254", "weight": 1.0}, {"source": "backend_writes_endpoint_post_user", "target": "backend_reads_svc_userservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "userService.ts:120", "weight": 1.0}, {"source": "backend_reads_svc_userservice", "target": "backend_reads_firestore_users", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "userRepository.ts:128-139", "weight": 1.0}, {"source": "backend_reads_svc_userservice", "target": "backend_reads_rtdb_nicknames", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "nicknameRepository.ts:19-57", "weight": 1.0}, {"source": "backend_writes_endpoint_patch_user", "target": "backend_reads_svc_userservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "userService.ts:269", "weight": 1.0}, {"source": "backend_writes_endpoint_get_user", "target": "backend_reads_svc_userservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "userService.ts:95", "weight": 1.0}, {"source": "backend_writes_trigger_ongamecompleted", "target": "backend_reads_rtdb_cachestats", "relation": "invalidates", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "onGameCompleted.ts:59-61", "weight": 1.0}, {"source": "backend_writes_cron_dailyarchive", "target": "backend_reads_rtdb_cachestats", "relation": "invalidates", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "dailyArchive.ts reconcile", "weight": 1.0}, {"source": "backend_writes_endpoint_debug_forcesync", "target": "backend_reads_svc_gamesyncservice", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "gameSyncService.ts forceSyncDay", "weight": 1.0}, {"source": "backend_reads_svc_userservice", "target": "backend_reads_rtdb_nicknames", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "nicknameRepository.ts:82-90", "weight": 1.0}, {"source": "backend_reads_svc_userservice", "target": "backend_reads_rtdb_usernicknames", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "nicknameRepository.ts:19-57", "weight": 1.0}, {"source": "backend_reads_svc_ranksnapshotservice", "target": "backend_reads_firestore_users", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md", "source_location": "rankSnapshotService.ts:26-54", "weight": 1.0}], "hyperedges": [{"id": "daily_archive_write_pipeline", "label": "dailyArchive Cron Write Pipeline", "nodes": ["backend_writes_cron_dailyarchive", "backend_reads_svc_judgmentservice", "backend_reads_firestore_votehistory", "backend_reads_firestore_users", "backend_reads_svc_ranksnapshotservice", "backend_reads_rtdb_scoreboardcache", "backend_reads_rtdb_cachestats"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md"}, {"id": "game_completed_fanout", "label": "onGameCompleted Fan-out Write Pattern", "nodes": ["backend_writes_trigger_ongamecompleted", "backend_writes_svc_gameresultservice", "backend_reads_rtdb_uservotes", "backend_reads_rtdb_cachestats", "backend_lifecycle_concept_fanout"], "relation": "implement", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md"}, {"id": "prediction_vote_flow", "label": "User Prediction Vote Flow", "nodes": ["backend_writes_endpoint_post_prediction", "backend_writes_endpoint_put_prediction", "backend_reads_repo_voterepo", "backend_reads_rtdb_votes", "backend_reads_rtdb_uservotes"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md"}]}
\ No newline at end of file
diff --git a/graphify-out/cache/semantic/a461767f44048b941099ef1e762c6f74b2e6d80130fd99c55a661e052ea1010d.json b/graphify-out/cache/semantic/a461767f44048b941099ef1e762c6f74b2e6d80130fd99c55a661e052ea1010d.json
new file mode 100644
index 0000000..6867013
--- /dev/null
+++ b/graphify-out/cache/semantic/a461767f44048b941099ef1e762c6f74b2e6d80130fd99c55a661e052ea1010d.json
@@ -0,0 +1 @@
+{"nodes": [{"id": "backend_improvements_writes_w1_diff", "label": "W1: games syncGamesForMonth getAll+diff Fix", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_improvements_writes_w2_votehistory", "label": "W2: voteHistory Double-Write Consolidation Fix", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_improvements_writes_w3_statsdedup", "label": "W3: Archive Stats Invalidation Fan-out Dedup Fix", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_improvements_writes_w4_ranksnapshot", "label": "W4: Rank Snapshot Merged Into Judgment Tx Fix", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_improvements_writes_w5r6_photourl", "label": "W5+R6: getMe photoUrl Hot-Write Suppression Fix", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_improvements_writes_w6_gamedetailttl", "label": "W6: game_detail Cache Bulk Invalidation Stopped", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "backend_improvements_writes_w1_diff", "target": "backend_reads_svc_gamesyncservice", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": "commit b17ac4c", "weight": 1.0}, {"source": "backend_improvements_writes_w2_votehistory", "target": "backend_reads_firestore_votehistory", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": "commit 48a8f16", "weight": 1.0}, {"source": "backend_improvements_writes_w3_statsdedup", "target": "backend_reads_rtdb_cachestats", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": "commit 9a59755", "weight": 1.0}, {"source": "backend_improvements_writes_w4_ranksnapshot", "target": "backend_reads_svc_ranksnapshotservice", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": "commit 4ea1a77", "weight": 1.0}, {"source": "backend_improvements_writes_w5r6_photourl", "target": "backend_reads_svc_userservice", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": "commit 037baab", "weight": 1.0}, {"source": "backend_improvements_writes_w6_gamedetailttl", "target": "backend_reads_svc_gamedetailservice", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md", "source_location": "commit 50349e6", "weight": 1.0}], "hyperedges": [{"id": "backend_write_optimization_set", "label": "Backend Write Optimization Set W1 through W6", "nodes": ["backend_improvements_writes_w1_diff", "backend_improvements_writes_w2_votehistory", "backend_improvements_writes_w3_statsdedup", "backend_improvements_writes_w4_ranksnapshot", "backend_improvements_writes_w5r6_photourl", "backend_improvements_writes_w6_gamedetailttl"], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md"}]}
\ No newline at end of file
diff --git a/graphify-out/cache/semantic/be162108974f5941b103bc78da76154d3fc5e6a8ccc31b9c47c38eb62b562b93.json b/graphify-out/cache/semantic/be162108974f5941b103bc78da76154d3fc5e6a8ccc31b9c47c38eb62b562b93.json
new file mode 100644
index 0000000..8d63a39
--- /dev/null
+++ b/graphify-out/cache/semantic/be162108974f5941b103bc78da76154d3fc5e6a8ccc31b9c47c38eb62b562b93.json
@@ -0,0 +1 @@
+{"nodes": [{"id": "backend_reads_firestore_users", "label": "Firestore users Collection", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_firestore_votehistory", "label": "Firestore voteHistory Subcollection", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_firestore_attendance", "label": "Firestore attendance Subcollection", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_firestore_pointledger", "label": "Firestore pointLedger Subcollection", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_firestore_games", "label": "Firestore games Collection", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_firestore_kbocache", "label": "Firestore kboCache Collection", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_firestore_kbolocks", "label": "Firestore kboLocks Collection", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_rtdb_votes", "label": "RTDB /votes/{gameId} Path", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_rtdb_uservotes", "label": "RTDB /userVotes/{uid}/{date} Path", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_rtdb_cachestats", "label": "RTDB /cache/stats/{uid} Path", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_rtdb_scoreboardcache", "label": "RTDB /scoreboardCache/{date} Path", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_rtdb_nicknames", "label": "RTDB /nicknames Path", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_rtdb_usernicknames", "label": "RTDB /userNicknames Path", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_external_kbo", "label": "External KBO API (koreabaseball.com)", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_memcache", "label": "In-Memory MemCache (Server-side)", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_gamelistservice", "label": "gameListService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_rankservice", "label": "rankService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_playerservice", "label": "playerService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_scheduleservice", "label": "scheduleService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_gamedetailservice", "label": "gameDetailService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_scoreboardservice", "label": "scoreboardService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_statsservice", "label": "statsService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_predictionservice", "label": "predictionService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_judgmentservice", "label": "judgmentService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_gamesyncservice", "label": "gameSyncService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_userservice", "label": "userService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_ranksnapshotservice", "label": "rankSnapshotService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_svc_attendanceservice", "label": "attendanceService (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_repo_kbocacherepo", "label": "kboCacheRepository (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_repo_kborepo", "label": "kboRepository (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_repo_scoreboardcacherepo", "label": "scoreboardCacheRepository (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_repo_voterepo", "label": "voteRepository (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_repo_gamerepo", "label": "gameRepository (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_repo_votehistoryrepo", "label": "voteHistoryRepository (Server)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_kbo_games", "label": "GET /kbo/games Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_kbo_rank", "label": "GET /kbo/rank Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_kbo_player", "label": "GET /kbo/player Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_kbo_schedule", "label": "GET /kbo/schedule Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_kbo_gamedetail", "label": "GET /kbo/gameDetail Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_scoreboard", "label": "GET /prediction/scoreboard Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_stats", "label": "GET /stats Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_prediction_games", "label": "GET /prediction/games Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_prediction", "label": "GET /prediction Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_reads_endpoint_prediction_summary", "label": "GET /prediction/summary Endpoint", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "backend_reads_endpoint_kbo_games", "target": "backend_reads_svc_gamelistservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "game-list.ts:240", "weight": 1.0}, {"source": "backend_reads_svc_gamelistservice", "target": "backend_reads_memcache", "relation": "caches", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "gameListService.ts:22,39", "weight": 1.0}, {"source": "backend_reads_svc_gamelistservice", "target": "backend_reads_external_kbo", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "game-list.ts:240", "weight": 1.0}, {"source": "backend_reads_endpoint_kbo_rank", "target": "backend_reads_svc_rankservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboRepository.ts:42", "weight": 1.0}, {"source": "backend_reads_svc_rankservice", "target": "backend_reads_repo_kborepo", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboRepository.ts:42", "weight": 1.0}, {"source": "backend_reads_repo_kborepo", "target": "backend_reads_firestore_kbocache", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboRepository.ts:47,32", "weight": 1.0}, {"source": "backend_reads_repo_kborepo", "target": "backend_reads_external_kbo", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboRepository.ts:46", "weight": 1.0}, {"source": "backend_reads_repo_kbocacherepo", "target": "backend_reads_firestore_kbocache", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboCacheRepository.ts", "weight": 1.0}, {"source": "backend_reads_repo_kbocacherepo", "target": "backend_reads_firestore_kbolocks", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboCacheRepository.ts:88-104", "weight": 1.0}, {"source": "backend_reads_endpoint_kbo_player", "target": "backend_reads_svc_playerservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboRepository.ts:457-462", "weight": 1.0}, {"source": "backend_reads_svc_playerservice", "target": "backend_reads_repo_kborepo", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboRepository.ts:446", "weight": 1.0}, {"source": "backend_reads_endpoint_kbo_schedule", "target": "backend_reads_svc_scheduleservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboRepository.ts:86-92", "weight": 1.0}, {"source": "backend_reads_svc_scheduleservice", "target": "backend_reads_repo_kborepo", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "kboRepository.ts:282-300", "weight": 1.0}, {"source": "backend_reads_endpoint_kbo_gamedetail", "target": "backend_reads_svc_gamedetailservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "gameDetailService.ts:87", "weight": 1.0}, {"source": "backend_reads_svc_gamedetailservice", "target": "backend_reads_repo_kbocacherepo", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "gameDetailService.ts:87", "weight": 1.0}, {"source": "backend_reads_svc_gamedetailservice", "target": "backend_reads_external_kbo", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "gameDetailService.ts:29-49", "weight": 1.0}, {"source": "backend_reads_endpoint_scoreboard", "target": "backend_reads_svc_scoreboardservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "scoreboardService.ts:54", "weight": 1.0}, {"source": "backend_reads_svc_scoreboardservice", "target": "backend_reads_firestore_users", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "scoreboardService.ts:54", "weight": 1.0}, {"source": "backend_reads_svc_scoreboardservice", "target": "backend_reads_rtdb_scoreboardcache", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "scoreboardService.ts:63-67", "weight": 1.0}, {"source": "backend_reads_svc_scoreboardservice", "target": "backend_reads_memcache", "relation": "caches", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "scoreboardService.ts:63-67", "weight": 1.0}, {"source": "backend_reads_endpoint_stats", "target": "backend_reads_svc_statsservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "statsService.ts:255", "weight": 1.0}, {"source": "backend_reads_svc_statsservice", "target": "backend_reads_rtdb_cachestats", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "statsService.ts:255", "weight": 1.0}, {"source": "backend_reads_svc_statsservice", "target": "backend_reads_repo_votehistoryrepo", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "voteHistoryRepository.ts:53", "weight": 1.0}, {"source": "backend_reads_repo_votehistoryrepo", "target": "backend_reads_firestore_votehistory", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "voteHistoryRepository.ts:53", "weight": 1.0}, {"source": "backend_reads_svc_statsservice", "target": "backend_reads_rtdb_uservotes", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "statsService.ts:200", "weight": 1.0}, {"source": "backend_reads_endpoint_prediction_games", "target": "backend_reads_repo_gamerepo", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "gameRepository.listByDate:27-37", "weight": 1.0}, {"source": "backend_reads_repo_gamerepo", "target": "backend_reads_firestore_games", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "gameRepository.listByDate:27-37", "weight": 1.0}, {"source": "backend_reads_endpoint_prediction", "target": "backend_reads_repo_voterepo", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "voteRepository.getUserDateVotes:106", "weight": 1.0}, {"source": "backend_reads_repo_voterepo", "target": "backend_reads_rtdb_uservotes", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "voteRepository.getUserDateVotes:106", "weight": 1.0}, {"source": "backend_reads_endpoint_prediction_summary", "target": "backend_reads_svc_predictionservice", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "predictionService.ts:16,112", "weight": 1.0}, {"source": "backend_reads_svc_predictionservice", "target": "backend_reads_rtdb_votes", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "voteRepository.getCounts:23", "weight": 1.0}, {"source": "backend_reads_svc_predictionservice", "target": "backend_reads_memcache", "relation": "caches", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "predictionService.ts:16", "weight": 1.0}, {"source": "backend_reads_svc_judgmentservice", "target": "backend_reads_firestore_games", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "judgmentService.ts:27-41", "weight": 1.0}, {"source": "backend_writes_cron_dailyarchive", "target": "backend_reads_svc_judgmentservice", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "dailyArchive.ts:87-168", "weight": 1.0}, {"source": "backend_writes_cron_dailyarchive", "target": "backend_reads_rtdb_uservotes", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "dailyArchive.ts:96", "weight": 1.0}, {"source": "backend_writes_cron_dailyarchive", "target": "backend_reads_svc_ranksnapshotservice", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "dailyArchive.ts:163", "weight": 1.0}, {"source": "backend_reads_svc_ranksnapshotservice", "target": "backend_reads_firestore_users", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "rankSnapshotService.ts:26-54", "weight": 1.0}, {"source": "backend_reads_svc_ranksnapshotservice", "target": "backend_reads_rtdb_scoreboardcache", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "rankSnapshotService.ts:128-148", "weight": 1.0}, {"source": "backend_reads_rtdb_cachestats", "target": "backend_reads_svc_statsservice", "relation": "caches", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "statsService.ts:255", "weight": 0.9}, {"source": "backend_reads_svc_attendanceservice", "target": "backend_reads_firestore_attendance", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "attendanceService.ts checkIn transaction", "weight": 1.0}, {"source": "backend_reads_svc_attendanceservice", "target": "backend_reads_firestore_pointledger", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "pointLedger[createdAt DESC,seq DESC]", "weight": 1.0}, {"source": "backend_reads_svc_statsservice", "target": "backend_reads_rtdb_cachestats", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md", "source_location": "statsService.ts:262", "weight": 1.0}], "hyperedges": [{"id": "kbo_cache_pipeline", "label": "KBO External Fetch to Cache to Client Endpoint Pipeline", "nodes": ["backend_reads_external_kbo", "backend_reads_firestore_kbocache", "backend_reads_repo_kbocacherepo", "backend_reads_firestore_kbolocks", "backend_lifecycle_concept_distributedlock"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md"}]}
\ No newline at end of file
diff --git a/graphify-out/cache/semantic/c1d818f03b5b27b69ccda49673068289c47fe61ea91ee89f2177f8bc6dea7795.json b/graphify-out/cache/semantic/c1d818f03b5b27b69ccda49673068289c47fe61ea91ee89f2177f8bc6dea7795.json
new file mode 100644
index 0000000..d6d6d97
--- /dev/null
+++ b/graphify-out/cache/semantic/c1d818f03b5b27b69ccda49673068289c47fe61ea91ee89f2177f8bc6dea7795.json
@@ -0,0 +1 @@
+{"nodes": [{"id": "rtdb_vote_aggregates", "label": "RTDB: voteAggregates/{gameId} (public read)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_vote_repo_after", "label": "VoteRepository After C1 (RTDB onValue subscription)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": "lib/features/prediction/data/vote_repository.dart", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_standings_provider_after", "label": "standings Provider After C2 (single source)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": "lib/features/prediction/application/standings_provider.dart", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_h2h_provider_after", "label": "headToHead Provider After C2 (watches standings)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": "lib/features/prediction/application/h2h_provider.dart", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_ace_pitcher_after", "label": "acePitcher Provider After C3 (derived from pitchers)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": "lib/features/prediction/application/ace_pitcher_provider.dart", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_current_user_after", "label": "currentUser Provider After C4 (keepAlive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": "lib/features/auth/application/current_user_provider.dart", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "client_improvements_summary", "label": "Client Improvements Summary (C1-C4 Applied)", "file_type": "document", "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "client_improvements_summary", "target": "opt_C1", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 1.0}, {"source": "client_improvements_summary", "target": "opt_C2", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 1.0}, {"source": "client_improvements_summary", "target": "opt_C3", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 1.0}, {"source": "client_improvements_summary", "target": "opt_C4", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 1.0}, {"source": "client_vote_repo_after", "target": "rtdb_vote_aggregates", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": "lib/features/prediction/data/vote_repository.dart", "weight": 1.0}, {"source": "opt_C1", "target": "client_vote_repo_after", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 1.0}, {"source": "client_h2h_provider_after", "target": "client_standings_provider_after", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": "lib/features/prediction/application/h2h_provider.dart", "weight": 1.0}, {"source": "opt_C2", "target": "client_h2h_provider_after", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 1.0}, {"source": "opt_C2", "target": "client_standings_provider_after", "relation": "optimized_by", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 0.9}, {"source": "client_ace_pitcher_after", "target": "client_provider_pitchers", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": "lib/features/prediction/application/ace_pitcher_provider.dart", "weight": 1.0}, {"source": "opt_C3", "target": "client_ace_pitcher_after", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 1.0}, {"source": "opt_C4", "target": "client_current_user_after", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 1.0}, {"source": "client_current_user_after", "target": "client_ep_get_user", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 1.0}, {"source": "rtdb_votes_gameId", "target": "rtdb_vote_aggregates", "relation": "semantically_similar_to", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md", "source_location": null, "weight": 0.7}], "hyperedges": [{"id": "client_applied_improvements", "label": "Applied Client Optimizations (opt/client-rw branch)", "nodes": ["opt_C1", "opt_C2", "opt_C3", "opt_C4", "client_vote_repo_after", "client_standings_provider_after", "client_h2h_provider_after", "client_ace_pitcher_after", "client_current_user_after"], "relation": "implement", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/client_improvements-client.md"}]}
\ No newline at end of file
diff --git a/graphify-out/cache/semantic/c1e2be8cd496b2793a8ea06cce799bf6e6216201df02b6e9d9df1920919bcbe3.json b/graphify-out/cache/semantic/c1e2be8cd496b2793a8ea06cce799bf6e6216201df02b6e9d9df1920919bcbe3.json
new file mode 100644
index 0000000..1274a3c
--- /dev/null
+++ b/graphify-out/cache/semantic/c1e2be8cd496b2793a8ea06cce799bf6e6216201df02b6e9d9df1920919bcbe3.json
@@ -0,0 +1 @@
+{"nodes": [{"id": "backend_improvements_reads_r1_gamedaycache", "label": "R1: GameDayCache Memoization Fix", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_improvements_reads_r4_backoff", "label": "R4: Cache Stampede Exponential Backoff Fix", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_improvements_reads_r5_fieldmask", "label": "R5: Scoreboard Self-User FieldMask Fix", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_improvements_reads_r7_parallelrank", "label": "R7: Multi-Year Rank Parallel Fetch Fix", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "backend_improvements_reads_r1_gamedaycache", "target": "backend_writes_cron_dailyarchive", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md", "source_location": "commit 5a498c3", "weight": 1.0}, {"source": "backend_improvements_reads_r1_gamedaycache", "target": "backend_reads_repo_gamerepo", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md", "source_location": "src/repositories/gameRepository.ts", "weight": 1.0}, {"source": "backend_improvements_reads_r4_backoff", "target": "backend_reads_repo_kbocacherepo", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md", "source_location": "commit 69f31ae", "weight": 1.0}, {"source": "backend_improvements_reads_r5_fieldmask", "target": "backend_reads_svc_scoreboardservice", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md", "source_location": "commit 60461c4", "weight": 1.0}, {"source": "backend_improvements_reads_r7_parallelrank", "target": "backend_reads_repo_kborepo", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md", "source_location": "commit e9ba36c", "weight": 1.0}], "hyperedges": [{"id": "backend_read_optimization_set", "label": "Backend Read Optimization Set R1 R4 R5 R7", "nodes": ["backend_improvements_reads_r1_gamedaycache", "backend_improvements_reads_r4_backoff", "backend_improvements_reads_r5_fieldmask", "backend_improvements_reads_r7_parallelrank"], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md"}]}
\ No newline at end of file
diff --git a/graphify-out/cache/semantic/ebee6bb0067bafc39c67b1de39ada6b1f03f1a3cd0acef3975cd27c01b09b725.json b/graphify-out/cache/semantic/ebee6bb0067bafc39c67b1de39ada6b1f03f1a3cd0acef3975cd27c01b09b725.json
new file mode 100644
index 0000000..a41a94a
--- /dev/null
+++ b/graphify-out/cache/semantic/ebee6bb0067bafc39c67b1de39ada6b1f03f1a3cd0acef3975cd27c01b09b725.json
@@ -0,0 +1 @@
+{"nodes": [{"id": "opt_W1", "label": "W1: Games Sync Diff Optimization", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_W2", "label": "W2: voteHistory Double Write Consolidation", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_W3", "label": "W3: Stats Invalidation Fan-out Per User", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_W4", "label": "W4: Users Cron Write Deduplication", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_W5", "label": "W5: getMe photoUrl Write Conservative", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_W6", "label": "W6: kboCache game_detail TTL Natural Expiry", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_R1", "label": "R1: dailyArchive listByDate Sharing", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_R2", "label": "R2: getStats Incremental Aggregation", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_R3", "label": "R3: dailyArchive userVotes Shallow Read", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_R4", "label": "R4: Cache Stampede Polling Backoff", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_R5", "label": "R5: Scoreboard getUser Select + Rank Cache", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_R6", "label": "R6: createMe/updateMe Remove Secondary getUser", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_R7", "label": "R7: Rank Multi-year getOrFetch Parallelization", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_C1", "label": "C1: voteSummary Polling to RTDB Subscription", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_C2", "label": "C2: rank/h2h Duplicate Call Removal", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_C3", "label": "C3: pitchers/acePitcher Duplicate Call Removal", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "opt_C4", "label": "C4: Uncached autoDispose Providers SWR/keepAlive", "file_type": "document", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_debug_handlers", "label": "debugHandlers.ts (Unauthenticated forceSync/dailyArchive)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "debugHandlers.ts", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_sync_games_service", "label": "syncGamesForMonth (gameSyncService.ts:63)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "gameSyncService.ts:63", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_daily_archive", "label": "dailyArchive.ts (setDay + judgeDay)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "dailyArchive.ts", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_judge_day", "label": "judgeDay (judgmentService.ts:94)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "judgmentService.ts:94", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_invalidate_stats", "label": "invalidateStats (/cache/stats/{uid} delete)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_game_result_service", "label": "gameResultService.ts:42 (stats fan-out on game complete)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "gameResultService.ts:42", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_on_game_completed", "label": "onGameCompleted.ts:59 (Firestore trigger)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "onGameCompleted.ts:59", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fs_games", "label": "Firestore: games collection", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fs_vote_history", "label": "Firestore: voteHistory collection", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fs_daily_archive", "label": "Firestore: dailyArchive collection", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fs_cache_stats", "label": "Firestore/Cache: /cache/stats/{uid}", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "rtdb_user_votes", "label": "RTDB: /userVotes (full tree, all users/dates)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "rtdb_votes_gameId", "label": "RTDB: votes/{gameId}/counts (public read)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fs_kbo_cache", "label": "Firestore/Cache: kboCache (game_detail__ TTL)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_get_stats_cf", "label": "CF: /stats (getStats Cloud Function)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_wait_for_cache", "label": "waitForCache / getOrFetchDynamic (polling lock)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "backend_cron_0200", "label": "Cron Job: 02:00 daily (syncGamesForMonth + kboCache invalidation)", "file_type": "code", "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "backend_sync_games_service", "target": "fs_games", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "gameSyncService.ts:63", "weight": 1.0}, {"source": "backend_cron_0200", "target": "backend_sync_games_service", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_W1", "target": "backend_sync_games_service", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_W1", "target": "fs_games", "relation": "optimized_by", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 0.9}, {"source": "backend_daily_archive", "target": "fs_vote_history", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "dailyArchive.ts:130", "weight": 1.0}, {"source": "backend_judge_day", "target": "fs_vote_history", "relation": "writes_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "judgmentService.ts:94", "weight": 1.0}, {"source": "opt_W2", "target": "backend_daily_archive", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_W2", "target": "backend_judge_day", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "backend_daily_archive", "target": "fs_daily_archive", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "dailyArchive.ts:96", "weight": 1.0}, {"source": "opt_R1", "target": "backend_daily_archive", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_R1", "target": "fs_games", "relation": "optimized_by", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 0.9}, {"source": "backend_on_game_completed", "target": "backend_invalidate_stats", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "onGameCompleted.ts:59", "weight": 1.0}, {"source": "backend_invalidate_stats", "target": "fs_cache_stats", "relation": "invalidates", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "backend_game_result_service", "target": "backend_invalidate_stats", "relation": "triggers", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "gameResultService.ts:42", "weight": 1.0}, {"source": "opt_W3", "target": "backend_invalidate_stats", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_R2", "target": "fs_cache_stats", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_R2", "target": "fs_vote_history", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "backend_get_stats_cf", "target": "fs_vote_history", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "backend_get_stats_cf", "target": "fs_cache_stats", "relation": "reads_from", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 0.9}, {"source": "opt_R3", "target": "rtdb_user_votes", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "backend_daily_archive", "target": "rtdb_user_votes", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "dailyArchive.ts:96", "weight": 1.0}, {"source": "opt_R4", "target": "backend_wait_for_cache", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "backend_cron_0200", "target": "fs_kbo_cache", "relation": "invalidates", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_W6", "target": "fs_kbo_cache", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_C1", "target": "client_provider_vote_summary", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_C1", "target": "rtdb_votes_gameId", "relation": "reads_from", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_C2", "target": "client_provider_h2h", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_C3", "target": "client_provider_ace_pitcher", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_C4", "target": "client_provider_current_user", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_C4", "target": "client_provider_scoreboard", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "opt_C4", "target": "client_provider_user_stats", "relation": "optimized_by", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": null, "weight": 1.0}, {"source": "backend_debug_handlers", "target": "backend_sync_games_service", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "debugHandlers.ts", "weight": 1.0}, {"source": "backend_debug_handlers", "target": "backend_daily_archive", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md", "source_location": "debugHandlers.ts", "weight": 1.0}], "hyperedges": [{"id": "tier1_optimizations", "label": "Tier 1 High-Impact Low-Risk Optimizations", "nodes": ["opt_W1", "opt_W2", "opt_R1", "opt_C1"], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md"}, {"id": "tier2_optimizations", "label": "Tier 2 Medium-Impact Optimizations", "nodes": ["opt_R2", "opt_W3", "opt_R3", "opt_R4", "opt_C2", "opt_C3"], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md"}, {"id": "tier3_optimizations", "label": "Tier 3 Small / Housekeeping Optimizations", "nodes": ["opt_W4", "opt_W5", "opt_W6", "opt_R5", "opt_R6", "opt_R7", "opt_C4"], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md"}]}
\ No newline at end of file
diff --git a/graphify-out/cache/stat-index.json b/graphify-out/cache/stat-index.json
new file mode 100644
index 0000000..30e9a93
--- /dev/null
+++ b/graphify-out/cache/stat-index.json
@@ -0,0 +1 @@
+{"D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_backend-reads.md":{"size":16226,"mtime_ns":1779955343720489300,"hash":"be162108974f5941b103bc78da76154d3fc5e6a8ccc31b9c47c38eb62b562b93"},"D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_backend-writes.md":{"size":16769,"mtime_ns":1779955314703817500,"hash":"982e2ae7171fbeced1d621713764def17a7c62d43afbc2c33ec61bc24f4b2c46"},"D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_data-lifecycle.md":{"size":7444,"mtime_ns":1779955497181792200,"hash":"7629b9506707c9b5159dc65a70d82c1892c7423714bc34072bebaa1d732b6bad"},"D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_improvements-backend-reads.md":{"size":19137,"mtime_ns":1779965419403981600,"hash":"c1e2be8cd496b2793a8ea06cce799bf6e6216201df02b6e9d9df1920919bcbe3"},"D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_improvements-backend-writes.md":{"size":27290,"mtime_ns":1779965451961931900,"hash":"a461767f44048b941099ef1e762c6f74b2e6d80130fd99c55a661e052ea1010d"},"D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_optimization-plan.md":{"size":5975,"mtime_ns":1779955541015705800,"hash":"ebee6bb0067bafc39c67b1de39ada6b1f03f1a3cd0acef3975cd27c01b09b725"},"D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_README.md":{"size":2060,"mtime_ns":1779963250725354100,"hash":"441055f47c3a0f3527431cd91c584675a6993b5a5c9beb2e50f73e2473b5a540"},"D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\client_client-patterns.md":{"size":16783,"mtime_ns":1779955399418784100,"hash":"8cfe82a177e2713dd0053806c245802876fb1886d003508a2a04eaf72c5360d2"},"D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\client_improvements-client.md":{"size":12480,"mtime_ns":1779965406311097500,"hash":"c1d818f03b5b27b69ccda49673068289c47fe61ea91ee89f2177f8bc6dea7795"}}
\ No newline at end of file
diff --git a/graphify-out/cost.json b/graphify-out/cost.json
new file mode 100644
index 0000000..5ecba37
--- /dev/null
+++ b/graphify-out/cost.json
@@ -0,0 +1,12 @@
+{
+ "runs": [
+ {
+ "date": "2026-05-28T23:28:44.360304+00:00",
+ "input_tokens": 154966,
+ "output_tokens": 0,
+ "files": 9
+ }
+ ],
+ "total_input_tokens": 154966,
+ "total_output_tokens": 0
+}
\ No newline at end of file
diff --git a/graphify-out/graph.html b/graphify-out/graph.html
new file mode 100644
index 0000000..37fdd3f
--- /dev/null
+++ b/graphify-out/graph.html
@@ -0,0 +1,305 @@
+
+
+
+
+graphify - graphify-out/graph.html
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/graphify-out/graph.json b/graphify-out/graph.json
new file mode 100644
index 0000000..e6e52b3
--- /dev/null
+++ b/graphify-out/graph.json
@@ -0,0 +1,4446 @@
+{
+ "directed": false,
+ "multigraph": false,
+ "graph": {
+ "hyperedges": [
+ {
+ "id": "kbo_cache_pipeline",
+ "label": "KBO External Fetch to Cache to Client Endpoint Pipeline",
+ "nodes": [
+ "backend_reads_external_kbo",
+ "backend_reads_firestore_kbocache",
+ "backend_reads_repo_kbocacherepo",
+ "backend_reads_firestore_kbolocks",
+ "backend_lifecycle_concept_distributedlock"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md"
+ },
+ {
+ "id": "daily_archive_write_pipeline",
+ "label": "dailyArchive Cron Write Pipeline",
+ "nodes": [
+ "backend_writes_cron_dailyarchive",
+ "backend_reads_svc_judgmentservice",
+ "backend_reads_firestore_votehistory",
+ "backend_reads_firestore_users",
+ "backend_reads_svc_ranksnapshotservice",
+ "backend_reads_rtdb_scoreboardcache",
+ "backend_reads_rtdb_cachestats"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md"
+ },
+ {
+ "id": "game_completed_fanout",
+ "label": "onGameCompleted Fan-out Write Pattern",
+ "nodes": [
+ "backend_writes_trigger_ongamecompleted",
+ "backend_writes_svc_gameresultservice",
+ "backend_reads_rtdb_uservotes",
+ "backend_reads_rtdb_cachestats",
+ "backend_lifecycle_concept_fanout"
+ ],
+ "relation": "implement",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md"
+ },
+ {
+ "id": "backend_read_optimization_set",
+ "label": "Backend Read Optimization Set R1 R4 R5 R7",
+ "nodes": [
+ "backend_improvements_reads_r1_gamedaycache",
+ "backend_improvements_reads_r4_backoff",
+ "backend_improvements_reads_r5_fieldmask",
+ "backend_improvements_reads_r7_parallelrank"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md"
+ },
+ {
+ "id": "backend_write_optimization_set",
+ "label": "Backend Write Optimization Set W1 through W6",
+ "nodes": [
+ "backend_improvements_writes_w1_diff",
+ "backend_improvements_writes_w2_votehistory",
+ "backend_improvements_writes_w3_statsdedup",
+ "backend_improvements_writes_w4_ranksnapshot",
+ "backend_improvements_writes_w5r6_photourl",
+ "backend_improvements_writes_w6_gamedetailttl"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md"
+ },
+ {
+ "id": "prediction_vote_flow",
+ "label": "User Prediction Vote Flow",
+ "nodes": [
+ "backend_writes_endpoint_post_prediction",
+ "backend_writes_endpoint_put_prediction",
+ "backend_reads_repo_voterepo",
+ "backend_reads_rtdb_votes",
+ "backend_reads_rtdb_uservotes"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md"
+ },
+ {
+ "id": "tier1_optimizations",
+ "label": "Tier 1 High-Impact Low-Risk Optimizations",
+ "nodes": [
+ "opt_W1",
+ "opt_W2",
+ "opt_R1",
+ "opt_C1"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md"
+ },
+ {
+ "id": "tier2_optimizations",
+ "label": "Tier 2 Medium-Impact Optimizations",
+ "nodes": [
+ "opt_R2",
+ "opt_W3",
+ "opt_R3",
+ "opt_R4",
+ "opt_C2",
+ "opt_C3"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md"
+ },
+ {
+ "id": "tier3_optimizations",
+ "label": "Tier 3 Small / Housekeeping Optimizations",
+ "nodes": [
+ "opt_W4",
+ "opt_W5",
+ "opt_W6",
+ "opt_R5",
+ "opt_R6",
+ "opt_R7",
+ "opt_C4"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md"
+ },
+ {
+ "id": "client_applied_improvements",
+ "label": "Applied Client Optimizations (opt/client-rw branch)",
+ "nodes": [
+ "opt_C1",
+ "opt_C2",
+ "opt_C3",
+ "opt_C4",
+ "client_vote_repo_after",
+ "client_standings_provider_after",
+ "client_h2h_provider_after",
+ "client_ace_pitcher_after",
+ "client_current_user_after"
+ ],
+ "relation": "implement",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md"
+ },
+ {
+ "id": "swr_cache_adapters",
+ "label": "SWR Cache Adapters (4 domains)",
+ "nodes": [
+ "client_schedule_cache",
+ "client_game_detail_cache",
+ "client_day_record_cache",
+ "client_game_record_dates_cache"
+ ],
+ "relation": "implement",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md"
+ },
+ {
+ "id": "client_keepalive_repos",
+ "label": "All Client Repositories (keepAlive)",
+ "nodes": [
+ "client_game_repo",
+ "client_user_repo",
+ "client_prediction_repo",
+ "client_team_record_repo",
+ "client_player_repo",
+ "client_game_detail_repo",
+ "client_scoreboard_repo",
+ "client_attendance_repo"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md"
+ },
+ {
+ "id": "duplicate_call_problem",
+ "label": "Duplicate CF Call Pattern (C2+C3)",
+ "nodes": [
+ "client_provider_h2h",
+ "client_provider_rank",
+ "client_ep_rank",
+ "client_provider_ace_pitcher",
+ "client_provider_pitchers",
+ "client_ep_player"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md"
+ }
+ ]
+ },
+ "nodes": [
+ {
+ "label": "Firestore users Collection",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_firestore_users",
+ "community": 2,
+ "norm_label": "firestore users collection"
+ },
+ {
+ "label": "Firestore voteHistory Subcollection",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_firestore_votehistory",
+ "community": 1,
+ "norm_label": "firestore votehistory subcollection"
+ },
+ {
+ "label": "Firestore attendance Subcollection",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_firestore_attendance",
+ "community": 11,
+ "norm_label": "firestore attendance subcollection"
+ },
+ {
+ "label": "Firestore pointLedger Subcollection",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_firestore_pointledger",
+ "community": 11,
+ "norm_label": "firestore pointledger subcollection"
+ },
+ {
+ "label": "Firestore games Collection",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_firestore_games",
+ "community": 1,
+ "norm_label": "firestore games collection"
+ },
+ {
+ "label": "Firestore kboCache Collection",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_firestore_kbocache",
+ "community": 0,
+ "norm_label": "firestore kbocache collection"
+ },
+ {
+ "label": "Firestore kboLocks Collection",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_firestore_kbolocks",
+ "community": 0,
+ "norm_label": "firestore kbolocks collection"
+ },
+ {
+ "label": "RTDB /votes/{gameId} Path",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_rtdb_votes",
+ "community": 8,
+ "norm_label": "rtdb /votes/{gameid} path"
+ },
+ {
+ "label": "RTDB /userVotes/{uid}/{date} Path",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_rtdb_uservotes",
+ "community": 1,
+ "norm_label": "rtdb /uservotes/{uid}/{date} path"
+ },
+ {
+ "label": "RTDB /cache/stats/{uid} Path",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_rtdb_cachestats",
+ "community": 1,
+ "norm_label": "rtdb /cache/stats/{uid} path"
+ },
+ {
+ "label": "RTDB /scoreboardCache/{date} Path",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_rtdb_scoreboardcache",
+ "community": 2,
+ "norm_label": "rtdb /scoreboardcache/{date} path"
+ },
+ {
+ "label": "RTDB /nicknames Path",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_rtdb_nicknames",
+ "community": 2,
+ "norm_label": "rtdb /nicknames path"
+ },
+ {
+ "label": "RTDB /userNicknames Path",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_rtdb_usernicknames",
+ "community": 2,
+ "norm_label": "rtdb /usernicknames path"
+ },
+ {
+ "label": "External KBO API (koreabaseball.com)",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_external_kbo",
+ "community": 0,
+ "norm_label": "external kbo api (koreabaseball.com)"
+ },
+ {
+ "label": "In-Memory MemCache (Server-side)",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_memcache",
+ "community": 8,
+ "norm_label": "in-memory memcache (server-side)"
+ },
+ {
+ "label": "gameListService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_gamelistservice",
+ "community": 8,
+ "norm_label": "gamelistservice (server)"
+ },
+ {
+ "label": "rankService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_rankservice",
+ "community": 0,
+ "norm_label": "rankservice (server)"
+ },
+ {
+ "label": "playerService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_playerservice",
+ "community": 0,
+ "norm_label": "playerservice (server)"
+ },
+ {
+ "label": "scheduleService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_scheduleservice",
+ "community": 0,
+ "norm_label": "scheduleservice (server)"
+ },
+ {
+ "label": "gameDetailService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_gamedetailservice",
+ "community": 0,
+ "norm_label": "gamedetailservice (server)"
+ },
+ {
+ "label": "scoreboardService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_scoreboardservice",
+ "community": 2,
+ "norm_label": "scoreboardservice (server)"
+ },
+ {
+ "label": "statsService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_statsservice",
+ "community": 1,
+ "norm_label": "statsservice (server)"
+ },
+ {
+ "label": "predictionService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_predictionservice",
+ "community": 8,
+ "norm_label": "predictionservice (server)"
+ },
+ {
+ "label": "judgmentService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_judgmentservice",
+ "community": 1,
+ "norm_label": "judgmentservice (server)"
+ },
+ {
+ "label": "gameSyncService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_gamesyncservice",
+ "community": 0,
+ "norm_label": "gamesyncservice (server)"
+ },
+ {
+ "label": "userService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_userservice",
+ "community": 2,
+ "norm_label": "userservice (server)"
+ },
+ {
+ "label": "rankSnapshotService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_ranksnapshotservice",
+ "community": 2,
+ "norm_label": "ranksnapshotservice (server)"
+ },
+ {
+ "label": "attendanceService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_svc_attendanceservice",
+ "community": 11,
+ "norm_label": "attendanceservice (server)"
+ },
+ {
+ "label": "kboCacheRepository (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_repo_kbocacherepo",
+ "community": 0,
+ "norm_label": "kbocacherepository (server)"
+ },
+ {
+ "label": "kboRepository (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_repo_kborepo",
+ "community": 0,
+ "norm_label": "kborepository (server)"
+ },
+ {
+ "label": "scoreboardCacheRepository (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_repo_scoreboardcacherepo",
+ "community": 15,
+ "norm_label": "scoreboardcacherepository (server)"
+ },
+ {
+ "label": "voteRepository (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_repo_voterepo",
+ "community": 8,
+ "norm_label": "voterepository (server)"
+ },
+ {
+ "label": "gameRepository (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_repo_gamerepo",
+ "community": 1,
+ "norm_label": "gamerepository (server)"
+ },
+ {
+ "label": "voteHistoryRepository (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_repo_votehistoryrepo",
+ "community": 1,
+ "norm_label": "votehistoryrepository (server)"
+ },
+ {
+ "label": "GET /kbo/games Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_kbo_games",
+ "community": 8,
+ "norm_label": "get /kbo/games endpoint"
+ },
+ {
+ "label": "GET /kbo/rank Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_kbo_rank",
+ "community": 0,
+ "norm_label": "get /kbo/rank endpoint"
+ },
+ {
+ "label": "GET /kbo/player Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_kbo_player",
+ "community": 0,
+ "norm_label": "get /kbo/player endpoint"
+ },
+ {
+ "label": "GET /kbo/schedule Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_kbo_schedule",
+ "community": 0,
+ "norm_label": "get /kbo/schedule endpoint"
+ },
+ {
+ "label": "GET /kbo/gameDetail Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_kbo_gamedetail",
+ "community": 0,
+ "norm_label": "get /kbo/gamedetail endpoint"
+ },
+ {
+ "label": "GET /prediction/scoreboard Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_scoreboard",
+ "community": 2,
+ "norm_label": "get /prediction/scoreboard endpoint"
+ },
+ {
+ "label": "GET /stats Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_stats",
+ "community": 1,
+ "norm_label": "get /stats endpoint"
+ },
+ {
+ "label": "GET /prediction/games Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_prediction_games",
+ "community": 1,
+ "norm_label": "get /prediction/games endpoint"
+ },
+ {
+ "label": "GET /prediction Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_prediction",
+ "community": 8,
+ "norm_label": "get /prediction endpoint"
+ },
+ {
+ "label": "GET /prediction/summary Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_reads_endpoint_prediction_summary",
+ "community": 8,
+ "norm_label": "get /prediction/summary endpoint"
+ },
+ {
+ "label": "kboDailyRefresh Cron (02:00 KST)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_cron_kbodailyrefresh",
+ "community": 0,
+ "norm_label": "kbodailyrefresh cron (02:00 kst)"
+ },
+ {
+ "label": "dailyArchive Cron (03:00 KST)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_cron_dailyarchive",
+ "community": 1,
+ "norm_label": "dailyarchive cron (03:00 kst)"
+ },
+ {
+ "label": "onGameCompleted Firestore Trigger",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_trigger_ongamecompleted",
+ "community": 1,
+ "norm_label": "ongamecompleted firestore trigger"
+ },
+ {
+ "label": "gameResultService (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_svc_gameresultservice",
+ "community": 1,
+ "norm_label": "gameresultservice (server)"
+ },
+ {
+ "label": "nicknameRepository (Server)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_svc_nicknameservice",
+ "community": 16,
+ "norm_label": "nicknamerepository (server)"
+ },
+ {
+ "label": "POST /user Endpoint (createMe)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_endpoint_post_user",
+ "community": 2,
+ "norm_label": "post /user endpoint (createme)"
+ },
+ {
+ "label": "PATCH /user Endpoint (updateMe)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_endpoint_patch_user",
+ "community": 2,
+ "norm_label": "patch /user endpoint (updateme)"
+ },
+ {
+ "label": "GET /user Endpoint (getMe)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_endpoint_get_user",
+ "community": 2,
+ "norm_label": "get /user endpoint (getme)"
+ },
+ {
+ "label": "POST /prediction Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_endpoint_post_prediction",
+ "community": 8,
+ "norm_label": "post /prediction endpoint"
+ },
+ {
+ "label": "PUT /prediction Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_endpoint_put_prediction",
+ "community": 8,
+ "norm_label": "put /prediction endpoint"
+ },
+ {
+ "label": "POST /attendance/check-in Endpoint",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_endpoint_post_checkin",
+ "community": 11,
+ "norm_label": "post /attendance/check-in endpoint"
+ },
+ {
+ "label": "POST /admin/game/end Endpoint (markGameEnded)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_endpoint_post_admin_gameend",
+ "community": 1,
+ "norm_label": "post /admin/game/end endpoint (markgameended)"
+ },
+ {
+ "label": "debug/forceSync Endpoint (unauthenticated)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_writes_endpoint_debug_forcesync",
+ "community": 0,
+ "norm_label": "debug/forcesync endpoint (unauthenticated)"
+ },
+ {
+ "label": "Client Firebase Auth",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_lifecycle_client_firebaseauth",
+ "community": 17,
+ "norm_label": "client firebase auth"
+ },
+ {
+ "label": "Client Remote Config (team_order_by_standing)",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_lifecycle_client_remoteconfig",
+ "community": 18,
+ "norm_label": "client remote config (team_order_by_standing)"
+ },
+ {
+ "label": "Client FCM / users.fcmTokens Direct Write",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_lifecycle_client_fcm",
+ "community": 2,
+ "norm_label": "client fcm / users.fcmtokens direct write"
+ },
+ {
+ "label": "Client SWR Cache (swr_cache.dart)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_lifecycle_client_swrcache",
+ "community": 0,
+ "norm_label": "client swr cache (swr_cache.dart)"
+ },
+ {
+ "label": "Fan-out Write Pattern (stats invalidation)",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_lifecycle_concept_fanout",
+ "community": 1,
+ "norm_label": "fan-out write pattern (stats invalidation)"
+ },
+ {
+ "label": "Precompute Scoreboard Cache Concept",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_lifecycle_concept_precompute",
+ "community": 2,
+ "norm_label": "precompute scoreboard cache concept"
+ },
+ {
+ "label": "Distributed Lock (kboLocks TTL 30s)",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_lifecycle_concept_distributedlock",
+ "community": 0,
+ "norm_label": "distributed lock (kbolocks ttl 30s)"
+ },
+ {
+ "label": "R1: GameDayCache Memoization Fix",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_reads_r1_gamedaycache",
+ "community": 1,
+ "norm_label": "r1: gamedaycache memoization fix"
+ },
+ {
+ "label": "R4: Cache Stampede Exponential Backoff Fix",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_reads_r4_backoff",
+ "community": 0,
+ "norm_label": "r4: cache stampede exponential backoff fix"
+ },
+ {
+ "label": "R5: Scoreboard Self-User FieldMask Fix",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_reads_r5_fieldmask",
+ "community": 2,
+ "norm_label": "r5: scoreboard self-user fieldmask fix"
+ },
+ {
+ "label": "R7: Multi-Year Rank Parallel Fetch Fix",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_reads_r7_parallelrank",
+ "community": 0,
+ "norm_label": "r7: multi-year rank parallel fetch fix"
+ },
+ {
+ "label": "W1: games syncGamesForMonth getAll+diff Fix",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_writes_w1_diff",
+ "community": 0,
+ "norm_label": "w1: games syncgamesformonth getall+diff fix"
+ },
+ {
+ "label": "W2: voteHistory Double-Write Consolidation Fix",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_writes_w2_votehistory",
+ "community": 1,
+ "norm_label": "w2: votehistory double-write consolidation fix"
+ },
+ {
+ "label": "W3: Archive Stats Invalidation Fan-out Dedup Fix",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_writes_w3_statsdedup",
+ "community": 1,
+ "norm_label": "w3: archive stats invalidation fan-out dedup fix"
+ },
+ {
+ "label": "W4: Rank Snapshot Merged Into Judgment Tx Fix",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_writes_w4_ranksnapshot",
+ "community": 2,
+ "norm_label": "w4: rank snapshot merged into judgment tx fix"
+ },
+ {
+ "label": "W5+R6: getMe photoUrl Hot-Write Suppression Fix",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_writes_w5r6_photourl",
+ "community": 2,
+ "norm_label": "w5+r6: getme photourl hot-write suppression fix"
+ },
+ {
+ "label": "W6: game_detail Cache Bulk Invalidation Stopped",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_improvements_writes_w6_gamedetailttl",
+ "community": 0,
+ "norm_label": "w6: game_detail cache bulk invalidation stopped"
+ },
+ {
+ "label": "W1: Games Sync Diff Optimization",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_W1",
+ "community": 4,
+ "norm_label": "w1: games sync diff optimization"
+ },
+ {
+ "label": "W2: voteHistory Double Write Consolidation",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_W2",
+ "community": 9,
+ "norm_label": "w2: votehistory double write consolidation"
+ },
+ {
+ "label": "W3: Stats Invalidation Fan-out Per User",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_W3",
+ "community": 9,
+ "norm_label": "w3: stats invalidation fan-out per user"
+ },
+ {
+ "label": "W4: Users Cron Write Deduplication",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_W4",
+ "community": 19,
+ "norm_label": "w4: users cron write deduplication"
+ },
+ {
+ "label": "W5: getMe photoUrl Write Conservative",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_W5",
+ "community": 20,
+ "norm_label": "w5: getme photourl write conservative"
+ },
+ {
+ "label": "W6: kboCache game_detail TTL Natural Expiry",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_W6",
+ "community": 4,
+ "norm_label": "w6: kbocache game_detail ttl natural expiry"
+ },
+ {
+ "label": "R1: dailyArchive listByDate Sharing",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_R1",
+ "community": 4,
+ "norm_label": "r1: dailyarchive listbydate sharing"
+ },
+ {
+ "label": "R2: getStats Incremental Aggregation",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_R2",
+ "community": 9,
+ "norm_label": "r2: getstats incremental aggregation"
+ },
+ {
+ "label": "R3: dailyArchive userVotes Shallow Read",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_R3",
+ "community": 4,
+ "norm_label": "r3: dailyarchive uservotes shallow read"
+ },
+ {
+ "label": "R4: Cache Stampede Polling Backoff",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_R4",
+ "community": 14,
+ "norm_label": "r4: cache stampede polling backoff"
+ },
+ {
+ "label": "R5: Scoreboard getUser Select + Rank Cache",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_R5",
+ "community": 21,
+ "norm_label": "r5: scoreboard getuser select + rank cache"
+ },
+ {
+ "label": "R6: createMe/updateMe Remove Secondary getUser",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_R6",
+ "community": 22,
+ "norm_label": "r6: createme/updateme remove secondary getuser"
+ },
+ {
+ "label": "R7: Rank Multi-year getOrFetch Parallelization",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_R7",
+ "community": 23,
+ "norm_label": "r7: rank multi-year getorfetch parallelization"
+ },
+ {
+ "label": "C1: voteSummary Polling to RTDB Subscription",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_C1",
+ "community": 7,
+ "norm_label": "c1: votesummary polling to rtdb subscription"
+ },
+ {
+ "label": "C2: rank/h2h Duplicate Call Removal",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_C2",
+ "community": 5,
+ "norm_label": "c2: rank/h2h duplicate call removal"
+ },
+ {
+ "label": "C3: pitchers/acePitcher Duplicate Call Removal",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_C3",
+ "community": 5,
+ "norm_label": "c3: pitchers/acepitcher duplicate call removal"
+ },
+ {
+ "label": "C4: Uncached autoDispose Providers SWR/keepAlive",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "opt_C4",
+ "community": 3,
+ "norm_label": "c4: uncached autodispose providers swr/keepalive"
+ },
+ {
+ "label": "Panit Data Pattern Documentation Overview",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_README.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "readme_overview",
+ "community": 4,
+ "norm_label": "panit data pattern documentation overview"
+ },
+ {
+ "label": "Cost Summary: Top Write/Read/Client Costs",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_README.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "readme_cost_summary",
+ "community": 4,
+ "norm_label": "cost summary: top write/read/client costs"
+ },
+ {
+ "label": "Firestore Composite Indexes (No Gaps)",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/backend_README.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "readme_index_ok",
+ "community": 4,
+ "norm_label": "firestore composite indexes (no gaps)"
+ },
+ {
+ "label": "dioProvider \u2014 Single HTTP Gateway (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/api_client.dart:7",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_dio_provider",
+ "community": 12,
+ "norm_label": "dioprovider \u2014 single http gateway (keepalive)"
+ },
+ {
+ "label": "Cloud Functions Base URL (asia-northeast3-mmday-panit)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_api_base",
+ "community": 12,
+ "norm_label": "cloud functions base url (asia-northeast3-mmday-panit)"
+ },
+ {
+ "label": "GameRepository (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/game_repository.dart:11",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_game_repo",
+ "community": 6,
+ "norm_label": "gamerepository (keepalive)"
+ },
+ {
+ "label": "UserRepository (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/user_repository.dart:11",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_user_repo",
+ "community": 3,
+ "norm_label": "userrepository (keepalive)"
+ },
+ {
+ "label": "PredictionRepository (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/prediction_repository.dart:9",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_prediction_repo",
+ "community": 7,
+ "norm_label": "predictionrepository (keepalive)"
+ },
+ {
+ "label": "TeamRecordRepository (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/team_record_repository.dart:9",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_team_record_repo",
+ "community": 5,
+ "norm_label": "teamrecordrepository (keepalive)"
+ },
+ {
+ "label": "PlayerRepository (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/player_repository.dart:10",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_player_repo",
+ "community": 5,
+ "norm_label": "playerrepository (keepalive)"
+ },
+ {
+ "label": "GameDetailRepository (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/game_detail/data/game_detail_repository.dart:8",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_game_detail_repo",
+ "community": 6,
+ "norm_label": "gamedetailrepository (keepalive)"
+ },
+ {
+ "label": "ScoreboardRepository (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/scoreboard/data/scoreboard_repository.dart:12",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_scoreboard_repo",
+ "community": 3,
+ "norm_label": "scoreboardrepository (keepalive)"
+ },
+ {
+ "label": "AttendanceRepository (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/attendance/data/attendance_repository.dart:10",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_attendance_repo",
+ "community": 10,
+ "norm_label": "attendancerepository (keepalive)"
+ },
+ {
+ "label": "NoticeRepository (keepAlive, mock TODO)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/mypage/data/notice_repository.dart:6",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_notice_repo",
+ "community": 24,
+ "norm_label": "noticerepository (keepalive, mock todo)"
+ },
+ {
+ "label": "CF Endpoint: GET /kbo/schedule",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/game_repository.dart:25",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_schedule",
+ "community": 6,
+ "norm_label": "cf endpoint: get /kbo/schedule"
+ },
+ {
+ "label": "CF Endpoint: GET /kbo/rank",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/team_record_repository.dart:20",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_rank",
+ "community": 5,
+ "norm_label": "cf endpoint: get /kbo/rank"
+ },
+ {
+ "label": "CF Endpoint: GET /kbo/player",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/player_repository.dart:31",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_player",
+ "community": 5,
+ "norm_label": "cf endpoint: get /kbo/player"
+ },
+ {
+ "label": "CF Endpoint: GET /kbo/gameDetail",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/game_detail/data/game_detail_repository.dart:23",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_game_detail",
+ "community": 6,
+ "norm_label": "cf endpoint: get /kbo/gamedetail"
+ },
+ {
+ "label": "CF Endpoint: GET /user",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/user_repository.dart:24",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_get_user",
+ "community": 3,
+ "norm_label": "cf endpoint: get /user"
+ },
+ {
+ "label": "CF Endpoint: GET /user/check-nickname",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/user_repository.dart:48",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_check_nickname",
+ "community": 3,
+ "norm_label": "cf endpoint: get /user/check-nickname"
+ },
+ {
+ "label": "CF Endpoint: POST /user (onboarding)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/user_repository.dart:64",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_post_user",
+ "community": 3,
+ "norm_label": "cf endpoint: post /user (onboarding)"
+ },
+ {
+ "label": "CF Endpoint: PATCH /user (profile update)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/user_repository.dart:82",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_patch_user",
+ "community": 3,
+ "norm_label": "cf endpoint: patch /user (profile update)"
+ },
+ {
+ "label": "CF Endpoint: DELETE /user",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/user_repository.dart:101",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_delete_user",
+ "community": 3,
+ "norm_label": "cf endpoint: delete /user"
+ },
+ {
+ "label": "CF Endpoint: GET /stats",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/user_repository.dart:108",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_stats",
+ "community": 3,
+ "norm_label": "cf endpoint: get /stats"
+ },
+ {
+ "label": "CF Endpoint: GET /stats/history",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/user_repository.dart:130",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_stats_history",
+ "community": 3,
+ "norm_label": "cf endpoint: get /stats/history"
+ },
+ {
+ "label": "CF Endpoint: POST /prediction",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/prediction_repository.dart:22",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_post_prediction",
+ "community": 7,
+ "norm_label": "cf endpoint: post /prediction"
+ },
+ {
+ "label": "CF Endpoint: PUT /prediction",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/prediction_repository.dart:32",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_put_prediction",
+ "community": 7,
+ "norm_label": "cf endpoint: put /prediction"
+ },
+ {
+ "label": "CF Endpoint: GET /prediction (by date)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/prediction_repository.dart:41",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_get_prediction",
+ "community": 7,
+ "norm_label": "cf endpoint: get /prediction (by date)"
+ },
+ {
+ "label": "CF Endpoint: GET /prediction/summary (10s polling)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/prediction_repository.dart:58",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_vote_summary",
+ "community": 7,
+ "norm_label": "cf endpoint: get /prediction/summary (10s polling)"
+ },
+ {
+ "label": "CF Endpoint: GET /prediction/scoreboard",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/scoreboard/data/scoreboard_repository.dart:39",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_scoreboard",
+ "community": 3,
+ "norm_label": "cf endpoint: get /prediction/scoreboard"
+ },
+ {
+ "label": "CF Endpoint: GET /attendance/month",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/attendance/data/attendance_repository.dart:26",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_attendance_month",
+ "community": 10,
+ "norm_label": "cf endpoint: get /attendance/month"
+ },
+ {
+ "label": "CF Endpoint: POST /attendance/check-in",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/attendance/data/attendance_repository.dart:52",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_checkin",
+ "community": 10,
+ "norm_label": "cf endpoint: post /attendance/check-in"
+ },
+ {
+ "label": "CF Endpoint: PATCH /users/me/notifications",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/attendance/data/attendance_repository.dart:76",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ep_notifications",
+ "community": 10,
+ "norm_label": "cf endpoint: patch /users/me/notifications"
+ },
+ {
+ "label": "AuthRepository (Google/Apple signIn)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/auth_repository.dart",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_auth_repo",
+ "community": 25,
+ "norm_label": "authrepository (google/apple signin)"
+ },
+ {
+ "label": "authStateChangesProvider (Live Stream, keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_auth_state_provider",
+ "community": 26,
+ "norm_label": "authstatechangesprovider (live stream, keepalive)"
+ },
+ {
+ "label": "Remote Config Service (team_order_by_standing)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/core/services/remote_config_service.dart",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_remote_config",
+ "community": 27,
+ "norm_label": "remote config service (team_order_by_standing)"
+ },
+ {
+ "label": "FCM Service (token write to Firestore)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/core/services/fcm_service.dart:40,58",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_fcm_service",
+ "community": 13,
+ "norm_label": "fcm service (token write to firestore)"
+ },
+ {
+ "label": "Firestore: users/{uid}.fcmTokens (direct write)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "fs_users_fcm_tokens",
+ "community": 13,
+ "norm_label": "firestore: users/{uid}.fcmtokens (direct write)"
+ },
+ {
+ "label": "SWR Cache (SharedPreferences + in-memory, no TTL)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/core/cache/swr_cache.dart",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_swr_cache",
+ "community": 6,
+ "norm_label": "swr cache (sharedpreferences + in-memory, no ttl)"
+ },
+ {
+ "label": "ScheduleCache (monthly_schedule namespace)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_schedule_cache",
+ "community": 6,
+ "norm_label": "schedulecache (monthly_schedule namespace)"
+ },
+ {
+ "label": "GameDetailCache (game_detail namespace)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_game_detail_cache",
+ "community": 6,
+ "norm_label": "gamedetailcache (game_detail namespace)"
+ },
+ {
+ "label": "DayRecordCache (day_prediction_record, skip if settled)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_day_record_cache",
+ "community": 6,
+ "norm_label": "dayrecordcache (day_prediction_record, skip if settled)"
+ },
+ {
+ "label": "GameRecordDatesCache (game_record_dates namespace)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_game_record_dates_cache",
+ "community": 6,
+ "norm_label": "gamerecorddatescache (game_record_dates namespace)"
+ },
+ {
+ "label": "monthlySchedule Provider (keepAlive + SWR)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_monthly_schedule",
+ "community": 6,
+ "norm_label": "monthlyschedule provider (keepalive + swr)"
+ },
+ {
+ "label": "gameDetail Provider (keepAlive + SWR)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_game_detail",
+ "community": 6,
+ "norm_label": "gamedetail provider (keepalive + swr)"
+ },
+ {
+ "label": "voteSummary Provider (StreamProvider 10s poll)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/presentation/providers/prediction_providers.dart:31",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_vote_summary",
+ "community": 7,
+ "norm_label": "votesummary provider (streamprovider 10s poll)"
+ },
+ {
+ "label": "currentUser Provider (autoDispose, no cache)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_current_user",
+ "community": 3,
+ "norm_label": "currentuser provider (autodispose, no cache)"
+ },
+ {
+ "label": "rank Provider (autoDispose, no cache)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_rank",
+ "community": 5,
+ "norm_label": "rank provider (autodispose, no cache)"
+ },
+ {
+ "label": "h2h Provider (autoDispose, no cache, duplicates rank call)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_h2h",
+ "community": 5,
+ "norm_label": "h2h provider (autodispose, no cache, duplicates rank call)"
+ },
+ {
+ "label": "pitchers Provider (autoDispose, no cache)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_pitchers",
+ "community": 5,
+ "norm_label": "pitchers provider (autodispose, no cache)"
+ },
+ {
+ "label": "acePitcher Provider (autoDispose, duplicate player call)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_ace_pitcher",
+ "community": 5,
+ "norm_label": "acepitcher provider (autodispose, duplicate player call)"
+ },
+ {
+ "label": "scoreboard Provider (autoDispose, no cache)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_scoreboard",
+ "community": 3,
+ "norm_label": "scoreboard provider (autodispose, no cache)"
+ },
+ {
+ "label": "userStats Provider (autoDispose, no cache)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_user_stats",
+ "community": 3,
+ "norm_label": "userstats provider (autodispose, no cache)"
+ },
+ {
+ "label": "DayPredictionRecord Provider (autoDispose + SWR skip if settled)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_day_prediction_record",
+ "community": 6,
+ "norm_label": "daypredictionrecord provider (autodispose + swr skip if settled)"
+ },
+ {
+ "label": "GameRecordDates Provider (keepAlive + SWR)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_game_record_dates",
+ "community": 6,
+ "norm_label": "gamerecorddates provider (keepalive + swr)"
+ },
+ {
+ "label": "PredictionAction Notifier (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_prediction_action",
+ "community": 7,
+ "norm_label": "predictionaction notifier (keepalive)"
+ },
+ {
+ "label": "CheckInController Notifier (autoDispose)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_provider_checkin_controller",
+ "community": 10,
+ "norm_label": "checkincontroller notifier (autodispose)"
+ },
+ {
+ "label": "splash_page.dart (duplicate GET /user on start)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/splash/presentation/pages/splash_page.dart:45",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_splash_page",
+ "community": 3,
+ "norm_label": "splash_page.dart (duplicate get /user on start)"
+ },
+ {
+ "label": "RTDB: voteAggregates/{gameId} (public read)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "rtdb_vote_aggregates",
+ "community": 7,
+ "norm_label": "rtdb: voteaggregates/{gameid} (public read)"
+ },
+ {
+ "label": "VoteRepository After C1 (RTDB onValue subscription)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": "lib/features/prediction/data/vote_repository.dart",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_vote_repo_after",
+ "community": 7,
+ "norm_label": "voterepository after c1 (rtdb onvalue subscription)"
+ },
+ {
+ "label": "standings Provider After C2 (single source)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": "lib/features/prediction/application/standings_provider.dart",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_standings_provider_after",
+ "community": 5,
+ "norm_label": "standings provider after c2 (single source)"
+ },
+ {
+ "label": "headToHead Provider After C2 (watches standings)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": "lib/features/prediction/application/h2h_provider.dart",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_h2h_provider_after",
+ "community": 5,
+ "norm_label": "headtohead provider after c2 (watches standings)"
+ },
+ {
+ "label": "acePitcher Provider After C3 (derived from pitchers)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": "lib/features/prediction/application/ace_pitcher_provider.dart",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_ace_pitcher_after",
+ "community": 5,
+ "norm_label": "acepitcher provider after c3 (derived from pitchers)"
+ },
+ {
+ "label": "currentUser Provider After C4 (keepAlive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": "lib/features/auth/application/current_user_provider.dart",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_current_user_after",
+ "community": 3,
+ "norm_label": "currentuser provider after c4 (keepalive)"
+ },
+ {
+ "label": "Client Improvements Summary (C1-C4 Applied)",
+ "file_type": "document",
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "client_improvements_summary",
+ "community": 5,
+ "norm_label": "client improvements summary (c1-c4 applied)"
+ },
+ {
+ "label": "debugHandlers.ts (Unauthenticated forceSync/dailyArchive)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "debugHandlers.ts",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_debug_handlers",
+ "community": 4,
+ "norm_label": "debughandlers.ts (unauthenticated forcesync/dailyarchive)"
+ },
+ {
+ "label": "syncGamesForMonth (gameSyncService.ts:63)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "gameSyncService.ts:63",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_sync_games_service",
+ "community": 4,
+ "norm_label": "syncgamesformonth (gamesyncservice.ts:63)"
+ },
+ {
+ "label": "dailyArchive.ts (setDay + judgeDay)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "dailyArchive.ts",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_daily_archive",
+ "community": 4,
+ "norm_label": "dailyarchive.ts (setday + judgeday)"
+ },
+ {
+ "label": "judgeDay (judgmentService.ts:94)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "judgmentService.ts:94",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_judge_day",
+ "community": 9,
+ "norm_label": "judgeday (judgmentservice.ts:94)"
+ },
+ {
+ "label": "invalidateStats (/cache/stats/{uid} delete)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_invalidate_stats",
+ "community": 9,
+ "norm_label": "invalidatestats (/cache/stats/{uid} delete)"
+ },
+ {
+ "label": "gameResultService.ts:42 (stats fan-out on game complete)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "gameResultService.ts:42",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_game_result_service",
+ "community": 9,
+ "norm_label": "gameresultservice.ts:42 (stats fan-out on game complete)"
+ },
+ {
+ "label": "onGameCompleted.ts:59 (Firestore trigger)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "onGameCompleted.ts:59",
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_on_game_completed",
+ "community": 9,
+ "norm_label": "ongamecompleted.ts:59 (firestore trigger)"
+ },
+ {
+ "label": "Firestore: games collection",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "fs_games",
+ "community": 4,
+ "norm_label": "firestore: games collection"
+ },
+ {
+ "label": "Firestore: voteHistory collection",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "fs_vote_history",
+ "community": 9,
+ "norm_label": "firestore: votehistory collection"
+ },
+ {
+ "label": "Firestore: dailyArchive collection",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "fs_daily_archive",
+ "community": 4,
+ "norm_label": "firestore: dailyarchive collection"
+ },
+ {
+ "label": "Firestore/Cache: /cache/stats/{uid}",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "fs_cache_stats",
+ "community": 9,
+ "norm_label": "firestore/cache: /cache/stats/{uid}"
+ },
+ {
+ "label": "RTDB: /userVotes (full tree, all users/dates)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "rtdb_user_votes",
+ "community": 4,
+ "norm_label": "rtdb: /uservotes (full tree, all users/dates)"
+ },
+ {
+ "label": "RTDB: votes/{gameId}/counts (public read)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "rtdb_votes_gameId",
+ "community": 7,
+ "norm_label": "rtdb: votes/{gameid}/counts (public read)"
+ },
+ {
+ "label": "Firestore/Cache: kboCache (game_detail__ TTL)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "fs_kbo_cache",
+ "community": 4,
+ "norm_label": "firestore/cache: kbocache (game_detail__ ttl)"
+ },
+ {
+ "label": "CF: /stats (getStats Cloud Function)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_get_stats_cf",
+ "community": 9,
+ "norm_label": "cf: /stats (getstats cloud function)"
+ },
+ {
+ "label": "waitForCache / getOrFetchDynamic (polling lock)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_wait_for_cache",
+ "community": 14,
+ "norm_label": "waitforcache / getorfetchdynamic (polling lock)"
+ },
+ {
+ "label": "Cron Job: 02:00 daily (syncGamesForMonth + kboCache invalidation)",
+ "file_type": "code",
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "source_url": null,
+ "captured_at": null,
+ "author": null,
+ "contributor": null,
+ "id": "backend_cron_0200",
+ "community": 4,
+ "norm_label": "cron job: 02:00 daily (syncgamesformonth + kbocache invalidation)"
+ }
+ ],
+ "links": [
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "scoreboardService.ts:54",
+ "weight": 1.0,
+ "source": "backend_reads_svc_scoreboardservice",
+ "target": "backend_reads_firestore_users"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "rankSnapshotService.ts:26-54",
+ "weight": 1.0,
+ "source": "backend_reads_svc_ranksnapshotservice",
+ "target": "backend_reads_firestore_users"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "userRepository.ts:182-254",
+ "weight": 1.0,
+ "source": "backend_writes_cron_dailyarchive",
+ "target": "backend_reads_firestore_users"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "userRepository.ts:128-139",
+ "weight": 1.0,
+ "source": "backend_reads_svc_userservice",
+ "target": "backend_reads_firestore_users"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": "fcm_service.dart:40,58",
+ "weight": 1.0,
+ "source": "backend_lifecycle_client_fcm",
+ "target": "backend_reads_firestore_users"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "voteHistoryRepository.ts:53",
+ "weight": 1.0,
+ "source": "backend_reads_repo_votehistoryrepo",
+ "target": "backend_reads_firestore_votehistory"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "dailyArchive.ts:130",
+ "weight": 1.0,
+ "source": "backend_writes_cron_dailyarchive",
+ "target": "backend_reads_firestore_votehistory"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": "commit 48a8f16",
+ "weight": 1.0,
+ "source": "backend_improvements_writes_w2_votehistory",
+ "target": "backend_reads_firestore_votehistory"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "attendanceService.ts checkIn transaction",
+ "weight": 1.0,
+ "source": "backend_reads_svc_attendanceservice",
+ "target": "backend_reads_firestore_attendance"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "pointLedger[createdAt DESC,seq DESC]",
+ "weight": 1.0,
+ "source": "backend_reads_svc_attendanceservice",
+ "target": "backend_reads_firestore_pointledger"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "gameRepository.listByDate:27-37",
+ "weight": 1.0,
+ "source": "backend_reads_repo_gamerepo",
+ "target": "backend_reads_firestore_games"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "judgmentService.ts:27-41",
+ "weight": 1.0,
+ "source": "backend_reads_svc_judgmentservice",
+ "target": "backend_reads_firestore_games"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "gameSyncService.ts:63-77",
+ "weight": 1.0,
+ "source": "backend_reads_svc_gamesyncservice",
+ "target": "backend_reads_firestore_games"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "gameResultService.ts:48-64",
+ "weight": 1.0,
+ "source": "backend_writes_endpoint_post_admin_gameend",
+ "target": "backend_reads_firestore_games"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "index.ts onDocumentUpdated games/{gameId}",
+ "weight": 1.0,
+ "source": "backend_reads_firestore_games",
+ "target": "backend_writes_trigger_ongamecompleted"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "kboRepository.ts:47,32",
+ "weight": 1.0,
+ "source": "backend_reads_repo_kborepo",
+ "target": "backend_reads_firestore_kbocache"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "kboCacheRepository.ts:69-80",
+ "weight": 1.0,
+ "source": "backend_reads_repo_kbocacherepo",
+ "target": "backend_reads_firestore_kbocache"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "kboCacheRepository.ts:88-104",
+ "weight": 1.0,
+ "source": "backend_reads_repo_kbocacherepo",
+ "target": "backend_reads_firestore_kbolocks"
+ },
+ {
+ "relation": "conceptually_related_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "weight": 0.8,
+ "source": "backend_reads_firestore_kbolocks",
+ "target": "backend_lifecycle_concept_distributedlock"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "voteRepository.getCounts:23",
+ "weight": 1.0,
+ "source": "backend_reads_svc_predictionservice",
+ "target": "backend_reads_rtdb_votes"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "gameResultService.ts:25",
+ "weight": 1.0,
+ "source": "backend_writes_svc_gameresultservice",
+ "target": "backend_reads_rtdb_votes"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "voteRepository.ts:66-68",
+ "weight": 1.0,
+ "source": "backend_reads_repo_voterepo",
+ "target": "backend_reads_rtdb_votes"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "statsService.ts:200",
+ "weight": 1.0,
+ "source": "backend_reads_svc_statsservice",
+ "target": "backend_reads_rtdb_uservotes"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "voteRepository.ts:67-68",
+ "weight": 1.0,
+ "source": "backend_reads_repo_voterepo",
+ "target": "backend_reads_rtdb_uservotes"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "dailyArchive.ts:96",
+ "weight": 1.0,
+ "source": "backend_writes_cron_dailyarchive",
+ "target": "backend_reads_rtdb_uservotes"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "gameResultService.ts:33-34",
+ "weight": 1.0,
+ "source": "backend_writes_svc_gameresultservice",
+ "target": "backend_reads_rtdb_uservotes"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "statsService.ts:262",
+ "weight": 1.0,
+ "source": "backend_reads_svc_statsservice",
+ "target": "backend_reads_rtdb_cachestats"
+ },
+ {
+ "relation": "invalidates",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "gameResultService.ts:42",
+ "weight": 1.0,
+ "source": "backend_writes_svc_gameresultservice",
+ "target": "backend_reads_rtdb_cachestats"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": "commit 9a59755",
+ "weight": 1.0,
+ "source": "backend_improvements_writes_w3_statsdedup",
+ "target": "backend_reads_rtdb_cachestats"
+ },
+ {
+ "relation": "invalidates",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "onGameCompleted.ts:59-61",
+ "weight": 1.0,
+ "source": "backend_writes_trigger_ongamecompleted",
+ "target": "backend_reads_rtdb_cachestats"
+ },
+ {
+ "relation": "invalidates",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "dailyArchive.ts reconcile",
+ "weight": 1.0,
+ "source": "backend_writes_cron_dailyarchive",
+ "target": "backend_reads_rtdb_cachestats"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "scoreboardService.ts:63-67",
+ "weight": 1.0,
+ "source": "backend_reads_svc_scoreboardservice",
+ "target": "backend_reads_rtdb_scoreboardcache"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "rankSnapshotService.ts:128-148",
+ "weight": 1.0,
+ "source": "backend_reads_svc_ranksnapshotservice",
+ "target": "backend_reads_rtdb_scoreboardcache"
+ },
+ {
+ "relation": "conceptually_related_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "weight": 0.8,
+ "source": "backend_reads_rtdb_scoreboardcache",
+ "target": "backend_lifecycle_concept_precompute"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "nicknameRepository.ts:82-90",
+ "weight": 1.0,
+ "source": "backend_reads_svc_userservice",
+ "target": "backend_reads_rtdb_nicknames"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "nicknameRepository.ts:19-57",
+ "weight": 1.0,
+ "source": "backend_reads_svc_userservice",
+ "target": "backend_reads_rtdb_usernicknames"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "game-list.ts:240",
+ "weight": 1.0,
+ "source": "backend_reads_svc_gamelistservice",
+ "target": "backend_reads_external_kbo"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "kboRepository.ts:46",
+ "weight": 1.0,
+ "source": "backend_reads_repo_kborepo",
+ "target": "backend_reads_external_kbo"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "gameDetailService.ts:29-49",
+ "weight": 1.0,
+ "source": "backend_reads_svc_gamedetailservice",
+ "target": "backend_reads_external_kbo"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "gameSyncService.ts:129",
+ "weight": 1.0,
+ "source": "backend_reads_svc_gamesyncservice",
+ "target": "backend_reads_external_kbo"
+ },
+ {
+ "relation": "caches",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "gameListService.ts:22,39",
+ "weight": 1.0,
+ "source": "backend_reads_svc_gamelistservice",
+ "target": "backend_reads_memcache"
+ },
+ {
+ "relation": "caches",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "scoreboardService.ts:63-67",
+ "weight": 1.0,
+ "source": "backend_reads_svc_scoreboardservice",
+ "target": "backend_reads_memcache"
+ },
+ {
+ "relation": "caches",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "predictionService.ts:16",
+ "weight": 1.0,
+ "source": "backend_reads_svc_predictionservice",
+ "target": "backend_reads_memcache"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "game-list.ts:240",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_kbo_games",
+ "target": "backend_reads_svc_gamelistservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "kboRepository.ts:42",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_kbo_rank",
+ "target": "backend_reads_svc_rankservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "kboRepository.ts:42",
+ "weight": 1.0,
+ "source": "backend_reads_svc_rankservice",
+ "target": "backend_reads_repo_kborepo"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "kboRepository.ts:457-462",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_kbo_player",
+ "target": "backend_reads_svc_playerservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "kboRepository.ts:446",
+ "weight": 1.0,
+ "source": "backend_reads_svc_playerservice",
+ "target": "backend_reads_repo_kborepo"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "kboRepository.ts:86-92",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_kbo_schedule",
+ "target": "backend_reads_svc_scheduleservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "kboRepository.ts:282-300",
+ "weight": 1.0,
+ "source": "backend_reads_svc_scheduleservice",
+ "target": "backend_reads_repo_kborepo"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "gameDetailService.ts:87",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_kbo_gamedetail",
+ "target": "backend_reads_svc_gamedetailservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "gameDetailService.ts:87",
+ "weight": 1.0,
+ "source": "backend_reads_svc_gamedetailservice",
+ "target": "backend_reads_repo_kbocacherepo"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": "commit 50349e6",
+ "weight": 1.0,
+ "source": "backend_improvements_writes_w6_gamedetailttl",
+ "target": "backend_reads_svc_gamedetailservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "scoreboardService.ts:54",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_scoreboard",
+ "target": "backend_reads_svc_scoreboardservice"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md",
+ "source_location": "commit 60461c4",
+ "weight": 1.0,
+ "source": "backend_improvements_reads_r5_fieldmask",
+ "target": "backend_reads_svc_scoreboardservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "statsService.ts:255",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_stats",
+ "target": "backend_reads_svc_statsservice"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "voteHistoryRepository.ts:53",
+ "weight": 1.0,
+ "source": "backend_reads_svc_statsservice",
+ "target": "backend_reads_repo_votehistoryrepo"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "predictionService.ts:16,112",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_prediction_summary",
+ "target": "backend_reads_svc_predictionservice"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "dailyArchive.ts:87-168",
+ "weight": 1.0,
+ "source": "backend_writes_cron_dailyarchive",
+ "target": "backend_reads_svc_judgmentservice"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "gameSyncService.ts:63-77",
+ "weight": 1.0,
+ "source": "backend_writes_cron_kbodailyrefresh",
+ "target": "backend_reads_svc_gamesyncservice"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": "commit b17ac4c",
+ "weight": 1.0,
+ "source": "backend_improvements_writes_w1_diff",
+ "target": "backend_reads_svc_gamesyncservice"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "gameSyncService.ts forceSyncDay",
+ "weight": 1.0,
+ "source": "backend_writes_endpoint_debug_forcesync",
+ "target": "backend_reads_svc_gamesyncservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "userService.ts:120",
+ "weight": 1.0,
+ "source": "backend_writes_endpoint_post_user",
+ "target": "backend_reads_svc_userservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "userService.ts:269",
+ "weight": 1.0,
+ "source": "backend_writes_endpoint_patch_user",
+ "target": "backend_reads_svc_userservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "userService.ts:95",
+ "weight": 1.0,
+ "source": "backend_writes_endpoint_get_user",
+ "target": "backend_reads_svc_userservice"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": "commit 037baab",
+ "weight": 1.0,
+ "source": "backend_improvements_writes_w5r6_photourl",
+ "target": "backend_reads_svc_userservice"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "dailyArchive.ts:163",
+ "weight": 1.0,
+ "source": "backend_writes_cron_dailyarchive",
+ "target": "backend_reads_svc_ranksnapshotservice"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md",
+ "source_location": "commit 4ea1a77",
+ "weight": 1.0,
+ "source": "backend_improvements_writes_w4_ranksnapshot",
+ "target": "backend_reads_svc_ranksnapshotservice"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "attendanceService.ts:162,243",
+ "weight": 1.0,
+ "source": "backend_writes_endpoint_post_checkin",
+ "target": "backend_reads_svc_attendanceservice"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "kboRefresh.ts:16-25",
+ "weight": 1.0,
+ "source": "backend_writes_cron_kbodailyrefresh",
+ "target": "backend_reads_repo_kbocacherepo"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md",
+ "source_location": "commit 69f31ae",
+ "weight": 1.0,
+ "source": "backend_improvements_reads_r4_backoff",
+ "target": "backend_reads_repo_kbocacherepo"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md",
+ "source_location": "commit e9ba36c",
+ "weight": 1.0,
+ "source": "backend_improvements_reads_r7_parallelrank",
+ "target": "backend_reads_repo_kborepo"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "voteRepository.getUserDateVotes:106",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_prediction",
+ "target": "backend_reads_repo_voterepo"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "voteRepository.ts:66",
+ "weight": 1.0,
+ "source": "backend_writes_endpoint_post_prediction",
+ "target": "backend_reads_repo_voterepo"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "voteRepository.ts:92-95",
+ "weight": 1.0,
+ "source": "backend_writes_endpoint_put_prediction",
+ "target": "backend_reads_repo_voterepo"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md",
+ "source_location": "gameRepository.listByDate:27-37",
+ "weight": 1.0,
+ "source": "backend_reads_endpoint_prediction_games",
+ "target": "backend_reads_repo_gamerepo"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md",
+ "source_location": "src/repositories/gameRepository.ts",
+ "weight": 1.0,
+ "source": "backend_improvements_reads_r1_gamedaycache",
+ "target": "backend_reads_repo_gamerepo"
+ },
+ {
+ "relation": "caches",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": "swr_cache.dart",
+ "weight": 1.0,
+ "source": "backend_lifecycle_client_swrcache",
+ "target": "backend_reads_endpoint_kbo_schedule"
+ },
+ {
+ "relation": "caches",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": "swr_cache.dart",
+ "weight": 1.0,
+ "source": "backend_lifecycle_client_swrcache",
+ "target": "backend_reads_endpoint_kbo_gamedetail"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md",
+ "source_location": "commit 5a498c3",
+ "weight": 1.0,
+ "source": "backend_improvements_reads_r1_gamedaycache",
+ "target": "backend_writes_cron_dailyarchive"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md",
+ "source_location": "gameResultService.ts:25",
+ "weight": 1.0,
+ "source": "backend_writes_trigger_ongamecompleted",
+ "target": "backend_writes_svc_gameresultservice"
+ },
+ {
+ "relation": "conceptually_related_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_data-lifecycle.md",
+ "source_location": null,
+ "weight": 0.8,
+ "source": "backend_writes_svc_gameresultservice",
+ "target": "backend_lifecycle_concept_fanout"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_README.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "readme_cost_summary",
+ "target": "opt_W1"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_W1",
+ "target": "backend_sync_games_service"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "INFERRED",
+ "confidence_score": 0.95,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 0.9,
+ "source": "opt_W1",
+ "target": "fs_games"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_W2",
+ "target": "backend_daily_archive"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_W2",
+ "target": "backend_judge_day"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_W3",
+ "target": "backend_invalidate_stats"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_W6",
+ "target": "fs_kbo_cache"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_README.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "readme_cost_summary",
+ "target": "opt_R1"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_R1",
+ "target": "backend_daily_archive"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "INFERRED",
+ "confidence_score": 0.95,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 0.9,
+ "source": "opt_R1",
+ "target": "fs_games"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_R2",
+ "target": "fs_cache_stats"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_R2",
+ "target": "fs_vote_history"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_R3",
+ "target": "rtdb_user_votes"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_R4",
+ "target": "backend_wait_for_cache"
+ },
+ {
+ "relation": "rationale_for",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_README.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "readme_cost_summary",
+ "target": "opt_C1"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C1",
+ "target": "client_provider_vote_summary"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C1",
+ "target": "rtdb_votes_gameId"
+ },
+ {
+ "relation": "references",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_improvements_summary",
+ "target": "opt_C1"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C1",
+ "target": "client_vote_repo_after"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C2",
+ "target": "client_provider_h2h"
+ },
+ {
+ "relation": "references",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_improvements_summary",
+ "target": "opt_C2"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C2",
+ "target": "client_h2h_provider_after"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "INFERRED",
+ "confidence_score": 0.95,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 0.9,
+ "source": "opt_C2",
+ "target": "client_standings_provider_after"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C3",
+ "target": "client_provider_ace_pitcher"
+ },
+ {
+ "relation": "references",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_improvements_summary",
+ "target": "opt_C3"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C3",
+ "target": "client_ace_pitcher_after"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C4",
+ "target": "client_provider_current_user"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C4",
+ "target": "client_provider_scoreboard"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C4",
+ "target": "client_provider_user_stats"
+ },
+ {
+ "relation": "references",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_improvements_summary",
+ "target": "opt_C4"
+ },
+ {
+ "relation": "optimized_by",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "opt_C4",
+ "target": "client_current_user_after"
+ },
+ {
+ "relation": "references",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_README.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "readme_overview",
+ "target": "readme_cost_summary"
+ },
+ {
+ "relation": "references",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_README.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "readme_overview",
+ "target": "readme_index_ok"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/prediction/data/api_client.dart:7",
+ "weight": 1.0,
+ "source": "client_dio_provider",
+ "target": "client_api_base"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_game_repo",
+ "target": "client_ep_schedule"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_user_repo",
+ "target": "client_ep_get_user"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_user_repo",
+ "target": "client_ep_check_nickname"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_user_repo",
+ "target": "client_ep_post_user"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_user_repo",
+ "target": "client_ep_patch_user"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_user_repo",
+ "target": "client_ep_delete_user"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_user_repo",
+ "target": "client_ep_stats"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_user_repo",
+ "target": "client_ep_stats_history"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_prediction_repo",
+ "target": "client_ep_post_prediction"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_prediction_repo",
+ "target": "client_ep_put_prediction"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_prediction_repo",
+ "target": "client_ep_get_prediction"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_prediction_repo",
+ "target": "client_ep_vote_summary"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_team_record_repo",
+ "target": "client_ep_rank"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_player_repo",
+ "target": "client_ep_player"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_game_detail_repo",
+ "target": "client_ep_game_detail"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_scoreboard_repo",
+ "target": "client_ep_scoreboard"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_attendance_repo",
+ "target": "client_ep_attendance_month"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_attendance_repo",
+ "target": "client_ep_checkin"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_attendance_repo",
+ "target": "client_ep_notifications"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_monthly_schedule",
+ "target": "client_ep_schedule"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_rank",
+ "target": "client_ep_rank"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_h2h",
+ "target": "client_ep_rank"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_pitchers",
+ "target": "client_ep_player"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_ace_pitcher",
+ "target": "client_ep_player"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_game_detail",
+ "target": "client_ep_game_detail"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_current_user",
+ "target": "client_ep_get_user"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/features/splash/presentation/pages/splash_page.dart:45",
+ "weight": 1.0,
+ "source": "client_splash_page",
+ "target": "client_ep_get_user"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_current_user_after",
+ "target": "client_ep_get_user"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_user_stats",
+ "target": "client_ep_stats"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_prediction_action",
+ "target": "client_ep_post_prediction"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_vote_summary",
+ "target": "client_ep_vote_summary"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_scoreboard",
+ "target": "client_ep_scoreboard"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_checkin_controller",
+ "target": "client_ep_checkin"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": "lib/core/services/fcm_service.dart:40,58",
+ "weight": 1.0,
+ "source": "client_fcm_service",
+ "target": "fs_users_fcm_tokens"
+ },
+ {
+ "relation": "implements",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_schedule_cache",
+ "target": "client_swr_cache"
+ },
+ {
+ "relation": "implements",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_game_detail_cache",
+ "target": "client_swr_cache"
+ },
+ {
+ "relation": "implements",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_day_record_cache",
+ "target": "client_swr_cache"
+ },
+ {
+ "relation": "implements",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_game_record_dates_cache",
+ "target": "client_swr_cache"
+ },
+ {
+ "relation": "caches",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_monthly_schedule",
+ "target": "client_schedule_cache"
+ },
+ {
+ "relation": "caches",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_game_detail",
+ "target": "client_game_detail_cache"
+ },
+ {
+ "relation": "caches",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_day_prediction_record",
+ "target": "client_day_record_cache"
+ },
+ {
+ "relation": "caches",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_game_record_dates",
+ "target": "client_game_record_dates_cache"
+ },
+ {
+ "relation": "invalidates",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "client_provider_prediction_action",
+ "target": "client_provider_vote_summary"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": "lib/features/prediction/application/ace_pitcher_provider.dart",
+ "weight": 1.0,
+ "source": "client_ace_pitcher_after",
+ "target": "client_provider_pitchers"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": "lib/features/prediction/data/vote_repository.dart",
+ "weight": 1.0,
+ "source": "client_vote_repo_after",
+ "target": "rtdb_vote_aggregates"
+ },
+ {
+ "relation": "semantically_similar_to",
+ "confidence": "INFERRED",
+ "confidence_score": 0.75,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": null,
+ "weight": 0.7,
+ "source": "rtdb_votes_gameId",
+ "target": "rtdb_vote_aggregates"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md",
+ "source_location": "lib/features/prediction/application/h2h_provider.dart",
+ "weight": 1.0,
+ "source": "client_h2h_provider_after",
+ "target": "client_standings_provider_after"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "debugHandlers.ts",
+ "weight": 1.0,
+ "source": "backend_debug_handlers",
+ "target": "backend_sync_games_service"
+ },
+ {
+ "relation": "calls",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "debugHandlers.ts",
+ "weight": 1.0,
+ "source": "backend_debug_handlers",
+ "target": "backend_daily_archive"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "gameSyncService.ts:63",
+ "weight": 1.0,
+ "source": "backend_sync_games_service",
+ "target": "fs_games"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "backend_cron_0200",
+ "target": "backend_sync_games_service"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "dailyArchive.ts:130",
+ "weight": 1.0,
+ "source": "backend_daily_archive",
+ "target": "fs_vote_history"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "dailyArchive.ts:96",
+ "weight": 1.0,
+ "source": "backend_daily_archive",
+ "target": "fs_daily_archive"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "dailyArchive.ts:96",
+ "weight": 1.0,
+ "source": "backend_daily_archive",
+ "target": "rtdb_user_votes"
+ },
+ {
+ "relation": "writes_to",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "judgmentService.ts:94",
+ "weight": 1.0,
+ "source": "backend_judge_day",
+ "target": "fs_vote_history"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "onGameCompleted.ts:59",
+ "weight": 1.0,
+ "source": "backend_on_game_completed",
+ "target": "backend_invalidate_stats"
+ },
+ {
+ "relation": "invalidates",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "backend_invalidate_stats",
+ "target": "fs_cache_stats"
+ },
+ {
+ "relation": "triggers",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": "gameResultService.ts:42",
+ "weight": 1.0,
+ "source": "backend_game_result_service",
+ "target": "backend_invalidate_stats"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "backend_get_stats_cf",
+ "target": "fs_vote_history"
+ },
+ {
+ "relation": "reads_from",
+ "confidence": "INFERRED",
+ "confidence_score": 0.95,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 0.9,
+ "source": "backend_get_stats_cf",
+ "target": "fs_cache_stats"
+ },
+ {
+ "relation": "invalidates",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md",
+ "source_location": null,
+ "weight": 1.0,
+ "source": "backend_cron_0200",
+ "target": "fs_kbo_cache"
+ }
+ ],
+ "hyperedges": [
+ {
+ "id": "kbo_cache_pipeline",
+ "label": "KBO External Fetch to Cache to Client Endpoint Pipeline",
+ "nodes": [
+ "backend_reads_external_kbo",
+ "backend_reads_firestore_kbocache",
+ "backend_reads_repo_kbocacherepo",
+ "backend_reads_firestore_kbolocks",
+ "backend_lifecycle_concept_distributedlock"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-reads.md"
+ },
+ {
+ "id": "daily_archive_write_pipeline",
+ "label": "dailyArchive Cron Write Pipeline",
+ "nodes": [
+ "backend_writes_cron_dailyarchive",
+ "backend_reads_svc_judgmentservice",
+ "backend_reads_firestore_votehistory",
+ "backend_reads_firestore_users",
+ "backend_reads_svc_ranksnapshotservice",
+ "backend_reads_rtdb_scoreboardcache",
+ "backend_reads_rtdb_cachestats"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md"
+ },
+ {
+ "id": "game_completed_fanout",
+ "label": "onGameCompleted Fan-out Write Pattern",
+ "nodes": [
+ "backend_writes_trigger_ongamecompleted",
+ "backend_writes_svc_gameresultservice",
+ "backend_reads_rtdb_uservotes",
+ "backend_reads_rtdb_cachestats",
+ "backend_lifecycle_concept_fanout"
+ ],
+ "relation": "implement",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md"
+ },
+ {
+ "id": "backend_read_optimization_set",
+ "label": "Backend Read Optimization Set R1 R4 R5 R7",
+ "nodes": [
+ "backend_improvements_reads_r1_gamedaycache",
+ "backend_improvements_reads_r4_backoff",
+ "backend_improvements_reads_r5_fieldmask",
+ "backend_improvements_reads_r7_parallelrank"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-reads.md"
+ },
+ {
+ "id": "backend_write_optimization_set",
+ "label": "Backend Write Optimization Set W1 through W6",
+ "nodes": [
+ "backend_improvements_writes_w1_diff",
+ "backend_improvements_writes_w2_votehistory",
+ "backend_improvements_writes_w3_statsdedup",
+ "backend_improvements_writes_w4_ranksnapshot",
+ "backend_improvements_writes_w5r6_photourl",
+ "backend_improvements_writes_w6_gamedetailttl"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_improvements-backend-writes.md"
+ },
+ {
+ "id": "prediction_vote_flow",
+ "label": "User Prediction Vote Flow",
+ "nodes": [
+ "backend_writes_endpoint_post_prediction",
+ "backend_writes_endpoint_put_prediction",
+ "backend_reads_repo_voterepo",
+ "backend_reads_rtdb_votes",
+ "backend_reads_rtdb_uservotes"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_backend-writes.md"
+ },
+ {
+ "id": "tier1_optimizations",
+ "label": "Tier 1 High-Impact Low-Risk Optimizations",
+ "nodes": [
+ "opt_W1",
+ "opt_W2",
+ "opt_R1",
+ "opt_C1"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md"
+ },
+ {
+ "id": "tier2_optimizations",
+ "label": "Tier 2 Medium-Impact Optimizations",
+ "nodes": [
+ "opt_R2",
+ "opt_W3",
+ "opt_R3",
+ "opt_R4",
+ "opt_C2",
+ "opt_C3"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md"
+ },
+ {
+ "id": "tier3_optimizations",
+ "label": "Tier 3 Small / Housekeeping Optimizations",
+ "nodes": [
+ "opt_W4",
+ "opt_W5",
+ "opt_W6",
+ "opt_R5",
+ "opt_R6",
+ "opt_R7",
+ "opt_C4"
+ ],
+ "relation": "form",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/backend_optimization-plan.md"
+ },
+ {
+ "id": "client_applied_improvements",
+ "label": "Applied Client Optimizations (opt/client-rw branch)",
+ "nodes": [
+ "opt_C1",
+ "opt_C2",
+ "opt_C3",
+ "opt_C4",
+ "client_vote_repo_after",
+ "client_standings_provider_after",
+ "client_h2h_provider_after",
+ "client_ace_pitcher_after",
+ "client_current_user_after"
+ ],
+ "relation": "implement",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_improvements-client.md"
+ },
+ {
+ "id": "swr_cache_adapters",
+ "label": "SWR Cache Adapters (4 domains)",
+ "nodes": [
+ "client_schedule_cache",
+ "client_game_detail_cache",
+ "client_day_record_cache",
+ "client_game_record_dates_cache"
+ ],
+ "relation": "implement",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md"
+ },
+ {
+ "id": "client_keepalive_repos",
+ "label": "All Client Repositories (keepAlive)",
+ "nodes": [
+ "client_game_repo",
+ "client_user_repo",
+ "client_prediction_repo",
+ "client_team_record_repo",
+ "client_player_repo",
+ "client_game_detail_repo",
+ "client_scoreboard_repo",
+ "client_attendance_repo"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md"
+ },
+ {
+ "id": "duplicate_call_problem",
+ "label": "Duplicate CF Call Pattern (C2+C3)",
+ "nodes": [
+ "client_provider_h2h",
+ "client_provider_rank",
+ "client_ep_rank",
+ "client_provider_ace_pitcher",
+ "client_provider_pitchers",
+ "client_ep_player"
+ ],
+ "relation": "participate_in",
+ "confidence": "EXTRACTED",
+ "confidence_score": 1.0,
+ "source_file": "graphify-out/tmp-corpus/client_client-patterns.md"
+ }
+ ],
+ "built_at_commit": "05b774a713df1682dc5cb37296fb8b522fe77e68"
+}
\ No newline at end of file
diff --git a/graphify-out/manifest.json b/graphify-out/manifest.json
new file mode 100644
index 0000000..2b459d1
--- /dev/null
+++ b/graphify-out/manifest.json
@@ -0,0 +1,47 @@
+{
+ "D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_backend-reads.md": {
+ "mtime": 1779955343.7204893,
+ "ast_hash": "47f71e4a003d0d15af710aa3e03da080",
+ "semantic_hash": "47f71e4a003d0d15af710aa3e03da080"
+ },
+ "D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_backend-writes.md": {
+ "mtime": 1779955314.7038176,
+ "ast_hash": "5713e28108683534b14505db87fec39d",
+ "semantic_hash": "5713e28108683534b14505db87fec39d"
+ },
+ "D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_data-lifecycle.md": {
+ "mtime": 1779955497.1817923,
+ "ast_hash": "86efbf284e4bde74aab40d70cb78239b",
+ "semantic_hash": "86efbf284e4bde74aab40d70cb78239b"
+ },
+ "D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_improvements-backend-reads.md": {
+ "mtime": 1779965419.4039817,
+ "ast_hash": "11de86bdc094d3bef7f541035b11c5fd",
+ "semantic_hash": "11de86bdc094d3bef7f541035b11c5fd"
+ },
+ "D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_improvements-backend-writes.md": {
+ "mtime": 1779965451.961932,
+ "ast_hash": "3711a459366acd98e5d77b9cf3923462",
+ "semantic_hash": "3711a459366acd98e5d77b9cf3923462"
+ },
+ "D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_optimization-plan.md": {
+ "mtime": 1779955541.0157058,
+ "ast_hash": "8d171256079b75bcebc4622a4ae637ec",
+ "semantic_hash": "8d171256079b75bcebc4622a4ae637ec"
+ },
+ "D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\backend_README.md": {
+ "mtime": 1779963250.7253542,
+ "ast_hash": "b385dc63bc5a1895cd403d96f262b9a8",
+ "semantic_hash": "b385dc63bc5a1895cd403d96f262b9a8"
+ },
+ "D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\client_client-patterns.md": {
+ "mtime": 1779955399.4187841,
+ "ast_hash": "df76664a0705ebcb69d1468e28d234e8",
+ "semantic_hash": "df76664a0705ebcb69d1468e28d234e8"
+ },
+ "D:\\Projects\\WebstormProjects\\mmday-firebase\\graphify-out\\tmp-corpus\\client_improvements-client.md": {
+ "mtime": 1779965406.3110974,
+ "ast_hash": "17a330c9c9dba5e369ae0a3e6eb1dd56",
+ "semantic_hash": "17a330c9c9dba5e369ae0a3e6eb1dd56"
+ }
+}
\ No newline at end of file
diff --git a/src/kbo-team-rank.ts b/src/kbo-team-rank.ts
new file mode 100644
index 0000000..b475703
--- /dev/null
+++ b/src/kbo-team-rank.ts
@@ -0,0 +1,462 @@
+/**
+ * KBO 팀 순위 조회
+ * Usage: npx tsx kbo-team-rank.ts [연도] [연도2] ...
+ * 예시: npx tsx kbo-team-rank.ts 2024 2025
+ * npx tsx kbo-team-rank.ts (기본: 현재 연도)
+ */
+
+const BASE_URL =
+ "https://www.koreabaseball.com/Record/TeamRank/TeamRank.aspx";
+
+const PREFIX = "ctl00$ctl00$ctl00$cphContents$cphContents$cphContents$";
+
+// ── HTML 파싱 헬퍼 ──
+
+function extractHiddenField(html: string, name: string): string {
+ // id="__VIEWSTATE" value="..."
+ const re = new RegExp(`id="${name}"[^>]*value="([^"]*)"`, "i");
+ const match = html.match(re);
+ if (match) return match[1];
+ // fallback: name="..." value="..."
+ const re2 = new RegExp(`name="${name}"[^>]*value="([^"]*)"`, "i");
+ const match2 = html.match(re2);
+ return match2?.[1] ?? "";
+}
+
+function stripTags(html: string): string {
+ return html.replace(/<[^>]*>/g, "").trim();
+}
+
+function decodeHtmlEntities(text: string): string {
+ return text
+ .replace(/&/g, "&")
+ .replace(/</g, "<")
+ .replace(/>/g, ">")
+ .replace(/"/g, '"')
+ .replace(/(\d+);/g, (_, n) => String.fromCharCode(Number(n)));
+}
+
+// ── 테이블 파싱 ──
+
+interface TeamRank {
+ 순위: string;
+ 팀명: string;
+ 경기: string;
+ 승: string;
+ 패: string;
+ 무: string;
+ 승률: string;
+ 게임차: string;
+ 최근10경기: string;
+ 연속: string;
+ 홈: string;
+ 방문: string;
+}
+
+type WinLossDraw = [win: number, loss: number, draw: number];
+
+interface TeamVsRecord {
+ 팀명: string;
+ 상대전적: Record;
+ 합계: WinLossDraw;
+}
+
+function parseRankTable(html: string): TeamRank[] {
+ const teams: TeamRank[] = [];
+
+ // 안의 | 들을 추출
+ const trRegex = / |
]*>([\s\S]*?)<\/tr>/gi;
+ let trMatch: RegExpExecArray | null;
+
+ while ((trMatch = trRegex.exec(html)) !== null) {
+ const trContent = trMatch[1];
+ const tds: string[] = [];
+ const tdRegex = /]*>([\s\S]*?)<\/td>/gi;
+ let tdMatch: RegExpExecArray | null;
+ while ((tdMatch = tdRegex.exec(trContent)) !== null) {
+ tds.push(stripTags(decodeHtmlEntities(tdMatch[1])));
+ }
+
+ // 팀 순위 행은 12개 컬럼: 순위, 팀명, 경기, 승, 패, 무, 승률, 게임차, 최근10경기, 연속, 홈, 방문
+ if (tds.length >= 10) {
+ // 팀명이 한글/영문인지 간단 체크
+ const teamName = tds[1];
+ if (/^[A-Z가-힣]/.test(teamName)) {
+ teams.push({
+ 순위: tds[0],
+ 팀명: tds[1],
+ 경기: tds[2],
+ 승: tds[3],
+ 패: tds[4],
+ 무: tds[5],
+ 승률: tds[6],
+ 게임차: tds[7],
+ 최근10경기: tds[8],
+ 연속: tds[9],
+ 홈: tds[10] ?? "",
+ 방문: tds[11] ?? "",
+ });
+ }
+ }
+ }
+
+ return teams;
+}
+
+function parseWLD(s: string): WinLossDraw {
+ const parts = s.split("-").map(Number);
+ return [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0];
+}
+
+function parseVsTable(html: string): TeamVsRecord[] {
+ const tableMatch = html.match(
+ /]*summary="팀간승패표"[^>]*>([\s\S]*?)<\/table>/
+ );
+ if (!tableMatch) return [];
+
+ const tableHtml = tableMatch[1];
+
+ // 헤더에서 팀명 목록 추출
+ const theadMatch = tableHtml.match(/]*>([\s\S]*?)<\/thead>/);
+ const teamNames: string[] = [];
+ if (theadMatch) {
+ const thRegex = /| ]*>([\s\S]*?)<\/th>/gi;
+ let thMatch: RegExpExecArray | null;
+ while ((thMatch = thRegex.exec(theadMatch[1])) !== null) {
+ const text = stripTags(decodeHtmlEntities(thMatch[1])).replace(/\(승-패-무\)/g, "").trim();
+ if (text && text !== "팀명" && text !== "합계") {
+ teamNames.push(text);
+ }
+ }
+ }
+
+ // 바디에서 각 팀의 상대전적 추출
+ const records: TeamVsRecord[] = [];
+ const tbodyMatch = tableHtml.match(/ | ]*>([\s\S]*?)<\/tbody>/);
+ if (!tbodyMatch) return [];
+
+ const trRegex = /]*>([\s\S]*?)<\/tr>/gi;
+ let trMatch: RegExpExecArray | null;
+
+ while ((trMatch = trRegex.exec(tbodyMatch[1])) !== null) {
+ const cells: string[] = [];
+ const tdRegex = /| ]*>([\s\S]*?)<\/td>/gi;
+ let tdMatch: RegExpExecArray | null;
+ while ((tdMatch = tdRegex.exec(trMatch[1])) !== null) {
+ cells.push(stripTags(decodeHtmlEntities(tdMatch[1])));
+ }
+
+ if (cells.length < teamNames.length + 2) continue;
+
+ const 팀명 = cells[0];
+ const 상대전적: Record = {};
+
+ for (let i = 0; i < teamNames.length; i++) {
+ const val = cells[i + 1];
+ if (val === "■" || val === "▲" || 팀명 === teamNames[i]) continue;
+ 상대전적[teamNames[i]] = parseWLD(val);
+ }
+
+ const 합계 = parseWLD(cells[cells.length - 1]);
+ records.push({ 팀명, 상대전적, 합계 });
+ }
+
+ return records;
+}
+
+// ── 네트워크 ──
+
+async function getInitialPage(): Promise<{
+ html: string;
+ viewState: string;
+ viewStateGenerator: string;
+ eventValidation: string;
+ currentYear: number;
+}> {
+ const res = await fetch(BASE_URL, {
+ headers: {
+ "User-Agent":
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/147.0.0.0 Safari/537.36",
+ },
+ });
+ const html = await res.text();
+
+ // 현재 선택된 연도 추출
+ const yearMatch = html.match(
+ /id="cphContents_cphContents_cphContents_lblSearchDateTitle">(\d{4})/
+ );
+ const currentYear = yearMatch ? parseInt(yearMatch[1], 10) : new Date().getFullYear();
+
+ return {
+ html,
+ viewState: extractHiddenField(html, "__VIEWSTATE"),
+ viewStateGenerator: extractHiddenField(html, "__VIEWSTATEGENERATOR"),
+ eventValidation: extractHiddenField(html, "__EVENTVALIDATION"),
+ currentYear,
+ };
+}
+
+interface PageState {
+ viewState: string;
+ viewStateGenerator: string;
+ eventValidation: string;
+ currentYear: number;
+}
+
+async function fetchYear(
+ year: number,
+ state: PageState
+): Promise<{ teams: TeamRank[]; vsRecords: TeamVsRecord[]; newState: PageState }> {
+ const formData = new URLSearchParams();
+ formData.set(`${PREFIX}ScriptManager`, `${PREFIX}udpRecord|${PREFIX}ddlYear`);
+ formData.set(`${PREFIX}ddlYear`, String(year));
+ formData.set(`${PREFIX}ddlSeries`, "0");
+ // hfSearchYear/Date는 "현재 페이지가 보여주던 연도" (변경 전)
+ formData.set(`${PREFIX}hfSearchYear`, String(state.currentYear));
+ formData.set(`${PREFIX}hfSearchDate`, `${state.currentYear}1231`);
+ formData.set(`${PREFIX}hfSearchSeries`, "0");
+ formData.set("__EVENTTARGET", `${PREFIX}ddlYear`);
+ formData.set("__EVENTARGUMENT", "");
+ formData.set("__LASTFOCUS", "");
+ formData.set("__VIEWSTATE", state.viewState);
+ formData.set("__VIEWSTATEGENERATOR", state.viewStateGenerator);
+ formData.set("__EVENTVALIDATION", state.eventValidation);
+ formData.set("__ASYNCPOST", "true");
+
+ const res = await fetch(BASE_URL, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
+ "X-MicrosoftAjax": "Delta=true",
+ "X-Requested-With": "XMLHttpRequest",
+ "User-Agent":
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/147.0.0.0 Safari/537.36",
+ Referer: BASE_URL,
+ Origin: "https://www.koreabaseball.com",
+ },
+ body: formData.toString(),
+ });
+
+ const text = await res.text();
+
+ // ASP.NET AJAX 델타 응답에서 HTML 부분 추출 (첫 번째 updatePanel 섹션)
+ const panelMatch = text.match(
+ /updatePanel\|[^|]*\|([\s\S]*?)\|[0-9]+\|hiddenField\|/
+ );
+ const htmlContent = panelMatch?.[1] ?? text;
+
+ // 업데이트된 hidden field 추출
+ const vsMatch = text.match(/__VIEWSTATE\|([^|]*)\|/);
+ const vsgMatch = text.match(/__VIEWSTATEGENERATOR\|([^|]*)\|/);
+ const evMatch = text.match(/__EVENTVALIDATION\|([^|]*)\|/);
+
+ const newState: PageState = {
+ viewState: vsMatch?.[1] ?? state.viewState,
+ viewStateGenerator: vsgMatch?.[1] ?? state.viewStateGenerator,
+ eventValidation: evMatch?.[1] ?? state.eventValidation,
+ currentYear: year,
+ };
+
+ const teams = parseRankTable(htmlContent);
+ const vsRecords = parseVsTable(htmlContent);
+
+ return { teams, vsRecords, newState };
+}
+
+// ── 출력 ──
+
+function printTable(year: number, teams: TeamRank[]) {
+ console.log(`\n${"═".repeat(90)}`);
+ console.log(` KBO ${year} 정규시즌 팀 순위`);
+ console.log(`${"═".repeat(90)}`);
+
+ if (teams.length === 0) {
+ console.log(" 데이터를 찾을 수 없습니다.");
+ return;
+ }
+
+ const header = [
+ "순위",
+ "팀명",
+ "경기",
+ "승",
+ "패",
+ "무",
+ "승률",
+ "게임차",
+ "최근10경기",
+ "연속",
+ ];
+ const widths = [4, 6, 4, 3, 3, 3, 6, 6, 12, 8];
+
+ const padCell = (val: string, w: number) => {
+ // 한글 글자는 폭 2로 계산
+ const displayWidth = [...val].reduce(
+ (sum, ch) => sum + (ch.charCodeAt(0) > 0x7f ? 2 : 1),
+ 0
+ );
+ return val + " ".repeat(Math.max(0, w - displayWidth));
+ };
+
+ console.log(
+ " " + header.map((h, i) => padCell(h, widths[i])).join(" │ ")
+ );
+ console.log(" " + widths.map((w) => "─".repeat(w)).join("─┼─"));
+
+ for (const t of teams) {
+ const row = [
+ t.순위,
+ t.팀명,
+ t.경기,
+ t.승,
+ t.패,
+ t.무,
+ t.승률,
+ t.게임차,
+ t.최근10경기,
+ t.연속,
+ ];
+ console.log(
+ " " + row.map((val, i) => padCell(val, widths[i])).join(" │ ")
+ );
+ }
+}
+
+function printVsTable(year: number, vsRecords: TeamVsRecord[]) {
+ if (vsRecords.length === 0) return;
+
+ console.log(`\n${"─".repeat(90)}`);
+ console.log(` KBO ${year} 팀간 승패표 (승-패-무)`);
+ console.log(`${"─".repeat(90)}`);
+
+ const teamNames = vsRecords.map((r) => r.팀명);
+ const colW = 7;
+
+ const padCell = (val: string, w: number) => {
+ const displayWidth = [...val].reduce(
+ (sum, ch) => sum + (ch.charCodeAt(0) > 0x7f ? 2 : 1),
+ 0
+ );
+ return val + " ".repeat(Math.max(0, w - displayWidth));
+ };
+
+ const fmtWLD = (wld: WinLossDraw) => `${wld[0]}-${wld[1]}-${wld[2]}`;
+
+ // 헤더
+ console.log(
+ " " +
+ padCell("", 6) +
+ " │ " +
+ teamNames.map((n) => padCell(n, colW)).join("│ ") +
+ "│ " +
+ padCell("합계", colW)
+ );
+ console.log(
+ " " +
+ "─".repeat(6) +
+ "─┼─" +
+ teamNames.map(() => "─".repeat(colW)).join("┼─") +
+ "┼─" +
+ "─".repeat(colW)
+ );
+
+ for (const rec of vsRecords) {
+ const cells = teamNames.map((name) => {
+ if (name === rec.팀명) return padCell(" ■", colW);
+ const wld = rec.상대전적[name];
+ return padCell(wld ? fmtWLD(wld) : "-", colW);
+ });
+ console.log(
+ " " +
+ padCell(rec.팀명, 6) +
+ " │ " +
+ cells.join("│ ") +
+ "│ " +
+ padCell(fmtWLD(rec.합계), colW)
+ );
+ }
+}
+
+// ── JSON 출력 ──
+
+interface YearResult {
+ year: number;
+ teams: TeamRank[];
+ vsRecords: TeamVsRecord[];
+}
+
+function printJson(results: YearResult[]) {
+ console.log(JSON.stringify(results, null, 2));
+}
+
+// ── Main ──
+
+async function main() {
+ const args = process.argv.slice(2);
+
+ let jsonMode = false;
+ const years: number[] = [];
+
+ for (const arg of args) {
+ if (arg === "--json") {
+ jsonMode = true;
+ } else {
+ const y = parseInt(arg, 10);
+ if (y >= 1982 && y <= 2026) {
+ years.push(y);
+ } else {
+ console.error(`유효하지 않은 연도: ${arg} (1982~2026)`);
+ process.exit(1);
+ }
+ }
+ }
+
+ if (years.length === 0) {
+ years.push(new Date().getFullYear());
+ }
+
+ console.log("KBO 팀 순위 데이터를 가져오는 중...\n");
+
+ // 1단계: 초기 페이지 가져오기
+ const initial = await getInitialPage();
+ let state: PageState = {
+ viewState: initial.viewState,
+ viewStateGenerator: initial.viewStateGenerator,
+ eventValidation: initial.eventValidation,
+ currentYear: initial.currentYear,
+ };
+
+ const results: YearResult[] = [];
+
+ // 2단계: 연도별 데이터 가져오기 (순차 — 상태 의존)
+ for (const year of years) {
+ process.stdout.write(` ${year}년 데이터 요청 중...`);
+
+ if (year === initial.currentYear && results.length === 0) {
+ const teams = parseRankTable(initial.html);
+ const vsRecords = parseVsTable(initial.html);
+ results.push({ year, teams, vsRecords });
+ console.log(` ${teams.length}개 팀 로드 완료 (초기 페이지)`);
+ } else {
+ const { teams, vsRecords, newState } = await fetchYear(year, state);
+ state = newState;
+ results.push({ year, teams, vsRecords });
+ console.log(` ${teams.length}개 팀 로드 완료`);
+ }
+ }
+
+ // 3단계: 출력
+ if (jsonMode) {
+ printJson(results);
+ } else {
+ for (const { year, teams, vsRecords } of results) {
+ printTable(year, teams);
+ printVsTable(year, vsRecords);
+ }
+ }
+}
+
+main().catch((err) => {
+ console.error("오류 발생:", err);
+ process.exit(1);
+});
| |