From 20e3b1cbf02e10e63d9fdef418196c21aeb083e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A0=95=EB=AF=BC?= Date: Fri, 29 May 2026 14:59:50 +0900 Subject: [PATCH] Add a script to fetch and display KBO team rankings and records. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - KBO 공식 홈페이지에서 연도별 팀 순위 및 상대 전적 데이터를 가져오는 크롤링 스크립트를 구현했습니다. - ASP.NET의 ViewState 및 EventValidation 필드를 처리하여 동적인 연도 전환 요청을 지원합니다. - 데이터를 가독성 높은 콘솔 테이블 형태로 출력하거나 JSON 형식으로 변환하는 기능을 제공합니다. --- graphify-out/.graphify_python | 1 + graphify-out/GRAPH_REPORT.md | 151 + ...84675a6993b5a5c9beb2e50f73e2473b5a540.json | 1 + ...82c1892c7423714bc34072bebaa1d732b6bad.json | 1 + ...5802876fb1886d003508a2a04eaf72c5360d2.json | 1 + ...4def17a7c62d43afbc2c33ec61bc24f4b2c46.json | 1 + ...c6f74b2e6d80130fd99c55a661e052ea1010d.json | 1 + ...6154d3fc5e6a8ccc31b9c47c38eb62b562b93.json | 1 + ...68289c47fe61ea91ee89f2177f8bc6dea7795.json | 1 + ...99bf6e6216201df02b6e9d9df1920919bcbe3.json | 1 + ...da6b1f03f1a3cd0acef3975cd27c01b09b725.json | 1 + graphify-out/cache/stat-index.json | 1 + graphify-out/cost.json | 12 + graphify-out/graph.html | 305 ++ graphify-out/graph.json | 4446 +++++++++++++++++ graphify-out/manifest.json | 47 + src/kbo-team-rank.ts | 462 ++ 17 files changed, 5434 insertions(+) create mode 100644 graphify-out/.graphify_python create mode 100644 graphify-out/GRAPH_REPORT.md create mode 100644 graphify-out/cache/semantic/441055f47c3a0f3527431cd91c584675a6993b5a5c9beb2e50f73e2473b5a540.json create mode 100644 graphify-out/cache/semantic/7629b9506707c9b5159dc65a70d82c1892c7423714bc34072bebaa1d732b6bad.json create mode 100644 graphify-out/cache/semantic/8cfe82a177e2713dd0053806c245802876fb1886d003508a2a04eaf72c5360d2.json create mode 100644 graphify-out/cache/semantic/982e2ae7171fbeced1d621713764def17a7c62d43afbc2c33ec61bc24f4b2c46.json create mode 100644 graphify-out/cache/semantic/a461767f44048b941099ef1e762c6f74b2e6d80130fd99c55a661e052ea1010d.json create mode 100644 graphify-out/cache/semantic/be162108974f5941b103bc78da76154d3fc5e6a8ccc31b9c47c38eb62b562b93.json create mode 100644 graphify-out/cache/semantic/c1d818f03b5b27b69ccda49673068289c47fe61ea91ee89f2177f8bc6dea7795.json create mode 100644 graphify-out/cache/semantic/c1e2be8cd496b2793a8ea06cce799bf6e6216201df02b6e9d9df1920919bcbe3.json create mode 100644 graphify-out/cache/semantic/ebee6bb0067bafc39c67b1de39ada6b1f03f1a3cd0acef3975cd27c01b09b725.json create mode 100644 graphify-out/cache/stat-index.json create mode 100644 graphify-out/cost.json create mode 100644 graphify-out/graph.html create mode 100644 graphify-out/graph.json create mode 100644 graphify-out/manifest.json create mode 100644 src/kbo-team-rank.ts 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); +});