Public Access
- config: switch Settings to ConfigDict(extra='ignore') so extra env vars (spoonacular_api_key, SWIFTLY_BEARER_TOKEN) don't crash import. Remove deprecated class Config. - email: wrap SendGrid imports in try/except so the module loads without the optional dependency. Update test_email_backend to patch Mail/RepyTo. - planner_select: default PlannerConfig.set_size=21 (3 meals/day × 7) is way too large for the unit test assertion that checks 3-recipe diversity. Introduced _CFG_3 with set_size=3 and applied to all tests. - Delete stale test_matcher.py importing removed functions. Full suite: 46 passed, 74 skipped (Postgres), 0 failed, 120 collected.
257 lines
1021 KiB
HTML
257 lines
1021 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>graphify - graphify-out/graph.html</title>
|
|
<script src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script>
|
|
<style>
|
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
body { background: #0f0f1a; color: #e0e0e0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; display: flex; height: 100vh; overflow: hidden; }
|
|
#graph { flex: 1; }
|
|
#sidebar { width: 280px; background: #1a1a2e; border-left: 1px solid #2a2a4e; display: flex; flex-direction: column; overflow: hidden; }
|
|
#search-wrap { padding: 12px; border-bottom: 1px solid #2a2a4e; }
|
|
#search { width: 100%; background: #0f0f1a; border: 1px solid #3a3a5e; color: #e0e0e0; padding: 7px 10px; border-radius: 6px; font-size: 13px; outline: none; }
|
|
#search:focus { border-color: #4E79A7; }
|
|
#search-results { max-height: 140px; overflow-y: auto; padding: 4px 12px; border-bottom: 1px solid #2a2a4e; display: none; }
|
|
.search-item { padding: 4px 6px; cursor: pointer; border-radius: 4px; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
.search-item:hover { background: #2a2a4e; }
|
|
#info-panel { padding: 14px; border-bottom: 1px solid #2a2a4e; min-height: 140px; }
|
|
#info-panel h3 { font-size: 13px; color: #aaa; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.05em; }
|
|
#info-content { font-size: 13px; color: #ccc; line-height: 1.6; }
|
|
#info-content .field { margin-bottom: 5px; }
|
|
#info-content .field b { color: #e0e0e0; }
|
|
#info-content .empty { color: #555; font-style: italic; }
|
|
.neighbor-link { display: block; padding: 2px 6px; margin: 2px 0; border-radius: 3px; cursor: pointer; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-left: 3px solid #333; }
|
|
.neighbor-link:hover { background: #2a2a4e; }
|
|
#neighbors-list { max-height: 160px; overflow-y: auto; margin-top: 4px; }
|
|
#legend-wrap { flex: 1; overflow-y: auto; padding: 12px; }
|
|
#legend-wrap h3 { font-size: 13px; color: #aaa; margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.05em; }
|
|
.legend-item { display: flex; align-items: center; gap: 8px; padding: 4px 0; cursor: pointer; border-radius: 4px; font-size: 12px; }
|
|
.legend-item:hover { background: #2a2a4e; padding-left: 4px; }
|
|
.legend-item.dimmed { opacity: 0.35; }
|
|
.legend-dot { width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0; }
|
|
.legend-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
.legend-count { color: #666; font-size: 11px; }
|
|
#stats { padding: 10px 14px; border-top: 1px solid #2a2a4e; font-size: 11px; color: #555; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="graph"></div>
|
|
<div id="sidebar">
|
|
<div id="search-wrap">
|
|
<input id="search" type="text" placeholder="Search nodes..." autocomplete="off">
|
|
<div id="search-results"></div>
|
|
</div>
|
|
<div id="info-panel">
|
|
<h3>Node Info</h3>
|
|
<div id="info-content"><span class="empty">Click a node to inspect it</span></div>
|
|
</div>
|
|
<div id="legend-wrap">
|
|
<h3>Communities</h3>
|
|
<div id="legend"></div>
|
|
</div>
|
|
<div id="stats">1365 nodes · 1777 edges · 56 communities</div>
|
|
</div>
|
|
<script>
|
|
const RAW_NODES = [{"id": "backend_app_database_py", "label": "database.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "database.py", "community": 27, "community_name": "require_session", "source_file": "backend/app/database.py", "file_type": "code", "degree": 1}, {"id": "database_get_db", "label": "get_db()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "get_db()", "community": 27, "community_name": "require_session", "source_file": "backend/app/database.py", "file_type": "code", "degree": 2}, {"id": "backend_app_security_py", "label": "security.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "security.py", "community": 27, "community_name": "require_session", "source_file": "backend/app/security.py", "file_type": "code", "degree": 5}, {"id": "security_require_admin", "label": "require_admin()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "require_admin()", "community": 27, "community_name": "require_session", "source_file": "backend/app/security.py", "file_type": "code", "degree": 2}, {"id": "security_signer", "label": "_signer()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_signer()", "community": 27, "community_name": "require_session", "source_file": "backend/app/security.py", "file_type": "code", "degree": 3}, {"id": "security_issue_session", "label": "issue_session()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "issue_session()", "community": 27, "community_name": "require_session", "source_file": "backend/app/security.py", "file_type": "code", "degree": 4}, {"id": "security_require_session", "label": "require_session()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "require_session()", "community": 27, "community_name": "require_session", "source_file": "backend/app/security.py", "file_type": "code", "degree": 5}, {"id": "security_rationale_1", "label": "Auth dependencies for the MealPlanner backend. Two flavors: - ``require_admin``", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Auth dependencies for the MealPlanner backend. Two flavors: - ``require_admin``", "community": 27, "community_name": "require_session", "source_file": "backend/app/security.py", "file_type": "rationale", "degree": 1}, {"id": "security_rationale_30", "label": "Enforce a shared bearer token. 401 on bad/missing token, 503 if unset.", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Enforce a shared bearer token. 401 on bad/missing token, 503 if unset.", "community": 27, "community_name": "require_session", "source_file": "backend/app/security.py", "file_type": "rationale", "degree": 1}, {"id": "security_rationale_50", "label": "Sign the family_profile_id and return the cookie value.", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Sign the family_profile_id and return the cookie value.", "community": 27, "community_name": "require_session", "source_file": "backend/app/security.py", "file_type": "rationale", "degree": 1}, {"id": "security_rationale_55", "label": "Auto-authenticate: return the first family_profile_id from the DB. No cooki", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Auto-authenticate: return the first family_profile_id from the DB. No cooki", "community": 27, "community_name": "require_session", "source_file": "backend/app/security.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_main_py", "label": "main.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "main.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/main.py", "file_type": "code", "degree": 2}, {"id": "main_health_check", "label": "health_check()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "health_check()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/main.py", "file_type": "code", "degree": 1}, {"id": "main_health_check_db", "label": "health_check_db()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "health_check_db()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/main.py", "file_type": "code", "degree": 2}, {"id": "backend_app_config_py", "label": "config.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "config.py", "community": 20, "community_name": "_reload_settings", "source_file": "backend/app/config.py", "file_type": "code", "degree": 3}, {"id": "config_settings", "label": "Settings", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Settings", "community": 20, "community_name": "_reload_settings", "source_file": "backend/app/config.py", "file_type": "code", "degree": 4}, {"id": "basesettings", "label": "BaseSettings", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "BaseSettings", "community": 20, "community_name": "_reload_settings", "source_file": "", "file_type": "code", "degree": 1}, {"id": "config_config", "label": "Config", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Config", "community": 20, "community_name": "_reload_settings", "source_file": "backend/app/config.py", "file_type": "code", "degree": 1}, {"id": "config_require_database_url", "label": "_require_database_url()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_require_database_url()", "community": 20, "community_name": "_reload_settings", "source_file": "backend/app/config.py", "file_type": "code", "degree": 1}, {"id": "backend_app_models_init_py", "label": "__init__.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 19.2, "font": {"size": 12, "color": "#ffffff"}, "title": "__init__.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 29}, {"id": "init_dayofweek", "label": "DayOfWeek", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "DayOfWeek", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 1}, {"id": "init_mealtype", "label": "MealType", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "MealType", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_mealplanstatus", "label": "MealPlanStatus", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanStatus", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_mealplanitemstatus", "label": "MealPlanItemStatus", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanItemStatus", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 4}, {"id": "str", "label": "str", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 26.7, "font": {"size": 12, "color": "#ffffff"}, "title": "str", "community": 0, "community_name": "MealPlanItem", "source_file": "", "file_type": "code", "degree": 53}, {"id": "init_approvaltokenstatus", "label": "ApprovalTokenStatus", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "ApprovalTokenStatus", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 1}, {"id": "init_familymemberrole", "label": "FamilyMemberRole", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyMemberRole", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_denialreason", "label": "DenialReason", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "DenialReason", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_neversuggestreason", "label": "NeverSuggestReason", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "NeverSuggestReason", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 5}, {"id": "init_scrapestatus", "label": "ScrapeStatus", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "ScrapeStatus", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 1}, {"id": "init_emailstatus", "label": "EmailStatus", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "EmailStatus", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 1}, {"id": "init_ingredientmatchsource", "label": "IngredientMatchSource", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientMatchSource", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 1}, {"id": "init_familyprofile", "label": "FamilyProfile", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyProfile", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 8}, {"id": "base", "label": "Base", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 15.1, "font": {"size": 12, "color": "#ffffff"}, "title": "Base", "community": 0, "community_name": "MealPlanItem", "source_file": "", "file_type": "code", "degree": 16}, {"id": "init_familymember", "label": "FamilyMember", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyMember", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 6}, {"id": "init_ingredient", "label": "Ingredient", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Ingredient", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 5}, {"id": "init_recipe", "label": "Recipe", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "Recipe", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 7}, {"id": "init_total_time_minutes", "label": "total_time_minutes()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "total_time_minutes()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 1}, {"id": "init_mealplan", "label": "MealPlan", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlan", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 7}, {"id": "init_mealplanitem", "label": "MealPlanItem", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanItem", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 9}, {"id": "init_mealplanvote", "label": "MealPlanVote", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanVote", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 6}, {"id": "init_approvaltoken", "label": "ApprovalToken", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "ApprovalToken", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_homepantry", "label": "HomePantry", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "HomePantry", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 3}, {"id": "init_feedback", "label": "Feedback", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "Feedback", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 3}, {"id": "init_neversuggest", "label": "NeverSuggest", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "NeverSuggest", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 3}, {"id": "init_groceryitem", "label": "GroceryItem", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "GroceryItem", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 7}, {"id": "init_scrapelog", "label": "ScrapeLog", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "ScrapeLog", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 5}, {"id": "init_emaillog", "label": "EmailLog", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "EmailLog", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 3}, {"id": "init_ingredientgrocerymatch", "label": "IngredientGroceryMatch", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientGroceryMatch", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 3}, {"id": "init_weeklyrun", "label": "WeeklyRun", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "WeeklyRun", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/models/__init__.py", "file_type": "code", "degree": 9}, {"id": "backend_app_schemas_init_py", "label": "__init__.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 22.3, "font": {"size": 12, "color": "#ffffff"}, "title": "__init__.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 39}, {"id": "enum", "label": "Enum", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 13.2, "font": {"size": 0, "color": "#ffffff"}, "title": "Enum", "community": 0, "community_name": "MealPlanItem", "source_file": "", "file_type": "code", "degree": 10}, {"id": "init_ingredientbase", "label": "IngredientBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 4}, {"id": "basemodel", "label": "BaseModel", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 20.4, "font": {"size": 12, "color": "#ffffff"}, "title": "BaseModel", "community": 2, "community_name": "_PinMatchBody", "source_file": "", "file_type": "code", "degree": 33}, {"id": "init_ingredientresponse", "label": "IngredientResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_config", "label": "Config", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Config", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 1}, {"id": "init_ingredientcreate", "label": "IngredientCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_familymemberbase", "label": "FamilyMemberBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyMemberBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_familymemberresponse", "label": "FamilyMemberResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyMemberResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_familymembercreate", "label": "FamilyMemberCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyMemberCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_familyprofilebase", "label": "FamilyProfileBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyProfileBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_familyprofileresponse", "label": "FamilyProfileResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyProfileResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_familyprofilecreate", "label": "FamilyProfileCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyProfileCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_familyprofileupdate", "label": "FamilyProfileUpdate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "FamilyProfileUpdate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_recipeingredient", "label": "RecipeIngredient", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeIngredient", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_normalize", "label": "_normalize()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_normalize()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 1}, {"id": "init_recipebase", "label": "RecipeBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_reciperesponse", "label": "RecipeResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_recipecreate", "label": "RecipeCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_mealplanitembase", "label": "MealPlanItemBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanItemBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_mealplanitemresponse", "label": "MealPlanItemResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanItemResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_mealplanitemcreate", "label": "MealPlanItemCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanItemCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_mealplanbase", "label": "MealPlanBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_mealplanresponse", "label": "MealPlanResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_mealplancreate", "label": "MealPlanCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_voterequest", "label": "VoteRequest", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "VoteRequest", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_voteresponse", "label": "VoteResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "VoteResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_homepantrybase", "label": "HomePantryBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "HomePantryBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_homepantryresponse", "label": "HomePantryResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "HomePantryResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_homepantrycreate", "label": "HomePantryCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "HomePantryCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_feedbackbase", "label": "FeedbackBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "FeedbackBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 4}, {"id": "init_feedbackresponse", "label": "FeedbackResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "FeedbackResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_feedbackcreate", "label": "FeedbackCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "FeedbackCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 2}, {"id": "init_shoppinglistitem", "label": "ShoppingListItem", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "ShoppingListItem", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 3}, {"id": "init_shoppinglistresponse", "label": "ShoppingListResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "ShoppingListResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/__init__.py", "file_type": "code", "degree": 3}, {"id": "backend_app_schemas_ingredient_py", "label": "ingredient.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "ingredient.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/ingredient.py", "file_type": "code", "degree": 6}, {"id": "ingredient_ingredientbase", "label": "IngredientBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/ingredient.py", "file_type": "code", "degree": 4}, {"id": "ingredient_strip_and_drop_empty", "label": "_strip_and_drop_empty()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_strip_and_drop_empty()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/ingredient.py", "file_type": "code", "degree": 1}, {"id": "ingredient_ingredientcreate", "label": "IngredientCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/ingredient.py", "file_type": "code", "degree": 4}, {"id": "ingredient_ingredientupdate", "label": "IngredientUpdate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientUpdate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/ingredient.py", "file_type": "code", "degree": 3}, {"id": "ingredient_ingredientread", "label": "IngredientRead", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientRead", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/ingredient.py", "file_type": "code", "degree": 3}, {"id": "ingredient_ingredientgrocerymatchread", "label": "IngredientGroceryMatchRead", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientGroceryMatchRead", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/ingredient.py", "file_type": "code", "degree": 3}, {"id": "backend_app_schemas_recipe_py", "label": "recipe.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "recipe.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/recipe.py", "file_type": "code", "degree": 8}, {"id": "recipe_recipeingredientref", "label": "RecipeIngredientRef", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeIngredientRef", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/recipe.py", "file_type": "code", "degree": 3}, {"id": "recipe_recipebase", "label": "RecipeBase", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeBase", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/recipe.py", "file_type": "code", "degree": 4}, {"id": "recipe_recipecreate", "label": "RecipeCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/recipe.py", "file_type": "code", "degree": 4}, {"id": "recipe_recipeupdate", "label": "RecipeUpdate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeUpdate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/recipe.py", "file_type": "code", "degree": 2}, {"id": "recipe_reciperead", "label": "RecipeRead", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeRead", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/recipe.py", "file_type": "code", "degree": 2}, {"id": "recipe_resolveingredientrequest", "label": "ResolveIngredientRequest", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "ResolveIngredientRequest", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/recipe.py", "file_type": "code", "degree": 3}, {"id": "recipe_resolveingredientcandidate", "label": "ResolveIngredientCandidate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "ResolveIngredientCandidate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/recipe.py", "file_type": "code", "degree": 3}, {"id": "recipe_resolveingredientresponse", "label": "ResolveIngredientResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "ResolveIngredientResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/recipe.py", "file_type": "code", "degree": 3}, {"id": "backend_app_schemas_never_suggest_py", "label": "never_suggest.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "never_suggest.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/never_suggest.py", "file_type": "code", "degree": 3}, {"id": "never_suggest_neversuggestcreate", "label": "NeverSuggestCreate", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "NeverSuggestCreate", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/never_suggest.py", "file_type": "code", "degree": 2}, {"id": "never_suggest_exactly_one_target", "label": "_exactly_one_target()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_exactly_one_target()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/never_suggest.py", "file_type": "code", "degree": 1}, {"id": "never_suggest_neversuggestread", "label": "NeverSuggestRead", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "NeverSuggestRead", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/never_suggest.py", "file_type": "code", "degree": 2}, {"id": "backend_app_schemas_meal_plan_generation_py", "label": "meal_plan_generation.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "meal_plan_generation.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/meal_plan_generation.py", "file_type": "code", "degree": 5}, {"id": "meal_plan_generation_generaterequest", "label": "GenerateRequest", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "GenerateRequest", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/meal_plan_generation.py", "file_type": "code", "degree": 2}, {"id": "meal_plan_generation_regeneraterequest", "label": "RegenerateRequest", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "RegenerateRequest", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/meal_plan_generation.py", "file_type": "code", "degree": 2}, {"id": "meal_plan_generation_generationitem", "label": "GenerationItem", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "GenerationItem", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/meal_plan_generation.py", "file_type": "code", "degree": 4}, {"id": "meal_plan_generation_generationdebug", "label": "GenerationDebug", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "GenerationDebug", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/meal_plan_generation.py", "file_type": "code", "degree": 4}, {"id": "meal_plan_generation_generationresponse", "label": "GenerationResponse", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "GenerationResponse", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/schemas/meal_plan_generation.py", "file_type": "code", "degree": 4}, {"id": "backend_app_api_profile_py", "label": "profile.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "profile.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/profile.py", "file_type": "code", "degree": 5}, {"id": "profile_get_profile", "label": "get_profile()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_profile()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/profile.py", "file_type": "code", "degree": 1}, {"id": "profile_update_profile", "label": "update_profile()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "update_profile()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/profile.py", "file_type": "code", "degree": 1}, {"id": "profile_get_members", "label": "get_members()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_members()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/profile.py", "file_type": "code", "degree": 1}, {"id": "profile_add_member", "label": "add_member()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "add_member()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/profile.py", "file_type": "code", "degree": 2}, {"id": "profile_delete_member", "label": "delete_member()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "delete_member()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/profile.py", "file_type": "code", "degree": 1}, {"id": "backend_app_api_pantry_py", "label": "pantry.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "pantry.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/pantry.py", "file_type": "code", "degree": 4}, {"id": "pantry_get_pantry_items", "label": "get_pantry_items()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_pantry_items()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/pantry.py", "file_type": "code", "degree": 1}, {"id": "pantry_add_pantry_item", "label": "add_pantry_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "add_pantry_item()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/pantry.py", "file_type": "code", "degree": 2}, {"id": "pantry_remove_pantry_item", "label": "remove_pantry_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "remove_pantry_item()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/pantry.py", "file_type": "code", "degree": 1}, {"id": "pantry_update_pantry_item", "label": "update_pantry_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "update_pantry_item()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/pantry.py", "file_type": "code", "degree": 1}, {"id": "backend_app_api_auth_py", "label": "auth.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "auth.py", "community": 27, "community_name": "require_session", "source_file": "backend/app/api/auth.py", "file_type": "code", "degree": 4}, {"id": "auth_loginrequest", "label": "LoginRequest", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "LoginRequest", "community": 27, "community_name": "require_session", "source_file": "backend/app/api/auth.py", "file_type": "code", "degree": 2}, {"id": "auth_login", "label": "login()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "login()", "community": 27, "community_name": "require_session", "source_file": "backend/app/api/auth.py", "file_type": "code", "degree": 3}, {"id": "auth_logout", "label": "logout()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "logout()", "community": 27, "community_name": "require_session", "source_file": "backend/app/api/auth.py", "file_type": "code", "degree": 1}, {"id": "auth_rationale_1", "label": "Family-shared session login. POST /api/auth/login \u2014 body ``{\"password\": \"...\"}`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Family-shared session login. POST /api/auth/login \u2014 body ``{"password": "..."}`", "community": 27, "community_name": "require_session", "source_file": "backend/app/api/auth.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_api_shopping_list_py", "label": "shopping_list.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "shopping_list.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/shopping_list.py", "file_type": "code", "degree": 3}, {"id": "shopping_list_parse_uuid", "label": "_parse_uuid()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_parse_uuid()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/shopping_list.py", "file_type": "code", "degree": 2}, {"id": "shopping_list_get_shopping_list", "label": "get_shopping_list()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_shopping_list()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/shopping_list.py", "file_type": "code", "degree": 4}, {"id": "shopping_list_print_shopping_list", "label": "print_shopping_list()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "print_shopping_list()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/shopping_list.py", "file_type": "code", "degree": 1}, {"id": "backend_app_api_recipes_py", "label": "recipes.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "recipes.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 9}, {"id": "recipes_validate_ingredient_ids", "label": "_validate_ingredient_ids()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_validate_ingredient_ids()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 4}, {"id": "recipes_serialize", "label": "_serialize()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_serialize()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 5}, {"id": "recipes_list_recipes", "label": "list_recipes()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "list_recipes()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 2}, {"id": "recipes_get_recipe", "label": "get_recipe()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "get_recipe()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 2}, {"id": "recipes_create_recipe", "label": "create_recipe()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "create_recipe()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 4}, {"id": "recipes_update_recipe", "label": "update_recipe()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "update_recipe()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 3}, {"id": "recipes_delete_recipe", "label": "delete_recipe()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "delete_recipe()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 1}, {"id": "recipes_parse_qty_unit", "label": "_parse_qty_unit()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_parse_qty_unit()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 2}, {"id": "recipes_resolve_ingredient", "label": "resolve_ingredient()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "resolve_ingredient()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/recipes.py", "file_type": "code", "degree": 4}, {"id": "backend_app_api_ingredients_py", "label": "ingredients.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "ingredients.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/ingredients.py", "file_type": "code", "degree": 8}, {"id": "ingredients_list_ingredients", "label": "list_ingredients()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "list_ingredients()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/ingredients.py", "file_type": "code", "degree": 1}, {"id": "ingredients_get_ingredient", "label": "get_ingredient()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_ingredient()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/ingredients.py", "file_type": "code", "degree": 1}, {"id": "ingredients_create_ingredient", "label": "create_ingredient()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "create_ingredient()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/ingredients.py", "file_type": "code", "degree": 2}, {"id": "ingredients_update_ingredient", "label": "update_ingredient()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "update_ingredient()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/ingredients.py", "file_type": "code", "degree": 1}, {"id": "ingredients_delete_ingredient", "label": "delete_ingredient()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "delete_ingredient()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/ingredients.py", "file_type": "code", "degree": 1}, {"id": "ingredients_pinmatchbody", "label": "_PinMatchBody", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_PinMatchBody", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/ingredients.py", "file_type": "code", "degree": 6}, {"id": "ingredients_pin_match", "label": "pin_match()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "pin_match()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/ingredients.py", "file_type": "code", "degree": 3}, {"id": "ingredients_unpin_match", "label": "unpin_match()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "unpin_match()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/ingredients.py", "file_type": "code", "degree": 1}, {"id": "backend_app_api_never_suggest_py", "label": "never_suggest.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "never_suggest.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/never_suggest.py", "file_type": "code", "degree": 4}, {"id": "never_suggest_coerce_reason", "label": "_coerce_reason()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_coerce_reason()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/never_suggest.py", "file_type": "code", "degree": 3}, {"id": "never_suggest_list_for_family", "label": "list_for_family()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "list_for_family()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/never_suggest.py", "file_type": "code", "degree": 1}, {"id": "never_suggest_block", "label": "block()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "block()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/never_suggest.py", "file_type": "code", "degree": 3}, {"id": "never_suggest_unblock", "label": "unblock()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "unblock()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/never_suggest.py", "file_type": "code", "degree": 1}, {"id": "backend_app_api_meal_plans_py", "label": "meal_plans.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "meal_plans.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/meal_plans.py", "file_type": "code", "degree": 4}, {"id": "meal_plans_to_response", "label": "_to_response()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_to_response()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/meal_plans.py", "file_type": "code", "degree": 6}, {"id": "meal_plans_generate", "label": "generate()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "generate()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/meal_plans.py", "file_type": "code", "degree": 4}, {"id": "meal_plans_regenerate", "label": "regenerate()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "regenerate()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/meal_plans.py", "file_type": "code", "degree": 3}, {"id": "meal_plans_get_plan", "label": "get_plan()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_plan()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/app/api/meal_plans.py", "file_type": "code", "degree": 4}, {"id": "backend_app_api_admin_py", "label": "admin.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "admin.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/admin.py", "file_type": "code", "degree": 7}, {"id": "admin_trigger_scrape", "label": "trigger_scrape()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "trigger_scrape()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/admin.py", "file_type": "code", "degree": 3}, {"id": "admin_get_logs", "label": "get_logs()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "get_logs()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/admin.py", "file_type": "code", "degree": 2}, {"id": "admin_get_log", "label": "get_log()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "get_log()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/admin.py", "file_type": "code", "degree": 2}, {"id": "admin_get_email_logs", "label": "get_email_logs()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "get_email_logs()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/admin.py", "file_type": "code", "degree": 2}, {"id": "admin_get_all_meal_plans", "label": "get_all_meal_plans()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "get_all_meal_plans()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/admin.py", "file_type": "code", "degree": 2}, {"id": "admin_test_email", "label": "test_email()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_email()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/admin.py", "file_type": "code", "degree": 5}, {"id": "admin_get_stats", "label": "get_stats()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_stats()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/admin.py", "file_type": "code", "degree": 1}, {"id": "backend_app_api_feedback_py", "label": "feedback.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "feedback.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/feedback.py", "file_type": "code", "degree": 2}, {"id": "feedback_get_feedback", "label": "get_feedback()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "get_feedback()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/feedback.py", "file_type": "code", "degree": 2}, {"id": "feedback_create_feedback", "label": "create_feedback()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "create_feedback()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/feedback.py", "file_type": "code", "degree": 3}, {"id": "feedback_rationale_22", "label": "Get existing feedback for a meal plan item.", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Get existing feedback for a meal plan item.", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/feedback.py", "file_type": "rationale", "degree": 1}, {"id": "feedback_rationale_44", "label": "Create or update feedback for a meal plan item.", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Create or update feedback for a meal plan item.", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/feedback.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_api_meals_py", "label": "meals.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 14.1, "font": {"size": 0, "color": "#ffffff"}, "title": "meals.py", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 13}, {"id": "meals_get_planned_meals", "label": "get_planned_meals()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_planned_meals()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 1}, {"id": "meals_create_meal_plan", "label": "create_meal_plan()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "create_meal_plan()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 3}, {"id": "meals_get_meal_plan", "label": "get_meal_plan()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_meal_plan()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 1}, {"id": "meals_lock_meal_plan", "label": "lock_meal_plan()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "lock_meal_plan()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 1}, {"id": "meals_votesubmission", "label": "VoteSubmission", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "VoteSubmission", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 3}, {"id": "meals_get_vote_page", "label": "get_vote_page()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "get_vote_page()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 4}, {"id": "meals_submit_vote", "label": "submit_vote()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "submit_vote()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 4}, {"id": "meals_get_meal_item", "label": "get_meal_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "get_meal_item()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 2}, {"id": "meals_swap_meal_item", "label": "swap_meal_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "swap_meal_item()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 1}, {"id": "meals_approve_meal_item", "label": "approve_meal_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "approve_meal_item()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 2}, {"id": "meals_deny_meal_item", "label": "deny_meal_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "deny_meal_item()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 2}, {"id": "meals_generate_single_item", "label": "generate_single_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "generate_single_item()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 3}, {"id": "meals_move_meal_item", "label": "move_meal_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "move_meal_item()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "code", "degree": 3}, {"id": "meals_rationale_110", "label": "Body for POST /vote/{item_id}?token=... Spec body: {\"vote\": \"approve\" | \"de", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Body for POST /vote/{item_id}?token=... Spec body: {"vote": "approve" | "de", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "rationale", "degree": 1}, {"id": "meals_rationale_124", "label": "Render the per-voter approval confirmation page. Verifies the signed token", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Render the per-voter approval confirmation page. Verifies the signed token", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "rationale", "degree": 1}, {"id": "meals_rationale_257", "label": "Record a per-voter vote and apply the approval rule. - Single-use enforceme", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Record a per-voter vote and apply the approval rule. - Single-use enforceme", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "rationale", "degree": 1}, {"id": "meals_rationale_343", "label": "Directly approve a meal plan item from the dashboard.", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Directly approve a meal plan item from the dashboard.", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "rationale", "degree": 1}, {"id": "meals_rationale_354", "label": "Directly deny a meal plan item from the dashboard.", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Directly deny a meal plan item from the dashboard.", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "rationale", "degree": 1}, {"id": "meals_rationale_370", "label": "Generate a single meal for an empty slot.", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Generate a single meal for an empty slot.", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/meals.py", "file_type": "rationale", "degree": 1}, {"id": "meals_rationale_419", "label": "Move a meal to a new day/type slot. If the target slot is occupied by anoth", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Move a meal to a new day/type slot. If the target slot is occupied by anoth", "community": 10, "community_name": "issue_token", "source_file": "backend/app/api/meals.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_api_orchestrate_py", "label": "orchestrate.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "orchestrate.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/orchestrate.py", "file_type": "code", "degree": 3}, {"id": "orchestrate_orchestrate_status", "label": "orchestrate_status()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "orchestrate_status()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/orchestrate.py", "file_type": "code", "degree": 2}, {"id": "orchestrate_orchestrate_run_week", "label": "orchestrate_run_week()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "orchestrate_run_week()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/orchestrate.py", "file_type": "code", "degree": 2}, {"id": "orchestrate_orchestrate_step", "label": "orchestrate_step()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "orchestrate_step()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/api/orchestrate.py", "file_type": "code", "degree": 2}, {"id": "backend_app_services_init_py", "label": "__init__.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/app/services/__init__.py", "file_type": "code", "degree": 0}, {"id": "backend_app_services_approval_py", "label": "approval.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "approval.py", "community": 10, "community_name": "issue_token", "source_file": "backend/app/services/approval.py", "file_type": "code", "degree": 5}, {"id": "approval_serializer", "label": "_serializer()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_serializer()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/services/approval.py", "file_type": "code", "degree": 3}, {"id": "approval_issue_token", "label": "issue_token()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 13.8, "font": {"size": 0, "color": "#ffffff"}, "title": "issue_token()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/services/approval.py", "file_type": "code", "degree": 12}, {"id": "approval_verify_token", "label": "verify_token()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "verify_token()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/services/approval.py", "file_type": "code", "degree": 7}, {"id": "approval_consume_token", "label": "consume_token()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "consume_token()", "community": 10, "community_name": "issue_token", "source_file": "backend/app/services/approval.py", "file_type": "code", "degree": 6}, {"id": "approval_rationale_1", "label": "Per-voter approval tokens. Stateless signed tokens (itsdangerous) keyed on sett", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Per-voter approval tokens. Stateless signed tokens (itsdangerous) keyed on sett", "community": 10, "community_name": "issue_token", "source_file": "backend/app/services/approval.py", "file_type": "rationale", "degree": 1}, {"id": "approval_rationale_63", "label": "Verify + match URL + enforce single-use. Returns the voter on success. Sing", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verify + match URL + enforce single-use. Returns the voter on success. Sing", "community": 10, "community_name": "issue_token", "source_file": "backend/app/services/approval.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_services_swiftly_auth_py", "label": "swiftly_auth.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "swiftly_auth.py", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "code", "degree": 7}, {"id": "swiftly_auth_swiftlyauthminterror", "label": "SwiftlyAuthMintError", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 17.9, "font": {"size": 12, "color": "#ffffff"}, "title": "SwiftlyAuthMintError", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "code", "degree": 25}, {"id": "exception", "label": "Exception", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Exception", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "", "file_type": "code", "degree": 5}, {"id": "swiftly_auth_reset_cache_for_tests", "label": "_reset_cache_for_tests()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_reset_cache_for_tests()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "code", "degree": 3}, {"id": "swiftly_auth_decode_jwt_payload", "label": "_decode_jwt_payload()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_decode_jwt_payload()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "code", "degree": 3}, {"id": "swiftly_auth_fetch_firebase_api_key", "label": "_fetch_firebase_api_key()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_fetch_firebase_api_key()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "code", "degree": 3}, {"id": "swiftly_auth_mint_anonymous_token", "label": "mint_anonymous_token()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "mint_anonymous_token()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "code", "degree": 6}, {"id": "swiftly_auth_get_token", "label": "get_token()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "get_token()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "code", "degree": 7}, {"id": "swiftly_auth_rationale_1", "label": "Swiftly bearer-JWT auto-mint via Firebase REST. Replaces the static ``SWIFTLY_B", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Swiftly bearer-JWT auto-mint via Firebase REST. Replaces the static ``SWIFTLY_B", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "rationale", "degree": 1}, {"id": "swiftly_auth_rationale_29", "label": "Raised when minting a fresh Swiftly JWT fails. Surface the message verbatim", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Raised when minting a fresh Swiftly JWT fails. Surface the message verbatim", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "rationale", "degree": 1}, {"id": "swiftly_auth_rationale_52", "label": "Clear the process-local cache. Test-only helper.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Clear the process-local cache. Test-only helper.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "rationale", "degree": 1}, {"id": "swiftly_auth_rationale_106", "label": "Mint a fresh anonymous Firebase ID token. Returns ``(token, exp_epoch_secon", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Mint a fresh anonymous Firebase ID token. Returns ``(token, exp_epoch_secon", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "rationale", "degree": 1}, {"id": "swiftly_auth_rationale_161", "label": "Return a valid Swiftly bearer JWT, minting one if needed. A cached token is", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Return a valid Swiftly bearer JWT, minting one if needed. A cached token is", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/swiftly_auth.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_services_email_py", "label": "email.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "email.py", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "code", "degree": 5}, {"id": "email_emailbackend", "label": "EmailBackend", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "EmailBackend", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "code", "degree": 3}, {"id": "protocol", "label": "Protocol", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Protocol", "community": 5, "community_name": "step_reminder", "source_file": "", "file_type": "code", "degree": 1}, {"id": "email_emailbackend_send", "label": ".send()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": ".send()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "code", "degree": 1}, {"id": "email_consoleemailbackend", "label": "ConsoleEmailBackend", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "ConsoleEmailBackend", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "code", "degree": 4}, {"id": "email_consoleemailbackend_send", "label": ".send()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": ".send()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "code", "degree": 1}, {"id": "email_sendgridemailbackend", "label": "SendGridEmailBackend", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "SendGridEmailBackend", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "code", "degree": 7}, {"id": "email_sendgridemailbackend_init", "label": ".__init__()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": ".__init__()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "code", "degree": 1}, {"id": "email_sendgridemailbackend_send", "label": ".send()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": ".send()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "code", "degree": 9}, {"id": "email_get_email_backend", "label": "get_email_backend()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "get_email_backend()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "code", "degree": 9}, {"id": "email_rationale_1", "label": "Email backends. R2-B spike: only ConsoleEmailBackend is functional. SendGrid is", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Email backends. R2-B spike: only ConsoleEmailBackend is functional. SendGrid is", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "rationale", "degree": 1}, {"id": "email_rationale_41", "label": "Dev/spike backend. Prints to stdout AND appends a JSON line to backend/var/e", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Dev/spike backend. Prints to stdout AND appends a JSON line to backend/var/e", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/email.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_services_matcher_py", "label": "matcher.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "matcher.py", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/matcher.py", "file_type": "code", "degree": 5}, {"id": "matcher_singularize", "label": "_singularize()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_singularize()", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/matcher.py", "file_type": "code", "degree": 3}, {"id": "matcher_matchresult", "label": "MatchResult", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "MatchResult", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/matcher.py", "file_type": "code", "degree": 1}, {"id": "matcher_sig_words", "label": "_sig_words()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_sig_words()", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/matcher.py", "file_type": "code", "degree": 5}, {"id": "matcher_run_match_job", "label": "run_match_job()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "run_match_job()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/matcher.py", "file_type": "code", "degree": 9}, {"id": "matcher_rationale_1", "label": "Fuzzy ingredient\u2192grocery_item matcher. Ingredient-centric: for each ingredient,", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Fuzzy ingredient\u2192grocery_item matcher. Ingredient-centric: for each ingredient,", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/matcher.py", "file_type": "rationale", "degree": 1}, {"id": "matcher_rationale_43", "label": "Best-effort English singularization for grocery product names. Handles 'tor", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Best-effort English singularization for grocery product names. Handles 'tor", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/matcher.py", "file_type": "rationale", "degree": 1}, {"id": "matcher_rationale_94", "label": "Lowercase alpha tokens >2 chars, stop-words removed, plurals normalized.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Lowercase alpha tokens >2 chars, stop-words removed, plurals normalized.", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/matcher.py", "file_type": "rationale", "degree": 1}, {"id": "matcher_rationale_109", "label": "Refresh AUTO ingredient_grocery_match rows for grocery items from `source_filter", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Refresh AUTO ingredient_grocery_match rows for grocery items from `source_filter", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/matcher.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_services_scraper_service_py", "label": "scraper_service.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "scraper_service.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "code", "degree": 4}, {"id": "scraper_service_enqueue_scrape", "label": "enqueue_scrape()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "enqueue_scrape()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "code", "degree": 4}, {"id": "scraper_service_run_scrape_in_background", "label": "_run_scrape_in_background()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "_run_scrape_in_background()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/scraper_service.py", "file_type": "code", "degree": 9}, {"id": "scraper_service_scraperservice", "label": "ScraperService", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "ScraperService", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "code", "degree": 9}, {"id": "scraper_service_scraperservice_init", "label": ".__init__()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": ".__init__()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "code", "degree": 1}, {"id": "scraper_service_scraperservice_run_scrape", "label": ".run_scrape()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": ".run_scrape()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "code", "degree": 6}, {"id": "scraper_service_scraperservice_do_scrape", "label": "._do_scrape()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "._do_scrape()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/scraper_service.py", "file_type": "code", "degree": 8}, {"id": "scraper_service_scraperservice_save_grocery_item", "label": "._save_grocery_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "._save_grocery_item()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "code", "degree": 4}, {"id": "scraper_service_scraperservice_get_sale_items", "label": ".get_sale_items()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": ".get_sale_items()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "code", "degree": 2}, {"id": "scraper_service_rationale_1", "label": "Scraper service. Two entry points: - ``enqueue_scrape(db, source, scrape_type,", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Scraper service. Two entry points: - ``enqueue_scrape(db, source, scrape_type,", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "rationale", "degree": 1}, {"id": "scraper_service_rationale_43", "label": "Create the ScrapeLog row, commit, and schedule the background scrape. Retur", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Create the ScrapeLog row, commit, and schedule the background scrape. Retur", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "rationale", "degree": 1}, {"id": "scraper_service_rationale_68", "label": "Background entry point. Opens a fresh DB session \u2014 the request-scoped sessio", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Background entry point. Opens a fresh DB session \u2014 the request-scoped sessio", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/scraper_service.py", "file_type": "rationale", "degree": 1}, {"id": "scraper_service_rationale_130", "label": "Synchronous end-to-end scrape (legacy path). Creates the log row, runs t", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Synchronous end-to-end scrape (legacy path). Creates the log row, runs t", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/app/services/scraper_service.py", "file_type": "rationale", "degree": 1}, {"id": "scraper_service_rationale_181", "label": "Run the scraper and persist items. Returns (saved, found). Raises any s", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Run the scraper and persist items. Returns (saved, found). Raises any s", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/services/scraper_service.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_services_llm_matcher_py", "label": "llm_matcher.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "llm_matcher.py", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "code", "degree": 5}, {"id": "llm_matcher_get_candidates", "label": "_get_candidates()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_get_candidates()", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "code", "degree": 4}, {"id": "llm_matcher_get_unmatched_ingredients", "label": "_get_unmatched_ingredients()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_get_unmatched_ingredients()", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "code", "degree": 3}, {"id": "llm_matcher_ask_ollama", "label": "_ask_ollama()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_ask_ollama()", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "code", "degree": 3}, {"id": "llm_matcher_run_llm_match_job", "label": "run_llm_match_job()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "run_llm_match_job()", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "code", "degree": 6}, {"id": "llm_matcher_rationale_1", "label": "LLM-powered second-pass ingredient\u2192grocery matcher. After the deterministic AUT", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "LLM-powered second-pass ingredient\u2192grocery matcher. After the deterministic AUT", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "rationale", "degree": 1}, {"id": "llm_matcher_rationale_42", "label": "Return up to ``_CANDIDATE_LIMIT`` grocery items ranked by fuzzy\u00d7precision.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Return up to ``_CANDIDATE_LIMIT`` grocery items ranked by fuzzy\u00d7precision.", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "rationale", "degree": 1}, {"id": "llm_matcher_rationale_87", "label": "Ingredients with no existing match in ingredient_grocery_match.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Ingredients with no existing match in ingredient_grocery_match.", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "rationale", "degree": 1}, {"id": "llm_matcher_rationale_98", "label": "Ask the LLM to pick the best grocery item for the ingredient. Returns the 0", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Ask the LLM to pick the best grocery item for the ingredient. Returns the 0", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "rationale", "degree": 1}, {"id": "llm_matcher_rationale_152", "label": "LLM second pass: match remaining unmatched ingredients. For each ingredient", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "LLM second pass: match remaining unmatched ingredients. For each ingredient", "community": 24, "community_name": "run_llm_match_job", "source_file": "backend/app/services/llm_matcher.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_services_planner_init_py", "label": "__init__.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/app/services/planner/__init__.py", "file_type": "code", "degree": 0}, {"id": "backend_app_services_planner_config_py", "label": "config.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "config.py", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/config.py", "file_type": "code", "degree": 2}, {"id": "config_plannerconfig", "label": "PlannerConfig", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "PlannerConfig", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/config.py", "file_type": "code", "degree": 9}, {"id": "config_plannerconfig_validate", "label": ".validate()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": ".validate()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/config.py", "file_type": "code", "degree": 1}, {"id": "config_rationale_1", "label": "Planner constants. Tune here without touching algorithm code.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Planner constants. Tune here without touching algorithm code.", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/config.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_services_planner_types_py", "label": "types.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "types.py", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/types.py", "file_type": "code", "degree": 8}, {"id": "types_ingredientcost", "label": "IngredientCost", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "IngredientCost", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/app/services/planner/types.py", "file_type": "code", "degree": 3}, {"id": "types_recipecost", "label": "RecipeCost", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 13.2, "font": {"size": 0, "color": "#ffffff"}, "title": "RecipeCost", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/types.py", "file_type": "code", "degree": 10}, {"id": "types_sale_coverage_pct", "label": "sale_coverage_pct()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "sale_coverage_pct()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/types.py", "file_type": "code", "degree": 1}, {"id": "types_pantry_hit_pct", "label": "pantry_hit_pct()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "pantry_hit_pct()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/types.py", "file_type": "code", "degree": 1}, {"id": "types_filterresult", "label": "FilterResult", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "FilterResult", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/types.py", "file_type": "code", "degree": 3}, {"id": "types_scoredrecipe", "label": "ScoredRecipe", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "ScoredRecipe", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/types.py", "file_type": "code", "degree": 7}, {"id": "types_generationresult", "label": "GenerationResult", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "GenerationResult", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/types.py", "file_type": "code", "degree": 6}, {"id": "types_rationale_1", "label": "Shared planner data structures.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Shared planner data structures.", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/types.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_services_planner_cost_py", "label": "cost.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "cost.py", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/app/services/planner/cost.py", "file_type": "code", "degree": 4}, {"id": "cost_decimal", "label": "_decimal()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_decimal()", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/app/services/planner/cost.py", "file_type": "code", "degree": 3}, {"id": "cost_scale", "label": "_scale()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_scale()", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/app/services/planner/cost.py", "file_type": "code", "degree": 3}, {"id": "cost_compute_recipe_cost", "label": "compute_recipe_cost()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "compute_recipe_cost()", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/app/services/planner/cost.py", "file_type": "code", "degree": 9}, {"id": "cost_rationale_1", "label": "Compute per-recipe cost and savings against ingredient_grocery_match. Inputs:", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "Compute per-recipe cost and savings against ingredient_grocery_match. Inputs:", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/app/services/planner/cost.py", "file_type": "rationale", "degree": 3}, {"id": "backend_app_services_planner_filter_py", "label": "filter.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "filter.py", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/filter.py", "file_type": "code", "degree": 3}, {"id": "filter_calorie_band", "label": "_calorie_band()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_calorie_band()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/filter.py", "file_type": "code", "degree": 2}, {"id": "filter_filter_recipes", "label": "filter_recipes()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 13.8, "font": {"size": 0, "color": "#ffffff"}, "title": "filter_recipes()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/filter.py", "file_type": "code", "degree": 12}, {"id": "filter_rationale_1", "label": "Hard-constraint filter (constraints #1-#6 from the spec).", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Hard-constraint filter (constraints #1-#6 from the spec).", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/filter.py", "file_type": "rationale", "degree": 4}, {"id": "backend_app_services_planner_score_py", "label": "score.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "score.py", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/score.py", "file_type": "code", "degree": 5}, {"id": "score_time_bonus", "label": "time_bonus()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "time_bonus()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/score.py", "file_type": "code", "degree": 5}, {"id": "score_recency_bonus", "label": "recency_bonus()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "recency_bonus()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/score.py", "file_type": "code", "degree": 5}, {"id": "score_normalize_savings", "label": "normalize_savings()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "normalize_savings()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/score.py", "file_type": "code", "degree": 4}, {"id": "score_score_recipes", "label": "score_recipes()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "score_recipes()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/score.py", "file_type": "code", "degree": 8}, {"id": "score_rationale_1", "label": "Per-recipe scoring with the 5 weighted signals from the spec.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Per-recipe scoring with the 5 weighted signals from the spec.", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/score.py", "file_type": "rationale", "degree": 4}, {"id": "score_rationale_60", "label": "Returns recipes scored DESC. Caller passes only the feasible set.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Returns recipes scored DESC. Caller passes only the feasible set.", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/score.py", "file_type": "rationale", "degree": 4}, {"id": "backend_app_services_planner_select_py", "label": "select.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "select.py", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/select.py", "file_type": "code", "degree": 4}, {"id": "select_set_diversity_penalty", "label": "set_diversity_penalty()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "set_diversity_penalty()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/select.py", "file_type": "code", "degree": 4}, {"id": "select_set_score", "label": "_set_score()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_set_score()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/select.py", "file_type": "code", "degree": 3}, {"id": "select_select_set", "label": "select_set()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "select_set()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/select.py", "file_type": "code", "degree": 6}, {"id": "select_rationale_1", "label": "Top-K set enumeration with diversity penalty. Takes the top K (=20) scored reci", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "Top-K set enumeration with diversity penalty. Takes the top K (=20) scored reci", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/select.py", "file_type": "rationale", "degree": 3}, {"id": "backend_app_services_planner_generate_py", "label": "generate.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "generate.py", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/generate.py", "file_type": "code", "degree": 6}, {"id": "generate_load_match_index", "label": "_load_match_index()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_load_match_index()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/generate.py", "file_type": "code", "degree": 3}, {"id": "generate_load_blocklists", "label": "_load_blocklists()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_load_blocklists()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/generate.py", "file_type": "code", "degree": 2}, {"id": "generate_load_pantry", "label": "_load_pantry()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_load_pantry()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/generate.py", "file_type": "code", "degree": 2}, {"id": "generate_load_last_cooked", "label": "_load_last_cooked()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_load_last_cooked()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/generate.py", "file_type": "code", "degree": 2}, {"id": "generate_generate_meal_plan", "label": "generate_meal_plan()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 15.1, "font": {"size": 12, "color": "#ffffff"}, "title": "generate_meal_plan()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/generate.py", "file_type": "code", "degree": 16}, {"id": "generate_rationale_1", "label": "End-to-end planner orchestration: load \u2192 filter \u2192 score \u2192 select \u2192 persist.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "End-to-end planner orchestration: load \u2192 filter \u2192 score \u2192 select \u2192 persist.", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/generate.py", "file_type": "rationale", "degree": 3}, {"id": "generate_rationale_33", "label": "ingredient_id \u2192 list of match dicts ordered by confidence DESC.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "ingredient_id \u2192 list of match dicts ordered by confidence DESC.", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/app/services/planner/generate.py", "file_type": "rationale", "degree": 3}, {"id": "backend_app_services_orchestrator_init_py", "label": "__init__.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/app/services/orchestrator/__init__.py", "file_type": "code", "degree": 0}, {"id": "backend_app_services_orchestrator_alerts_py", "label": "alerts.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "alerts.py", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/alerts.py", "file_type": "code", "degree": 1}, {"id": "alerts_send_admin_alert", "label": "send_admin_alert()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "send_admin_alert()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/alerts.py", "file_type": "code", "degree": 8}, {"id": "backend_app_services_orchestrator_runner_py", "label": "runner.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "runner.py", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/runner.py", "file_type": "code", "degree": 5}, {"id": "runner_current_week_start", "label": "_current_week_start()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_current_week_start()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/runner.py", "file_type": "code", "degree": 4}, {"id": "runner_get_or_create_run", "label": "_get_or_create_run()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_get_or_create_run()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/runner.py", "file_type": "code", "degree": 3}, {"id": "runner_run_step", "label": "run_step()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "run_step()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/runner.py", "file_type": "code", "degree": 7}, {"id": "runner_run_week", "label": "run_week()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "run_week()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/runner.py", "file_type": "code", "degree": 4}, {"id": "runner_rationale_1", "label": "Orchestrator runner. run_step(step_name, week_start_date) \u2014 execute one step f", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Orchestrator runner. run_step(step_name, week_start_date) \u2014 execute one step f", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/runner.py", "file_type": "rationale", "degree": 1}, {"id": "runner_rationale_21", "label": "Return the most recent Friday (today if today is Friday).", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Return the most recent Friday (today if today is Friday).", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/runner.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_services_orchestrator_steps_py", "label": "steps.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "steps.py", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/steps.py", "file_type": "code", "degree": 7}, {"id": "steps_step_scrape", "label": "step_scrape()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "step_scrape()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/steps.py", "file_type": "code", "degree": 7}, {"id": "steps_step_generate", "label": "step_generate()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "step_generate()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/steps.py", "file_type": "code", "degree": 7}, {"id": "steps_step_email", "label": "step_email()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "step_email()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/steps.py", "file_type": "code", "degree": 9}, {"id": "steps_step_deadline", "label": "step_deadline()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "step_deadline()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/steps.py", "file_type": "code", "degree": 4}, {"id": "steps_step_finalize", "label": "step_finalize()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "step_finalize()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/steps.py", "file_type": "code", "degree": 7}, {"id": "steps_step_reminder", "label": "step_reminder()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 13.2, "font": {"size": 0, "color": "#ffffff"}, "title": "step_reminder()", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/steps.py", "file_type": "code", "degree": 10}, {"id": "steps_rationale_1", "label": "Orchestrator step functions. Each step receives a WeeklyRun row and an open Ses", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Orchestrator step functions. Each step receives a WeeklyRun row and an open Ses", "community": 5, "community_name": "step_reminder", "source_file": "backend/app/services/orchestrator/steps.py", "file_type": "rationale", "degree": 2}, {"id": "backend_app_scraper_base_py", "label": "base.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "base.py", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 5}, {"id": "base_basescraper", "label": "BaseScraper", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "BaseScraper", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 9}, {"id": "abc", "label": "ABC", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "ABC", "community": 25, "community_name": "BaseScraper", "source_file": "", "file_type": "code", "degree": 2}, {"id": "base_basescraper_init", "label": ".__init__()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": ".__init__()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 2}, {"id": "base_basescraper_create_session", "label": "._create_session()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "._create_session()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 2}, {"id": "base_basescraper_rate_limit", "label": "._rate_limit()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "._rate_limit()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 3}, {"id": "base_basescraper_get", "label": "._get()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "._get()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 2}, {"id": "base_basescraper_post", "label": "._post()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "._post()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 2}, {"id": "base_scrape", "label": "scrape()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "scrape()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 1}, {"id": "base_basescraper_log_scrape", "label": ".log_scrape()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": ".log_scrape()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 1}, {"id": "base_seleniumscraper", "label": "SeleniumScraper", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "SeleniumScraper", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 7}, {"id": "base_seleniumscraper_init", "label": ".__init__()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": ".__init__()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 1}, {"id": "base_seleniumscraper_init_playwright", "label": "._init_playwright()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "._init_playwright()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 2}, {"id": "base_seleniumscraper_get_playwright", "label": "._get_playwright()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "._get_playwright()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 3}, {"id": "base_seleniumscraper_get_browser_page", "label": ".get_browser_page()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": ".get_browser_page()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 2}, {"id": "base_seleniumscraper_cleanup", "label": ".cleanup()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": ".cleanup()", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/base.py", "file_type": "code", "degree": 1}, {"id": "backend_app_scraper_init_py", "label": "__init__.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 25, "community_name": "BaseScraper", "source_file": "backend/app/scraper/__init__.py", "file_type": "code", "degree": 2}, {"id": "backend_app_scraper_lucky_ca_scraper_py", "label": "lucky_ca_scraper.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "lucky_ca_scraper.py", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 9}, {"id": "lucky_ca_scraper_swiftlyautherror", "label": "SwiftlyAuthError", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 13.8, "font": {"size": 0, "color": "#ffffff"}, "title": "SwiftlyAuthError", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 12}, {"id": "lucky_ca_scraper_luckycaliforniascraper", "label": "LuckyCaliforniaScraper", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 17.3, "font": {"size": 12, "color": "#ffffff"}, "title": "LuckyCaliforniaScraper", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 23}, {"id": "lucky_ca_scraper_luckycaliforniascraper_init", "label": ".__init__()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": ".__init__()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 1}, {"id": "lucky_ca_scraper_luckycaliforniascraper_cleanup", "label": ".cleanup()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": ".cleanup()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 3}, {"id": "lucky_ca_scraper_luckycaliforniascraper_scrape", "label": ".scrape()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": ".scrape()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 3}, {"id": "lucky_ca_scraper_luckycaliforniascraper_fetch_all", "label": ".fetch_all()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": ".fetch_all()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 8}, {"id": "lucky_ca_scraper_luckycaliforniascraper_discover_categories", "label": ".discover_categories()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": ".discover_categories()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 6}, {"id": "lucky_ca_scraper_parse_categories_html", "label": "parse_categories_html()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "parse_categories_html()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 3}, {"id": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "label": ".fetch_category()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": ".fetch_category()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 9}, {"id": "lucky_ca_scraper_parse_category_response", "label": "parse_category_response()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "parse_category_response()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 3}, {"id": "lucky_ca_scraper_map_product", "label": "map_product()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "map_product()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 7}, {"id": "lucky_ca_scraper_parse_price", "label": "_parse_price()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_parse_price()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 2}, {"id": "lucky_ca_scraper_aisle_from_slug", "label": "_aisle_from_slug()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_aisle_from_slug()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 3}, {"id": "lucky_ca_scraper_luckycaliforniascraper_rate_limit", "label": "._rate_limit()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "._rate_limit()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "code", "degree": 3}, {"id": "lucky_ca_scraper_rationale_1", "label": "Lucky California / Swiftly product API client. Replaces the prior Playwright +", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Lucky California / Swiftly product API client. Replaces the prior Playwright +", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 2}, {"id": "lucky_ca_scraper_rationale_50", "label": "Raised when the Swiftly API returns 401. The exception message is surfaced", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Raised when the Swiftly API returns 401. The exception message is surfaced", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 2}, {"id": "lucky_ca_scraper_rationale_68", "label": "Swiftly product-API client for the Lucky California banner. The class name", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Swiftly product-API client for the Lucky California banner. The class name", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 2}, {"id": "lucky_ca_scraper_rationale_139", "label": "Synchronous top-level scrape. Kept for the legacy ``ScraperService.run_", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Synchronous top-level scrape. Kept for the legacy ``ScraperService.run_", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 2}, {"id": "lucky_ca_scraper_rationale_158", "label": "Yield mapped product dicts across every discovered category.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Yield mapped product dicts across every discovered category.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 2}, {"id": "lucky_ca_scraper_rationale_180", "label": "Fetch the categories page and return the list of API slugs. The slugs l", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Fetch the categories page and return the list of API slugs. The slugs l", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 2}, {"id": "lucky_ca_scraper_rationale_192", "label": "Pure parser used by tests against a saved fixture.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Pure parser used by tests against a saved fixture.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 1}, {"id": "lucky_ca_scraper_rationale_209", "label": "Fetch every product in a category. Raises ``SwiftlyAuthError`` on 401.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Fetch every product in a category. Raises ``SwiftlyAuthError`` on 401.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 2}, {"id": "lucky_ca_scraper_rationale_227", "label": "Pure parser used by tests against a saved fixture.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Pure parser used by tests against a saved fixture.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 1}, {"id": "lucky_ca_scraper_rationale_247", "label": "Convert one Swiftly product dict to a grocery_item-ready dict. Returns", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Convert one Swiftly product dict to a grocery_item-ready dict. Returns", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 1}, {"id": "lucky_ca_scraper_rationale_298", "label": "Extract ``(price, unit)`` from strings like ``\"$3.49 /lb\"``. Returns ``", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Extract ``(price, unit)`` from strings like ``"$3.49 /lb"``. Returns ``", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 1}, {"id": "lucky_ca_scraper_rationale_318", "label": "``Product/meat_seafood`` \u2192 ``meat_seafood``.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "``Product/meat_seafood`` \u2192 ``meat_seafood``.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/app/scraper/lucky_ca_scraper.py", "file_type": "rationale", "degree": 1}, {"id": "backend_app_scheduler_init_py", "label": "__init__.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/app/scheduler/__init__.py", "file_type": "code", "degree": 0}, {"id": "backend_app_scheduler_main_py", "label": "__main__.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "__main__.py", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/app/scheduler/__main__.py", "file_type": "code", "degree": 1}, {"id": "main_rationale_1", "label": "APScheduler entry point for the scheduler container. Run: python -m app.schedul", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "APScheduler entry point for the scheduler container. Run: python -m app.schedul", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/app/scheduler/__main__.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_env_py", "label": "env.py", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "env.py", "community": 53, "community_name": "env.py", "source_file": "backend/alembic/env.py", "file_type": "code", "degree": 2}, {"id": "env_run_migrations_offline", "label": "run_migrations_offline()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "run_migrations_offline()", "community": 53, "community_name": "env.py", "source_file": "backend/alembic/env.py", "file_type": "code", "degree": 1}, {"id": "env_run_migrations_online", "label": "run_migrations_online()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "run_migrations_online()", "community": 53, "community_name": "env.py", "source_file": "backend/alembic/env.py", "file_type": "code", "degree": 1}, {"id": "backend_alembic_versions_0003_grocery_item_description_py", "label": "0003_grocery_item_description.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "0003_grocery_item_description.py", "community": 44, "community_name": "Add nullable description column", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "file_type": "code", "degree": 3}, {"id": "0003_grocery_item_description_upgrade", "label": "upgrade()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 44, "community_name": "Add nullable description column", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "file_type": "code", "degree": 1}, {"id": "0003_grocery_item_description_downgrade", "label": "downgrade()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 44, "community_name": "Add nullable description column", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "file_type": "code", "degree": 1}, {"id": "0003_grocery_item_description_rationale_1", "label": "Add nullable description column to grocery_item. The Lucky California parser pr", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Add nullable description column to grocery_item. The Lucky California parser pr", "community": 44, "community_name": "Add nullable description column", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_versions_0002_seed_data_py", "label": "0002_seed_data.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "0002_seed_data.py", "community": 45, "community_name": "Seed initial data Revision", "source_file": "backend/alembic/versions/0002_seed_data.py", "file_type": "code", "degree": 3}, {"id": "0002_seed_data_upgrade", "label": "upgrade()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 45, "community_name": "Seed initial data Revision", "source_file": "backend/alembic/versions/0002_seed_data.py", "file_type": "code", "degree": 1}, {"id": "0002_seed_data_downgrade", "label": "downgrade()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 45, "community_name": "Seed initial data Revision", "source_file": "backend/alembic/versions/0002_seed_data.py", "file_type": "code", "degree": 1}, {"id": "0002_seed_data_rationale_1", "label": "Seed initial data Revision ID: 0002 Revises: 0001 Create Date: 2026-05-04", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Seed initial data Revision ID: 0002 Revises: 0001 Create Date: 2026-05-04", "community": 45, "community_name": "Seed initial data Revision", "source_file": "backend/alembic/versions/0002_seed_data.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_versions_0004_family_profile_calorie_target_py", "label": "0004_family_profile_calorie_target.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "0004_family_profile_calorie_target.py", "community": 46, "community_name": "Add calorie_target to family_profile", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "file_type": "code", "degree": 3}, {"id": "0004_family_profile_calorie_target_upgrade", "label": "upgrade()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 46, "community_name": "Add calorie_target to family_profile", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "file_type": "code", "degree": 1}, {"id": "0004_family_profile_calorie_target_downgrade", "label": "downgrade()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 46, "community_name": "Add calorie_target to family_profile", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "file_type": "code", "degree": 1}, {"id": "0004_family_profile_calorie_target_rationale_1", "label": "Add calorie_target to family_profile Revision ID: 0004 Revises: 0003 Create Dat", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Add calorie_target to family_profile Revision ID: 0004 Revises: 0003 Create Dat", "community": 46, "community_name": "Add calorie_target to family_profile", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_versions_0001_initial_migration_py", "label": "0001_initial_migration.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "0001_initial_migration.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/alembic/versions/0001_initial_migration.py", "file_type": "code", "degree": 3}, {"id": "0001_initial_migration_upgrade", "label": "upgrade()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/alembic/versions/0001_initial_migration.py", "file_type": "code", "degree": 2}, {"id": "0001_initial_migration_downgrade", "label": "downgrade()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/alembic/versions/0001_initial_migration.py", "file_type": "code", "degree": 1}, {"id": "0001_initial_migration_rationale_1", "label": "Initial migration Revision ID: 0001 Revises: Create Date: 2026-05-04", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Initial migration Revision ID: 0001 Revises: Create Date: 2026-05-04", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/alembic/versions/0001_initial_migration.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_versions_0005_grocery_item_external_id_py", "label": "0005_grocery_item_external_id.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "0005_grocery_item_external_id.py", "community": 47, "community_name": "Add nullable indexed external_id", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "file_type": "code", "degree": 3}, {"id": "0005_grocery_item_external_id_upgrade", "label": "upgrade()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 47, "community_name": "Add nullable indexed external_id", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "file_type": "code", "degree": 1}, {"id": "0005_grocery_item_external_id_downgrade", "label": "downgrade()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 47, "community_name": "Add nullable indexed external_id", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "file_type": "code", "degree": 1}, {"id": "0005_grocery_item_external_id_rationale_1", "label": "Add nullable indexed external_id and source columns to grocery_item. The Swiftl", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Add nullable indexed external_id and source columns to grocery_item. The Swiftl", "community": 47, "community_name": "Add nullable indexed external_id", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_versions_0006_recipe_engine_thin_py", "label": "0006_recipe_engine_thin.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "0006_recipe_engine_thin.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/alembic/versions/0006_recipe_engine_thin.py", "file_type": "code", "degree": 3}, {"id": "0006_recipe_engine_thin_upgrade", "label": "upgrade()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/alembic/versions/0006_recipe_engine_thin.py", "file_type": "code", "degree": 2}, {"id": "0006_recipe_engine_thin_downgrade", "label": "downgrade()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/alembic/versions/0006_recipe_engine_thin.py", "file_type": "code", "degree": 1}, {"id": "0006_recipe_engine_thin_rationale_1", "label": "thin phase 4: ingredient.aliases, recipe.calories_per_serving, ingredient_grocer", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "thin phase 4: ingredient.aliases, recipe.calories_per_serving, ingredient_grocer", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/alembic/versions/0006_recipe_engine_thin.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_versions_0007_seed_recipes_py", "label": "0007_seed_recipes.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "0007_seed_recipes.py", "community": 35, "community_name": "_delete_ingredients", "source_file": "backend/alembic/versions/0007_seed_recipes.py", "file_type": "code", "degree": 7}, {"id": "0007_seed_recipes_upsert_ingredients", "label": "_upsert_ingredients()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_upsert_ingredients()", "community": 35, "community_name": "_delete_ingredients", "source_file": "backend/alembic/versions/0007_seed_recipes.py", "file_type": "code", "degree": 2}, {"id": "0007_seed_recipes_insert_recipes", "label": "_insert_recipes()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_insert_recipes()", "community": 35, "community_name": "_delete_ingredients", "source_file": "backend/alembic/versions/0007_seed_recipes.py", "file_type": "code", "degree": 3}, {"id": "0007_seed_recipes_delete_recipes", "label": "_delete_recipes()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_delete_recipes()", "community": 35, "community_name": "_delete_ingredients", "source_file": "backend/alembic/versions/0007_seed_recipes.py", "file_type": "code", "degree": 2}, {"id": "0007_seed_recipes_delete_ingredients", "label": "_delete_ingredients()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_delete_ingredients()", "community": 35, "community_name": "_delete_ingredients", "source_file": "backend/alembic/versions/0007_seed_recipes.py", "file_type": "code", "degree": 3}, {"id": "0007_seed_recipes_upgrade", "label": "upgrade()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 35, "community_name": "_delete_ingredients", "source_file": "backend/alembic/versions/0007_seed_recipes.py", "file_type": "code", "degree": 3}, {"id": "0007_seed_recipes_downgrade", "label": "downgrade()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 35, "community_name": "_delete_ingredients", "source_file": "backend/alembic/versions/0007_seed_recipes.py", "file_type": "code", "degree": 3}, {"id": "0007_seed_recipes_rationale_1", "label": "seed canonical ingredients (and 30 starter recipes in P4-14) Revision ID: 0007", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "seed canonical ingredients (and 30 starter recipes in P4-14) Revision ID: 0007", "community": 35, "community_name": "_delete_ingredients", "source_file": "backend/alembic/versions/0007_seed_recipes.py", "file_type": "rationale", "degree": 1}, {"id": "0007_seed_recipes_rationale_833", "label": "Best-effort: only remove rows whose name_lower matches one of our seeds. Pre", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Best-effort: only remove rows whose name_lower matches one of our seeds. Pre", "community": 35, "community_name": "_delete_ingredients", "source_file": "backend/alembic/versions/0007_seed_recipes.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_versions_0008_phase5_orchestration_py", "label": "0008_phase5_orchestration.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "0008_phase5_orchestration.py", "community": 48, "community_name": "Phase 5 orchestration: weekly_run", "source_file": "backend/alembic/versions/0008_phase5_orchestration.py", "file_type": "code", "degree": 3}, {"id": "0008_phase5_orchestration_upgrade", "label": "upgrade()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 48, "community_name": "Phase 5 orchestration: weekly_run", "source_file": "backend/alembic/versions/0008_phase5_orchestration.py", "file_type": "code", "degree": 1}, {"id": "0008_phase5_orchestration_downgrade", "label": "downgrade()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 48, "community_name": "Phase 5 orchestration: weekly_run", "source_file": "backend/alembic/versions/0008_phase5_orchestration.py", "file_type": "code", "degree": 1}, {"id": "0008_phase5_orchestration_rationale_1", "label": "Phase 5 orchestration: weekly_run table + pending_approval_policy Revision ID:", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 5 orchestration: weekly_run table + pending_approval_policy Revision ID:", "community": 48, "community_name": "Phase 5 orchestration: weekly_run", "source_file": "backend/alembic/versions/0008_phase5_orchestration.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_versions_0009_phase6_reminded_at_py", "label": "0009_phase6_reminded_at.py", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "0009_phase6_reminded_at.py", "community": 49, "community_name": "Phase 6: add reminded_at", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "file_type": "code", "degree": 3}, {"id": "0009_phase6_reminded_at_upgrade", "label": "upgrade()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 49, "community_name": "Phase 6: add reminded_at", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "file_type": "code", "degree": 1}, {"id": "0009_phase6_reminded_at_downgrade", "label": "downgrade()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 49, "community_name": "Phase 6: add reminded_at", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "file_type": "code", "degree": 1}, {"id": "0009_phase6_reminded_at_rationale_1", "label": "Phase 6: add reminded_at to weekly_run Revision ID: 0009 Revises: 0008 Create D", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 6: add reminded_at to weekly_run Revision ID: 0009 Revises: 0008 Create D", "community": 49, "community_name": "Phase 6: add reminded_at", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "file_type": "rationale", "degree": 1}, {"id": "backend_alembic_versions_0010_auto_llm_source_py", "label": "0010_auto_llm_source.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "0010_auto_llm_source.py", "community": 50, "community_name": "Add auto_llm to ingredient_match_source_enum", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "file_type": "code", "degree": 3}, {"id": "0010_auto_llm_source_upgrade", "label": "upgrade()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "upgrade()", "community": 50, "community_name": "Add auto_llm to ingredient_match_source_enum", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "file_type": "code", "degree": 1}, {"id": "0010_auto_llm_source_downgrade", "label": "downgrade()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "downgrade()", "community": 50, "community_name": "Add auto_llm to ingredient_match_source_enum", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "file_type": "code", "degree": 1}, {"id": "0010_auto_llm_source_rationale_1", "label": "Add auto_llm to ingredient_match_source_enum Revision ID: 0010 Revises: 0009 Cr", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Add auto_llm to ingredient_match_source_enum Revision ID: 0010 Revises: 0009 Cr", "community": 50, "community_name": "Add auto_llm to ingredient_match_source_enum", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_init_py", "label": "__init__.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/tests/__init__.py", "file_type": "code", "degree": 0}, {"id": "backend_tests_test_alembic_py", "label": "test_alembic.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_alembic.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_alembic.py", "file_type": "code", "degree": 2}, {"id": "test_alembic_test_alembic_upgrade_head_roundtrip", "label": "test_alembic_upgrade_head_roundtrip()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_alembic_upgrade_head_roundtrip()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_alembic.py", "file_type": "code", "degree": 2}, {"id": "test_alembic_rationale_1", "label": "Alembic round-trip test. Verifies that ``alembic upgrade head`` followed by ``a", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Alembic round-trip test. Verifies that ``alembic upgrade head`` followed by ``a", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_alembic.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_test_smoke_py", "label": "test_smoke.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_smoke.py", "community": 36, "community_name": "test_router_list_endpoints", "source_file": "backend/tests/test_smoke.py", "file_type": "code", "degree": 5}, {"id": "test_smoke_test_app_imports", "label": "test_app_imports()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_app_imports()", "community": 36, "community_name": "test_router_list_endpoints", "source_file": "backend/tests/test_smoke.py", "file_type": "code", "degree": 1}, {"id": "test_smoke_test_health", "label": "test_health()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_health()", "community": 36, "community_name": "test_router_list_endpoints", "source_file": "backend/tests/test_smoke.py", "file_type": "code", "degree": 1}, {"id": "test_smoke_test_health_db", "label": "test_health_db()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_health_db()", "community": 36, "community_name": "test_router_list_endpoints", "source_file": "backend/tests/test_smoke.py", "file_type": "code", "degree": 1}, {"id": "test_smoke_test_router_list_endpoints", "label": "test_router_list_endpoints()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_router_list_endpoints()", "community": 36, "community_name": "test_router_list_endpoints", "source_file": "backend/tests/test_smoke.py", "file_type": "code", "degree": 2}, {"id": "test_smoke_rationale_1", "label": "Smoke tests: app boots, routers wire up, no import-time crashes. The router-lis", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Smoke tests: app boots, routers wire up, no import-time crashes. The router-lis", "community": 36, "community_name": "test_router_list_endpoints", "source_file": "backend/tests/test_smoke.py", "file_type": "rationale", "degree": 1}, {"id": "test_smoke_rationale_50", "label": "Each canonical GET must respond. 200 (handled), 401 (admin-gated), 404 (hand", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Each canonical GET must respond. 200 (handled), 401 (admin-gated), 404 (hand", "community": 36, "community_name": "test_router_list_endpoints", "source_file": "backend/tests/test_smoke.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_test_auth_py", "label": "test_auth.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "test_auth.py", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "code", "degree": 7}, {"id": "test_auth_reload_settings", "label": "_reload_settings()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_reload_settings()", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "code", "degree": 3}, {"id": "test_auth_test_admin_requires_token", "label": "test_admin_requires_token()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_admin_requires_token()", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "code", "degree": 2}, {"id": "test_auth_test_admin_logs_requires_token", "label": "test_admin_logs_requires_token()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_admin_logs_requires_token()", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "code", "degree": 1}, {"id": "test_auth_test_session_required_for_mutation", "label": "test_session_required_for_mutation()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_session_required_for_mutation()", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "code", "degree": 2}, {"id": "test_auth_test_session_open_for_reads", "label": "test_session_open_for_reads()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_session_open_for_reads()", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "code", "degree": 2}, {"id": "test_auth_test_session_login_logout", "label": "test_session_login_logout()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_session_login_logout()", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "code", "degree": 1}, {"id": "test_auth_rationale_1", "label": "Auth gate tests for R1-B+D. Covers: - /api/admin/* requires bearer token (401 w", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Auth gate tests for R1-B+D. Covers: - /api/admin/* requires bearer token (401 w", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "rationale", "degree": 1}, {"id": "test_auth_rationale_26", "label": "Force ``settings`` to re-read env (test isolation).", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Force ``settings`` to re-read env (test isolation).", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "rationale", "degree": 1}, {"id": "test_auth_rationale_42", "label": "No bearer \u2192 401. Valid bearer \u2192 not 401 (handler runs).", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "No bearer \u2192 401. Valid bearer \u2192 not 401 (handler runs).", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "rationale", "degree": 1}, {"id": "test_auth_rationale_70", "label": "POST /api/profile/members without cookie \u2192 401.", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "POST /api/profile/members without cookie \u2192 401.", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "rationale", "degree": 1}, {"id": "test_auth_rationale_80", "label": "GET /api/profile is NOT auth-gated (reads stay open).", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "GET /api/profile is NOT auth-gated (reads stay open).", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_auth.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_test_scrape_endpoint_py", "label": "test_scrape_endpoint.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_scrape_endpoint.py", "community": 40, "community_name": "test_scrape_returns_202_and_log_id", "source_file": "backend/tests/test_scrape_endpoint.py", "file_type": "code", "degree": 3}, {"id": "test_scrape_endpoint_admin_token", "label": "_admin_token()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_admin_token()", "community": 40, "community_name": "test_scrape_returns_202_and_log_id", "source_file": "backend/tests/test_scrape_endpoint.py", "file_type": "code", "degree": 1}, {"id": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "label": "test_scrape_returns_202_and_log_id()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_scrape_returns_202_and_log_id()", "community": 40, "community_name": "test_scrape_returns_202_and_log_id", "source_file": "backend/tests/test_scrape_endpoint.py", "file_type": "code", "degree": 2}, {"id": "test_scrape_endpoint_rationale_1", "label": "Async scrape endpoint contract. Verifies that ``POST /api/admin/scrape``: - r", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Async scrape endpoint contract. Verifies that ``POST /api/admin/scrape``: - r", "community": 40, "community_name": "test_scrape_returns_202_and_log_id", "source_file": "backend/tests/test_scrape_endpoint.py", "file_type": "rationale", "degree": 1}, {"id": "test_scrape_endpoint_rationale_27", "label": "Endpoint enqueues the scrape and returns 202 + scrape_log_id. We replace th", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Endpoint enqueues the scrape and returns 202 + scrape_log_id. We replace th", "community": 40, "community_name": "test_scrape_returns_202_and_log_id", "source_file": "backend/tests/test_scrape_endpoint.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_test_approval_py", "label": "test_approval.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "test_approval.py", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "code", "degree": 8}, {"id": "test_approval_test_issue_and_verify_token_roundtrip", "label": "test_issue_and_verify_token_roundtrip()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_issue_and_verify_token_roundtrip()", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "code", "degree": 4}, {"id": "test_approval_test_verify_rejects_tampered_token", "label": "test_verify_rejects_tampered_token()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_verify_rejects_tampered_token()", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "code", "degree": 3}, {"id": "test_approval_test_verify_rejects_expired_token", "label": "test_verify_rejects_expired_token()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_verify_rejects_expired_token()", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "code", "degree": 4}, {"id": "test_approval_scenario", "label": "scenario()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "scenario()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_approval.py", "file_type": "code", "degree": 7}, {"id": "test_approval_test_consume_token_single_use", "label": "test_consume_token_single_use()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_consume_token_single_use()", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "code", "degree": 4}, {"id": "test_approval_test_vote_get_renders_html", "label": "test_vote_get_renders_html()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_vote_get_renders_html()", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "code", "degree": 2}, {"id": "test_approval_test_vote_post_records_and_decides", "label": "test_vote_post_records_and_decides()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_vote_post_records_and_decides()", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "code", "degree": 3}, {"id": "test_approval_rationale_1", "label": "R2-B: approval-token + per-voter vote round-trip tests. - Pure unit tests for `", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "R2-B: approval-token + per-voter vote round-trip tests. - Pure unit tests for `", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "rationale", "degree": 1}, {"id": "test_approval_rationale_43", "label": "itsdangerous reads `time.time()` \u2014 patch the time module's `time` attribute", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "itsdangerous reads `time.time()` \u2014 patch the time module's `time` attribute", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "rationale", "degree": 1}, {"id": "test_approval_rationale_75", "label": "Create profile + 2 voters + recipe + plan + item, all in one shot. Uses the", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Create profile + 2 voters + recipe + plan + item, all in one shot. Uses the", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_approval.py", "file_type": "rationale", "degree": 1}, {"id": "test_approval_rationale_208", "label": "First voter approves -> still pending (Bob hasn't voted). Then Bob approves", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "First voter approves -> still pending (Bob hasn't voted). Then Bob approves", "community": 10, "community_name": "issue_token", "source_file": "backend/tests/test_approval.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_test_config_py", "label": "test_config.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_config.py", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_config.py", "file_type": "code", "degree": 2}, {"id": "test_config_test_database_url_required", "label": "test_database_url_required()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_database_url_required()", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_config.py", "file_type": "code", "degree": 3}, {"id": "test_config_rationale_1", "label": "Config fail-fast: importing app.config with DATABASE_URL unset must raise.", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Config fail-fast: importing app.config with DATABASE_URL unset must raise.", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_config.py", "file_type": "rationale", "degree": 1}, {"id": "test_config_rationale_13", "label": "Settings() with empty DATABASE_URL \u2192 RuntimeError at instantiation.", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Settings() with empty DATABASE_URL \u2192 RuntimeError at instantiation.", "community": 20, "community_name": "_reload_settings", "source_file": "backend/tests/test_config.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_test_ingredient_schema_py", "label": "test_ingredient_schema.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_ingredient_schema.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/tests/test_ingredient_schema.py", "file_type": "code", "degree": 2}, {"id": "test_ingredient_schema_test_ingredient_create_normalizes_aliases", "label": "test_ingredient_create_normalizes_aliases()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_ingredient_create_normalizes_aliases()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/tests/test_ingredient_schema.py", "file_type": "code", "degree": 2}, {"id": "test_ingredient_schema_test_ingredient_match_read_round_trip", "label": "test_ingredient_match_read_round_trip()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_ingredient_match_read_round_trip()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/tests/test_ingredient_schema.py", "file_type": "code", "degree": 1}, {"id": "backend_tests_test_recipe_schema_py", "label": "test_recipe_schema.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_recipe_schema.py", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/tests/test_recipe_schema.py", "file_type": "code", "degree": 3}, {"id": "test_recipe_schema_test_recipe_create_requires_canonical_ingredient_ids", "label": "test_recipe_create_requires_canonical_ingredient_ids()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_recipe_create_requires_canonical_ingredient_ids()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/tests/test_recipe_schema.py", "file_type": "code", "degree": 3}, {"id": "test_recipe_schema_test_recipe_create_rejects_empty_ingredients", "label": "test_recipe_create_rejects_empty_ingredients()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_recipe_create_rejects_empty_ingredients()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/tests/test_recipe_schema.py", "file_type": "code", "degree": 2}, {"id": "test_recipe_schema_test_resolve_ingredient_request_round_trip", "label": "test_resolve_ingredient_request_round_trip()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_resolve_ingredient_request_round_trip()", "community": 2, "community_name": "_PinMatchBody", "source_file": "backend/tests/test_recipe_schema.py", "file_type": "code", "degree": 2}, {"id": "backend_tests_test_recipe_api_py", "label": "test_recipe_api.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_recipe_api.py", "community": 37, "community_name": "_admin_headers (37)", "source_file": "backend/tests/test_recipe_api.py", "file_type": "code", "degree": 5}, {"id": "test_recipe_api_admin_headers", "label": "_admin_headers()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_admin_headers()", "community": 37, "community_name": "_admin_headers (37)", "source_file": "backend/tests/test_recipe_api.py", "file_type": "code", "degree": 5}, {"id": "test_recipe_api_new_ingredient", "label": "_new_ingredient()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_new_ingredient()", "community": 37, "community_name": "_admin_headers (37)", "source_file": "backend/tests/test_recipe_api.py", "file_type": "code", "degree": 4}, {"id": "test_recipe_api_test_create_recipe_with_canonical_ingredients", "label": "test_create_recipe_with_canonical_ingredients()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_create_recipe_with_canonical_ingredients()", "community": 37, "community_name": "_admin_headers (37)", "source_file": "backend/tests/test_recipe_api.py", "file_type": "code", "degree": 3}, {"id": "test_recipe_api_test_create_recipe_rejects_unknown_ingredient_id", "label": "test_create_recipe_rejects_unknown_ingredient_id()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_create_recipe_rejects_unknown_ingredient_id()", "community": 37, "community_name": "_admin_headers (37)", "source_file": "backend/tests/test_recipe_api.py", "file_type": "code", "degree": 2}, {"id": "test_recipe_api_test_list_recipes_returns_seeded_data", "label": "test_list_recipes_returns_seeded_data()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_list_recipes_returns_seeded_data()", "community": 37, "community_name": "_admin_headers (37)", "source_file": "backend/tests/test_recipe_api.py", "file_type": "code", "degree": 3}, {"id": "backend_tests_test_resolve_ingredient_py", "label": "test_resolve_ingredient.py", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_resolve_ingredient.py", "community": 41, "community_name": "_admin (41)", "source_file": "backend/tests/test_resolve_ingredient.py", "file_type": "code", "degree": 4}, {"id": "test_resolve_ingredient_admin", "label": "_admin()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_admin()", "community": 41, "community_name": "_admin (41)", "source_file": "backend/tests/test_resolve_ingredient.py", "file_type": "code", "degree": 4}, {"id": "test_resolve_ingredient_seed_ingredient", "label": "_seed_ingredient()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_seed_ingredient()", "community": 41, "community_name": "_admin (41)", "source_file": "backend/tests/test_resolve_ingredient.py", "file_type": "code", "degree": 4}, {"id": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "label": "test_resolve_ingredient_returns_top_three_candidates()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_resolve_ingredient_returns_top_three_candidates()", "community": 41, "community_name": "_admin (41)", "source_file": "backend/tests/test_resolve_ingredient.py", "file_type": "code", "degree": 3}, {"id": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "label": "test_resolve_ingredient_handles_no_unit()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_resolve_ingredient_handles_no_unit()", "community": 41, "community_name": "_admin (41)", "source_file": "backend/tests/test_resolve_ingredient.py", "file_type": "code", "degree": 3}, {"id": "backend_tests_test_matcher_py", "label": "test_matcher.py", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_matcher.py", "community": 51, "community_name": "test_matcher.py", "source_file": "backend/tests/test_matcher.py", "file_type": "code", "degree": 3}, {"id": "test_matcher_test_build_match_pool_includes_aliases", "label": "test_build_match_pool_includes_aliases()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_build_match_pool_includes_aliases()", "community": 51, "community_name": "test_matcher.py", "source_file": "backend/tests/test_matcher.py", "file_type": "code", "degree": 1}, {"id": "test_matcher_test_rank_candidates_top_n_with_threshold", "label": "test_rank_candidates_top_n_with_threshold()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_rank_candidates_top_n_with_threshold()", "community": 51, "community_name": "test_matcher.py", "source_file": "backend/tests/test_matcher.py", "file_type": "code", "degree": 1}, {"id": "test_matcher_test_rank_candidates_drops_below_threshold", "label": "test_rank_candidates_drops_below_threshold()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_rank_candidates_drops_below_threshold()", "community": 51, "community_name": "test_matcher.py", "source_file": "backend/tests/test_matcher.py", "file_type": "code", "degree": 1}, {"id": "backend_tests_test_match_hook_py", "label": "test_match_hook.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_match_hook.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_match_hook.py", "file_type": "code", "degree": 1}, {"id": "test_match_hook_test_run_match_job_persists_top_matches", "label": "test_run_match_job_persists_top_matches()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_run_match_job_persists_top_matches()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_match_hook.py", "file_type": "code", "degree": 5}, {"id": "test_match_hook_rationale_7", "label": "End-to-end: seed Ingredient + GroceryItem rows, run the matcher, verify ingr", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "End-to-end: seed Ingredient + GroceryItem rows, run the matcher, verify ingr", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_match_hook.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_conftest_py", "label": "conftest.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 13.5, "font": {"size": 0, "color": "#ffffff"}, "title": "conftest.py", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 11}, {"id": "conftest_resolve_test_dsn", "label": "_resolve_test_dsn()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_resolve_test_dsn()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 1}, {"id": "conftest_postgres_reachable", "label": "_postgres_reachable()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_postgres_reachable()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 1}, {"id": "conftest_pytest_collection_modifyitems", "label": "pytest_collection_modifyitems()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "pytest_collection_modifyitems()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 2}, {"id": "conftest_pytest_configure", "label": "pytest_configure()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "pytest_configure()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 1}, {"id": "conftest_schema", "label": "_schema()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_schema()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 2}, {"id": "conftest_engine", "label": "_engine()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_engine()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 1}, {"id": "conftest_db", "label": "db()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "db()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 2}, {"id": "conftest_db_session", "label": "db_session()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "db_session()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 2}, {"id": "conftest_client", "label": "client()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "client()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 2}, {"id": "conftest_client_no_db", "label": "client_no_db()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "client_no_db()", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "code", "degree": 2}, {"id": "conftest_rationale_1", "label": "Pytest fixtures for MealPlanner backend. DB strategy ----------- - If env ``TES", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Pytest fixtures for MealPlanner backend. DB strategy ----------- - If env ``TES", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "rationale", "degree": 1}, {"id": "conftest_rationale_73", "label": "Skip postgres-only tests when no live Postgres is available.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Skip postgres-only tests when no live Postgres is available.", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "rationale", "degree": 1}, {"id": "conftest_rationale_143", "label": "Per-test transactional session that rolls back at teardown.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Per-test transactional session that rolls back at teardown.", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "rationale", "degree": 1}, {"id": "conftest_rationale_160", "label": "Plain SessionLocal for tests that need to seed data outside the transactiona", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Plain SessionLocal for tests that need to seed data outside the transactiona", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "rationale", "degree": 1}, {"id": "conftest_rationale_173", "label": "TestClient with get_db overridden to yield the test session.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "TestClient with get_db overridden to yield the test session.", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "rationale", "degree": 1}, {"id": "conftest_rationale_194", "label": "TestClient that does NOT require a live DB \u2014 for pure import/wiring smoke.", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "TestClient that does NOT require a live DB \u2014 for pure import/wiring smoke.", "community": 26, "community_name": "client", "source_file": "backend/tests/conftest.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_test_ingredient_api_py", "label": "test_ingredient_api.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 13.2, "font": {"size": 0, "color": "#ffffff"}, "title": "test_ingredient_api.py", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 10}, {"id": "test_ingredient_api_admin_headers", "label": "_admin_headers()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "_admin_headers()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 8}, {"id": "test_ingredient_api_test_create_ingredient_returns_201_with_id", "label": "test_create_ingredient_returns_201_with_id()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_create_ingredient_returns_201_with_id()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 2}, {"id": "test_ingredient_api_test_create_ingredient_rejects_duplicate_name", "label": "test_create_ingredient_rejects_duplicate_name()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_create_ingredient_rejects_duplicate_name()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 2}, {"id": "test_ingredient_api_test_list_ingredients_supports_search", "label": "test_list_ingredients_supports_search()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_list_ingredients_supports_search()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 2}, {"id": "test_ingredient_api_test_create_ingredient_requires_admin_token", "label": "test_create_ingredient_requires_admin_token()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_create_ingredient_requires_admin_token()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 1}, {"id": "test_ingredient_api_test_update_ingredient_replaces_aliases", "label": "test_update_ingredient_replaces_aliases()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_update_ingredient_replaces_aliases()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 2}, {"id": "test_ingredient_api_seed_grocery", "label": "_seed_grocery()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_seed_grocery()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 5}, {"id": "test_ingredient_api_test_pin_manual_match", "label": "test_pin_manual_match()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_pin_manual_match()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 3}, {"id": "test_ingredient_api_test_unpin_manual_match", "label": "test_unpin_manual_match()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_unpin_manual_match()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 3}, {"id": "test_ingredient_api_test_delete_ingredient_removes_row", "label": "test_delete_ingredient_removes_row()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_delete_ingredient_removes_row()", "community": 34, "community_name": "_admin_headers", "source_file": "backend/tests/test_ingredient_api.py", "file_type": "code", "degree": 2}, {"id": "backend_tests_test_never_suggest_api_py", "label": "test_never_suggest_api.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_never_suggest_api.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_never_suggest_api.py", "file_type": "code", "degree": 5}, {"id": "test_never_suggest_api_admin", "label": "_admin()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_admin()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_never_suggest_api.py", "file_type": "code", "degree": 4}, {"id": "test_never_suggest_api_seed_family", "label": "_seed_family()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_seed_family()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_never_suggest_api.py", "file_type": "code", "degree": 6}, {"id": "test_never_suggest_api_test_block_ingredient", "label": "test_block_ingredient()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_block_ingredient()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_never_suggest_api.py", "file_type": "code", "degree": 3}, {"id": "test_never_suggest_api_test_list_never_suggest_for_family", "label": "test_list_never_suggest_for_family()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_list_never_suggest_for_family()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_never_suggest_api.py", "file_type": "code", "degree": 3}, {"id": "test_never_suggest_api_test_unblock_removes_row", "label": "test_unblock_removes_row()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_unblock_removes_row()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_never_suggest_api.py", "file_type": "code", "degree": 3}, {"id": "backend_tests_test_thin_phase4_smoke_py", "label": "test_thin_phase4_smoke.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_thin_phase4_smoke.py", "community": 38, "community_name": "_admin", "source_file": "backend/tests/test_thin_phase4_smoke.py", "file_type": "code", "degree": 5}, {"id": "test_thin_phase4_smoke_admin", "label": "_admin()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_admin()", "community": 38, "community_name": "_admin", "source_file": "backend/tests/test_thin_phase4_smoke.py", "file_type": "code", "degree": 2}, {"id": "test_thin_phase4_smoke_test_seed_data_present_and_resolvable", "label": "test_seed_data_present_and_resolvable()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_seed_data_present_and_resolvable()", "community": 38, "community_name": "_admin", "source_file": "backend/tests/test_thin_phase4_smoke.py", "file_type": "code", "degree": 1}, {"id": "test_thin_phase4_smoke_test_resolve_against_seeded_ingredients", "label": "test_resolve_against_seeded_ingredients()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_resolve_against_seeded_ingredients()", "community": 38, "community_name": "_admin", "source_file": "backend/tests/test_thin_phase4_smoke.py", "file_type": "code", "degree": 2}, {"id": "test_thin_phase4_smoke_test_match_job_runs_against_seeded_data", "label": "test_match_job_runs_against_seeded_data()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_match_job_runs_against_seeded_data()", "community": 38, "community_name": "_admin", "source_file": "backend/tests/test_thin_phase4_smoke.py", "file_type": "code", "degree": 2}, {"id": "test_thin_phase4_smoke_rationale_1", "label": "End-to-end: ingredient + recipe + match all wired together.", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "End-to-end: ingredient + recipe + match all wired together.", "community": 38, "community_name": "_admin", "source_file": "backend/tests/test_thin_phase4_smoke.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_test_planner_cost_py", "label": "test_planner_cost.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_planner_cost.py", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/tests/test_planner_cost.py", "file_type": "code", "degree": 5}, {"id": "test_planner_cost_ingredient", "label": "_ingredient()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_ingredient()", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/tests/test_planner_cost.py", "file_type": "code", "degree": 4}, {"id": "test_planner_cost_match", "label": "_match()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_match()", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/tests/test_planner_cost.py", "file_type": "code", "degree": 4}, {"id": "test_planner_cost_test_compute_recipe_cost_sums_ingredient_costs", "label": "test_compute_recipe_cost_sums_ingredient_costs()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_compute_recipe_cost_sums_ingredient_costs()", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/tests/test_planner_cost.py", "file_type": "code", "degree": 4}, {"id": "test_planner_cost_test_unmatched_ingredient_zero_cost_and_savings", "label": "test_unmatched_ingredient_zero_cost_and_savings()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_unmatched_ingredient_zero_cost_and_savings()", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/tests/test_planner_cost.py", "file_type": "code", "degree": 3}, {"id": "test_planner_cost_test_pantry_hits_counted", "label": "test_pantry_hits_counted()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_pantry_hits_counted()", "community": 32, "community_name": "compute_recipe_cost", "source_file": "backend/tests/test_planner_cost.py", "file_type": "code", "degree": 4}, {"id": "backend_tests_test_planner_filter_py", "label": "test_planner_filter.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 13.2, "font": {"size": 0, "color": "#ffffff"}, "title": "test_planner_filter.py", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 10}, {"id": "test_planner_filter_recipe", "label": "_recipe()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "_recipe()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 9}, {"id": "test_planner_filter_cost", "label": "_cost()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 13.5, "font": {"size": 0, "color": "#ffffff"}, "title": "_cost()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 11}, {"id": "test_planner_filter_test_filter_blocks_by_never_suggest_ingredient", "label": "test_filter_blocks_by_never_suggest_ingredient()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_filter_blocks_by_never_suggest_ingredient()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 4}, {"id": "test_planner_filter_test_filter_blocks_by_never_suggest_recipe", "label": "test_filter_blocks_by_never_suggest_recipe()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_filter_blocks_by_never_suggest_recipe()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 4}, {"id": "test_planner_filter_test_filter_blocks_by_recency", "label": "test_filter_blocks_by_recency()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_filter_blocks_by_recency()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 4}, {"id": "test_planner_filter_test_filter_blocks_by_calories", "label": "test_filter_blocks_by_calories()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_filter_blocks_by_calories()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 4}, {"id": "test_planner_filter_test_filter_blocks_by_time", "label": "test_filter_blocks_by_time()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_filter_blocks_by_time()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 4}, {"id": "test_planner_filter_test_filter_blocks_by_cost", "label": "test_filter_blocks_by_cost()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_filter_blocks_by_cost()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 4}, {"id": "test_planner_filter_test_filter_passes_when_calorie_target_is_none", "label": "test_filter_passes_when_calorie_target_is_none()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_filter_passes_when_calorie_target_is_none()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 4}, {"id": "test_planner_filter_test_filter_blocks_recipe_with_null_calories_when_target_set", "label": "test_filter_blocks_recipe_with_null_calories_when_target_set()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_filter_blocks_recipe_with_null_calories_when_target_set()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_filter.py", "file_type": "code", "degree": 4}, {"id": "backend_tests_test_planner_score_py", "label": "test_planner_score.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "test_planner_score.py", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 9}, {"id": "test_planner_score_test_time_bonus_capped_at_ideal", "label": "test_time_bonus_capped_at_ideal()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_time_bonus_capped_at_ideal()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 2}, {"id": "test_planner_score_test_time_bonus_decays_to_zero_at_full", "label": "test_time_bonus_decays_to_zero_at_full()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_time_bonus_decays_to_zero_at_full()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 2}, {"id": "test_planner_score_test_time_bonus_linear_midpoint", "label": "test_time_bonus_linear_midpoint()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_time_bonus_linear_midpoint()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 2}, {"id": "test_planner_score_test_recency_bonus_full_when_long_ago", "label": "test_recency_bonus_full_when_long_ago()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_recency_bonus_full_when_long_ago()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 2}, {"id": "test_planner_score_test_recency_bonus_zero_when_just_eligible", "label": "test_recency_bonus_zero_when_just_eligible()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_recency_bonus_zero_when_just_eligible()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 2}, {"id": "test_planner_score_test_recency_bonus_full_when_never_cooked", "label": "test_recency_bonus_full_when_never_cooked()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_recency_bonus_full_when_never_cooked()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 2}, {"id": "test_planner_score_test_normalize_savings_minmax", "label": "test_normalize_savings_minmax()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_normalize_savings_minmax()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 2}, {"id": "test_planner_score_test_normalize_savings_uniform_returns_zeros", "label": "test_normalize_savings_uniform_returns_zeros()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_normalize_savings_uniform_returns_zeros()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 2}, {"id": "test_planner_score_test_score_recipes_orders_by_combined_score", "label": "test_score_recipes_orders_by_combined_score()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_score_recipes_orders_by_combined_score()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_score.py", "file_type": "code", "degree": 3}, {"id": "backend_tests_test_planner_select_py", "label": "test_planner_select.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_planner_select.py", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_select.py", "file_type": "code", "degree": 6}, {"id": "test_planner_select_mk", "label": "_mk()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 12.2, "font": {"size": 0, "color": "#ffffff"}, "title": "_mk()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_select.py", "file_type": "code", "degree": 7}, {"id": "test_planner_select_test_diversity_penalty_zero_when_all_unique", "label": "test_diversity_penalty_zero_when_all_unique()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_diversity_penalty_zero_when_all_unique()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_select.py", "file_type": "code", "degree": 3}, {"id": "test_planner_select_test_diversity_penalty_three_chickens", "label": "test_diversity_penalty_three_chickens()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_diversity_penalty_three_chickens()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_select.py", "file_type": "code", "degree": 3}, {"id": "test_planner_select_test_select_set_picks_diverse_over_homogeneous", "label": "test_select_set_picks_diverse_over_homogeneous()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_select_set_picks_diverse_over_homogeneous()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_select.py", "file_type": "code", "degree": 4}, {"id": "test_planner_select_test_select_set_handles_too_few", "label": "test_select_set_handles_too_few()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_select_set_handles_too_few()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_select.py", "file_type": "code", "degree": 3}, {"id": "test_planner_select_test_select_set_empty_input", "label": "test_select_set_empty_input()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_select_set_empty_input()", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_select.py", "file_type": "code", "degree": 2}, {"id": "test_planner_select_rationale_50", "label": "Three chicken/american (each 0.95) lose to fully-diverse mixed (each 0.90) o", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Three chicken/american (each 0.95) lose to fully-diverse mixed (each 0.90) o", "community": 6, "community_name": "generate_meal_plan", "source_file": "backend/tests/test_planner_select.py", "file_type": "rationale", "degree": 4}, {"id": "backend_tests_test_planner_generate_py", "label": "test_planner_generate.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_planner_generate.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_planner_generate.py", "file_type": "code", "degree": 1}, {"id": "test_planner_generate_test_generate_meal_plan_against_seeded_data", "label": "test_generate_meal_plan_against_seeded_data()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_generate_meal_plan_against_seeded_data()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_planner_generate.py", "file_type": "code", "degree": 6}, {"id": "test_planner_generate_rationale_11", "label": "Smoke test: with the seeded 30 recipes and a seeded grocery scrape, generate", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Smoke test: with the seeded 30 recipes and a seeded grocery scrape, generate", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_planner_generate.py", "file_type": "rationale", "degree": 1}, {"id": "backend_tests_test_meal_plan_generate_api_py", "label": "test_meal_plan_generate_api.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_meal_plan_generate_api.py", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_meal_plan_generate_api.py", "file_type": "code", "degree": 5}, {"id": "test_meal_plan_generate_api_admin", "label": "_admin()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_admin()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_meal_plan_generate_api.py", "file_type": "code", "degree": 3}, {"id": "test_meal_plan_generate_api_family_with_groceries", "label": "family_with_groceries()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "family_with_groceries()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_meal_plan_generate_api.py", "file_type": "code", "degree": 4}, {"id": "test_meal_plan_generate_api_test_generate_endpoint_returns_meal_plan", "label": "test_generate_endpoint_returns_meal_plan()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_generate_endpoint_returns_meal_plan()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_meal_plan_generate_api.py", "file_type": "code", "degree": 3}, {"id": "test_meal_plan_generate_api_test_generate_endpoint_requires_admin_token", "label": "test_generate_endpoint_requires_admin_token()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_generate_endpoint_requires_admin_token()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_meal_plan_generate_api.py", "file_type": "code", "degree": 2}, {"id": "test_meal_plan_generate_api_test_generate_endpoint_returns_404_for_unknown_family", "label": "test_generate_endpoint_returns_404_for_unknown_family()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_generate_endpoint_returns_404_for_unknown_family()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_meal_plan_generate_api.py", "file_type": "code", "degree": 3}, {"id": "backend_tests_test_swiftly_auth_py", "label": "test_swiftly_auth.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 13.2, "font": {"size": 0, "color": "#ffffff"}, "title": "test_swiftly_auth.py", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 10}, {"id": "test_swiftly_auth_clear_cache", "label": "_clear_cache()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_clear_cache()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 2}, {"id": "test_swiftly_auth_b64url", "label": "_b64url()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_b64url()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 2}, {"id": "test_swiftly_auth_make_jwt", "label": "_make_jwt()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_make_jwt()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 5}, {"id": "test_swiftly_auth_config_response", "label": "_config_response()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "_config_response()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 4}, {"id": "test_swiftly_auth_signup_response", "label": "_signup_response()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "_signup_response()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 5}, {"id": "test_swiftly_auth_test_get_token_mints_fresh_when_cache_empty", "label": "test_get_token_mints_fresh_when_cache_empty()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_get_token_mints_fresh_when_cache_empty()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 6}, {"id": "test_swiftly_auth_test_get_token_returns_cached_without_reminting", "label": "test_get_token_returns_cached_without_reminting()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_get_token_returns_cached_without_reminting()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 6}, {"id": "test_swiftly_auth_test_get_token_remints_when_cached_token_near_expiry", "label": "test_get_token_remints_when_cached_token_near_expiry()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_get_token_remints_when_cached_token_near_expiry()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 5}, {"id": "test_swiftly_auth_test_mint_raises_on_firebase_non_200", "label": "test_mint_raises_on_firebase_non_200()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_mint_raises_on_firebase_non_200()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "code", "degree": 6}, {"id": "test_swiftly_auth_rationale_1", "label": "Offline tests for swiftly_auth \u2014 Firebase REST anon-signUp + cache. All tests r", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Offline tests for swiftly_auth \u2014 Firebase REST anon-signUp + cache. All tests r", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "rationale", "degree": 2}, {"id": "test_swiftly_auth_rationale_72", "label": "First call fetches config.json, posts to Firebase, returns idToken.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "First call fetches config.json, posts to Firebase, returns idToken.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "rationale", "degree": 2}, {"id": "test_swiftly_auth_rationale_100", "label": "Second call within the refresh window does NOT re-hit Firebase.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Second call within the refresh window does NOT re-hit Firebase.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "rationale", "degree": 2}, {"id": "test_swiftly_auth_rationale_119", "label": "A cached token within the refresh-margin window triggers a re-mint.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "A cached token within the refresh-margin window triggers a re-mint.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "rationale", "degree": 2}, {"id": "test_swiftly_auth_rationale_141", "label": "Firebase 403/400/etc. surfaces as SwiftlyAuthMintError with status detail.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Firebase 403/400/etc. surfaces as SwiftlyAuthMintError with status detail.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_auth.py", "file_type": "rationale", "degree": 2}, {"id": "backend_tests_test_swiftly_api_py", "label": "test_swiftly_api.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "test_swiftly_api.py", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "code", "degree": 8}, {"id": "test_swiftly_api_test_parse_categories_fixture", "label": "test_parse_categories_fixture()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_parse_categories_fixture()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "code", "degree": 3}, {"id": "test_swiftly_api_test_parse_category_response_fixture", "label": "test_parse_category_response_fixture()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_parse_category_response_fixture()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "code", "degree": 4}, {"id": "test_swiftly_api_test_map_product_returns_none_for_unparseable", "label": "test_map_product_returns_none_for_unparseable()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_map_product_returns_none_for_unparseable()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "code", "degree": 3}, {"id": "test_swiftly_api_mock_response", "label": "_mock_response()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "_mock_response()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "code", "degree": 3}, {"id": "test_swiftly_api_test_swiftly_auth_error_on_401_from_api", "label": "test_swiftly_auth_error_on_401_from_api()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_swiftly_auth_error_on_401_from_api()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "code", "degree": 6}, {"id": "test_swiftly_api_test_fetch_category_mints_token_when_none_pinned", "label": "test_fetch_category_mints_token_when_none_pinned()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_fetch_category_mints_token_when_none_pinned()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "code", "degree": 5}, {"id": "test_swiftly_api_test_background_runner_writes_failed_with_token_message", "label": "test_background_runner_writes_failed_with_token_message()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_background_runner_writes_failed_with_token_message()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "code", "degree": 4}, {"id": "test_swiftly_api_rationale_1", "label": "Offline tests for the Swiftly product-API client (R3-0). All tests run against", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "Offline tests for the Swiftly product-API client (R3-0). All tests run against", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "rationale", "degree": 3}, {"id": "test_swiftly_api_rationale_41", "label": "Parser returns >=10 distinct API slugs from the captured page.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "Parser returns >=10 distinct API slugs from the captured page.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "rationale", "degree": 3}, {"id": "test_swiftly_api_rationale_58", "label": "Parser returns >=10 product dicts each with the mapped fields populated.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "Parser returns >=10 product dicts each with the mapped fields populated.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "rationale", "degree": 3}, {"id": "test_swiftly_api_rationale_108", "label": "Products with no name AND no parseable price are dropped.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "Products with no name AND no parseable price are dropped.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "rationale", "degree": 3}, {"id": "test_swiftly_api_rationale_136", "label": "A 401 from the API host raises SwiftlyAuthError before raise_for_status.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "A 401 from the API host raises SwiftlyAuthError before raise_for_status.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "rationale", "degree": 3}, {"id": "test_swiftly_api_rationale_147", "label": "With no explicit bearer_token, fetch_category calls swiftly_auth.get_token()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "With no explicit bearer_token, fetch_category calls swiftly_auth.get_token()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "rationale", "degree": 1}, {"id": "test_swiftly_api_rationale_172", "label": "A 401 during the background scrape lands in ScrapeLog as FAILED + message.", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "A 401 during the background scrape lands in ScrapeLog as FAILED + message.", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "backend/tests/test_swiftly_api.py", "file_type": "rationale", "degree": 3}, {"id": "backend_tests_test_email_backend_py", "label": "test_email_backend.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_email_backend.py", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_email_backend.py", "file_type": "code", "degree": 3}, {"id": "test_email_backend_test_sendgrid_send_calls_api", "label": "test_sendgrid_send_calls_api()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_sendgrid_send_calls_api()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_email_backend.py", "file_type": "code", "degree": 3}, {"id": "test_email_backend_test_sendgrid_raises_on_4xx", "label": "test_sendgrid_raises_on_4xx()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_sendgrid_raises_on_4xx()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_email_backend.py", "file_type": "code", "degree": 3}, {"id": "test_email_backend_rationale_1", "label": "Unit tests for SendGridEmailBackend \u2014 no Postgres needed.", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Unit tests for SendGridEmailBackend \u2014 no Postgres needed.", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_email_backend.py", "file_type": "rationale", "degree": 2}, {"id": "backend_tests_test_orchestrator_py", "label": "test_orchestrator.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 23.3, "font": {"size": 12, "color": "#ffffff"}, "title": "test_orchestrator.py", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 42}, {"id": "test_orchestrator_family", "label": "family()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "family()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_member", "label": "member()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "member()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_weekly_run", "label": "weekly_run()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "weekly_run()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_weekly_run_scraped", "label": "weekly_run_scraped()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "weekly_run_scraped()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_weekly_run_generated", "label": "weekly_run_generated()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "weekly_run_generated()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_meal_plan", "label": "meal_plan()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "meal_plan()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_pending_item", "label": "pending_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "pending_item()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 3}, {"id": "test_orchestrator_weekly_run_emailed", "label": "weekly_run_emailed()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "weekly_run_emailed()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_weekly_run_reminded", "label": "weekly_run_reminded()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "weekly_run_reminded()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_send_admin_alert_noop_when_email_unset", "label": "test_send_admin_alert_noop_when_email_unset()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_send_admin_alert_noop_when_email_unset()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_send_admin_alert_calls_backend", "label": "test_send_admin_alert_calls_backend()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_send_admin_alert_calls_backend()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_scrape_idempotent", "label": "test_step_scrape_idempotent()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_scrape_idempotent()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_scrape_success", "label": "test_step_scrape_success()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_scrape_success()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_scrape_both_fail_marks_stale", "label": "test_step_scrape_both_fail_marks_stale()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_scrape_both_fail_marks_stale()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_generate_idempotent", "label": "test_step_generate_idempotent()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_generate_idempotent()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_generate_creates_plan", "label": "test_step_generate_creates_plan()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_generate_creates_plan()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 3}, {"id": "test_orchestrator_test_step_generate_records_error_on_failure", "label": "test_step_generate_records_error_on_failure()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_generate_records_error_on_failure()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_email_idempotent", "label": "test_step_email_idempotent()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_email_idempotent()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_email_sends_per_member", "label": "test_step_email_sends_per_member()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_email_sends_per_member()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 3}, {"id": "test_orchestrator_test_step_email_stale_banner", "label": "test_step_email_stale_banner()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_email_stale_banner()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_email_escapes_recipe_name", "label": "test_step_email_escapes_recipe_name()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_email_escapes_recipe_name()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_reminder_idempotent", "label": "test_step_reminder_idempotent()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_reminder_idempotent()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_reminder_skips_when_not_emailed", "label": "test_step_reminder_skips_when_not_emailed()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_reminder_skips_when_not_emailed()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_reminder_sends_to_non_voter", "label": "test_step_reminder_sends_to_non_voter()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_reminder_sends_to_non_voter()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_reminder_skips_voter", "label": "test_step_reminder_skips_voter()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_reminder_skips_voter()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 3}, {"id": "test_orchestrator_test_step_reminder_no_sends_when_all_voted", "label": "test_step_reminder_no_sends_when_all_voted()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_reminder_no_sends_when_all_voted()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 3}, {"id": "test_orchestrator_test_step_deadline_idempotent", "label": "test_step_deadline_idempotent()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_deadline_idempotent()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_deadline_resolves_pending_to_approved", "label": "test_step_deadline_resolves_pending_to_approved()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_deadline_resolves_pending_to_approved()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_deadline_resolves_pending_to_denied", "label": "test_step_deadline_resolves_pending_to_denied()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_deadline_resolves_pending_to_denied()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_weekly_run_deadline_passed", "label": "weekly_run_deadline_passed()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "weekly_run_deadline_passed()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_approved_item", "label": "approved_item()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "approved_item()", "community": 0, "community_name": "MealPlanItem", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 3}, {"id": "test_orchestrator_test_step_finalize_idempotent", "label": "test_step_finalize_idempotent()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_finalize_idempotent()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_finalize_sends_shopping_list", "label": "test_step_finalize_sends_shopping_list()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_finalize_sends_shopping_list()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_step_finalize_no_approved_sends_empty_message", "label": "test_step_finalize_no_approved_sends_empty_message()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_step_finalize_no_approved_sends_empty_message()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_run_step_upserts_weekly_run", "label": "test_run_step_upserts_weekly_run()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_run_step_upserts_weekly_run()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_run_step_invalid_raises", "label": "test_run_step_invalid_raises()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_run_step_invalid_raises()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_test_run_week_calls_all_steps", "label": "test_run_week_calls_all_steps()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "test_run_week_calls_all_steps()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 2}, {"id": "test_orchestrator_admin_client", "label": "admin_client()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "admin_client()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 1}, {"id": "test_orchestrator_test_orchestrate_status_returns_list", "label": "test_orchestrate_status_returns_list()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_orchestrate_status_returns_list()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 1}, {"id": "test_orchestrator_test_orchestrate_step_invalid_returns_400", "label": "test_orchestrate_step_invalid_returns_400()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_orchestrate_step_invalid_returns_400()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 1}, {"id": "test_orchestrator_test_orchestrate_run_week_returns_202", "label": "test_orchestrate_run_week_returns_202()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "test_orchestrate_run_week_returns_202()", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "code", "degree": 1}, {"id": "test_orchestrator_rationale_1", "label": "Tests for the Phase 5 weekly orchestration.", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Tests for the Phase 5 weekly orchestration.", "community": 5, "community_name": "step_reminder", "source_file": "backend/tests/test_orchestrator.py", "file_type": "rationale", "degree": 2}, {"id": "frontend_vite_config_ts", "label": "vite.config.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "vite.config.ts", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/vite.config.ts", "file_type": "code", "degree": 0}, {"id": "frontend_tailwind_config_js", "label": "tailwind.config.js", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "tailwind.config.js", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/tailwind.config.js", "file_type": "code", "degree": 0}, {"id": "frontend_postcss_config_js", "label": "postcss.config.js", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "postcss.config.js", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/postcss.config.js", "file_type": "code", "degree": 0}, {"id": "frontend_src_main_tsx", "label": "main.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "main.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/main.tsx", "file_type": "code", "degree": 0}, {"id": "frontend_src_vite_env_d_ts", "label": "vite-env.d.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "vite-env.d.ts", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/vite-env.d.ts", "file_type": "code", "degree": 0}, {"id": "frontend_src_app_tsx", "label": "App.tsx", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "App.tsx", "community": 54, "community_name": "isActive", "source_file": "frontend/src/App.tsx", "file_type": "code", "degree": 2}, {"id": "app_isactive", "label": "isActive()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "isActive()", "community": 54, "community_name": "isActive", "source_file": "frontend/src/App.tsx", "file_type": "code", "degree": 2}, {"id": "app_linkclass", "label": "linkClass()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "linkClass()", "community": 54, "community_name": "isActive", "source_file": "frontend/src/App.tsx", "file_type": "code", "degree": 2}, {"id": "frontend_src_components_errorboundary_tsx", "label": "ErrorBoundary.tsx", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "ErrorBoundary.tsx", "community": 55, "community_name": "ErrorBoundary.tsx", "source_file": "frontend/src/components/ErrorBoundary.tsx", "file_type": "code", "degree": 2}, {"id": "errorboundary_getderivedstatefromerror", "label": "getDerivedStateFromError()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "getDerivedStateFromError()", "community": 55, "community_name": "ErrorBoundary.tsx", "source_file": "frontend/src/components/ErrorBoundary.tsx", "file_type": "code", "degree": 1}, {"id": "errorboundary_componentdidcatch", "label": "componentDidCatch()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "componentDidCatch()", "community": 55, "community_name": "ErrorBoundary.tsx", "source_file": "frontend/src/components/ErrorBoundary.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_components_ui_button_tsx", "label": "Button.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Button.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Button.tsx", "file_type": "code", "degree": 1}, {"id": "button_button", "label": "Button()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Button()", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Button.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_components_ui_badge_tsx", "label": "Badge.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Badge.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Badge.tsx", "file_type": "code", "degree": 1}, {"id": "badge_badge", "label": "Badge()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Badge()", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Badge.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_components_ui_card_tsx", "label": "Card.tsx", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Card.tsx", "community": 42, "community_name": "Card.tsx", "source_file": "frontend/src/components/ui/Card.tsx", "file_type": "code", "degree": 4}, {"id": "card_card", "label": "Card()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Card()", "community": 42, "community_name": "Card.tsx", "source_file": "frontend/src/components/ui/Card.tsx", "file_type": "code", "degree": 1}, {"id": "card_cardheader", "label": "CardHeader()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "CardHeader()", "community": 42, "community_name": "Card.tsx", "source_file": "frontend/src/components/ui/Card.tsx", "file_type": "code", "degree": 1}, {"id": "card_cardbody", "label": "CardBody()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "CardBody()", "community": 42, "community_name": "Card.tsx", "source_file": "frontend/src/components/ui/Card.tsx", "file_type": "code", "degree": 1}, {"id": "card_cardfooter", "label": "CardFooter()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "CardFooter()", "community": 42, "community_name": "Card.tsx", "source_file": "frontend/src/components/ui/Card.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_components_ui_input_tsx", "label": "Input.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Input.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Input.tsx", "file_type": "code", "degree": 1}, {"id": "input_cn", "label": "cn()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "cn()", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Input.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_components_ui_emptystate_tsx", "label": "EmptyState.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "EmptyState.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/EmptyState.tsx", "file_type": "code", "degree": 0}, {"id": "frontend_src_components_ui_skeleton_tsx", "label": "Skeleton.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "Skeleton.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Skeleton.tsx", "file_type": "code", "degree": 0}, {"id": "frontend_src_components_ui_loadingspinner_tsx", "label": "LoadingSpinner.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "LoadingSpinner.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/LoadingSpinner.tsx", "file_type": "code", "degree": 1}, {"id": "loadingspinner_loadingspinner", "label": "LoadingSpinner()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "LoadingSpinner()", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/LoadingSpinner.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_components_ui_select_tsx", "label": "Select.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "Select.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Select.tsx", "file_type": "code", "degree": 0}, {"id": "frontend_src_components_ui_textarea_tsx", "label": "Textarea.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Textarea.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Textarea.tsx", "file_type": "code", "degree": 1}, {"id": "textarea_cn", "label": "cn()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "cn()", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/components/ui/Textarea.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_pages_dashboard_tsx", "label": "Dashboard.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Dashboard.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/pages/Dashboard.tsx", "file_type": "code", "degree": 1}, {"id": "dashboard_handlesend", "label": "handleSend()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "handleSend()", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/pages/Dashboard.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_pages_mealdetail_tsx", "label": "MealDetail.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "MealDetail.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/pages/MealDetail.tsx", "file_type": "code", "degree": 0}, {"id": "frontend_src_pages_pantry_tsx", "label": "Pantry.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Pantry.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/pages/Pantry.tsx", "file_type": "code", "degree": 1}, {"id": "pantry_handleadd", "label": "handleAdd()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "handleAdd()", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/pages/Pantry.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_pages_shoppinglist_tsx", "label": "ShoppingList.tsx", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "ShoppingList.tsx", "community": 39, "community_name": "ShoppingList.tsx", "source_file": "frontend/src/pages/ShoppingList.tsx", "file_type": "code", "degree": 5}, {"id": "shoppinglist_shoppinglistskeleton", "label": "ShoppingListSkeleton()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "ShoppingListSkeleton()", "community": 39, "community_name": "ShoppingList.tsx", "source_file": "frontend/src/pages/ShoppingList.tsx", "file_type": "code", "degree": 1}, {"id": "shoppinglist_skeletoncard", "label": "SkeletonCard()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "SkeletonCard()", "community": 39, "community_name": "ShoppingList.tsx", "source_file": "frontend/src/pages/ShoppingList.tsx", "file_type": "code", "degree": 1}, {"id": "shoppinglist_storagekey", "label": "storageKey()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "storageKey()", "community": 39, "community_name": "ShoppingList.tsx", "source_file": "frontend/src/pages/ShoppingList.tsx", "file_type": "code", "degree": 1}, {"id": "shoppinglist_toggle", "label": "toggle()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "toggle()", "community": 39, "community_name": "ShoppingList.tsx", "source_file": "frontend/src/pages/ShoppingList.tsx", "file_type": "code", "degree": 1}, {"id": "shoppinglist_clearall", "label": "clearAll()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "clearAll()", "community": 39, "community_name": "ShoppingList.tsx", "source_file": "frontend/src/pages/ShoppingList.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_pages_login_tsx", "label": "Login.tsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Login.tsx", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/pages/Login.tsx", "file_type": "code", "degree": 1}, {"id": "login_login", "label": "Login()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Login()", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/pages/Login.tsx", "file_type": "code", "degree": 1}, {"id": "frontend_src_api_index_ts", "label": "index.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/api/index.ts", "file_type": "code", "degree": 0}, {"id": "frontend_src_types_index_ts", "label": "index.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/types/index.ts", "file_type": "code", "degree": 0}, {"id": "frontend_src_lib_utils_ts", "label": "utils.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "utils.ts", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/lib/utils.ts", "file_type": "code", "degree": 1}, {"id": "utils_cn", "label": "cn()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "cn()", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/lib/utils.ts", "file_type": "code", "degree": 1}, {"id": "frontend_src_lib_toast_ts", "label": "toast.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "toast.ts", "community": 8, "community_name": "APScheduler entry point for", "source_file": "frontend/src/lib/toast.ts", "file_type": "code", "degree": 0}, {"id": "scripts_spike_lucky_scrape_py", "label": "spike_lucky_scrape.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "spike_lucky_scrape.py", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "scripts/spike_lucky_scrape.py", "file_type": "code", "degree": 2}, {"id": "spike_lucky_scrape_main", "label": "main()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "main()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "scripts/spike_lucky_scrape.py", "file_type": "code", "degree": 3}, {"id": "spike_lucky_scrape_rationale_1", "label": "R2-A live-scrape spike for Lucky California weekly ad. Performs ONE live fetch", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "R2-A live-scrape spike for Lucky California weekly ad. Performs ONE live fetch", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "scripts/spike_lucky_scrape.py", "file_type": "rationale", "degree": 2}, {"id": "scripts_send_test_approval_py", "label": "send_test_approval.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "send_test_approval.py", "community": 0, "community_name": "MealPlanItem", "source_file": "scripts/send_test_approval.py", "file_type": "code", "degree": 1}, {"id": "send_test_approval_main", "label": "main()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 12.8, "font": {"size": 0, "color": "#ffffff"}, "title": "main()", "community": 0, "community_name": "MealPlanItem", "source_file": "scripts/send_test_approval.py", "file_type": "code", "degree": 9}, {"id": "scripts_spike_swiftly_ingest_py", "label": "spike_swiftly_ingest.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "spike_swiftly_ingest.py", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "scripts/spike_swiftly_ingest.py", "file_type": "code", "degree": 2}, {"id": "spike_swiftly_ingest_main", "label": "main()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 12.5, "font": {"size": 0, "color": "#ffffff"}, "title": "main()", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "scripts/spike_swiftly_ingest.py", "file_type": "code", "degree": 8}, {"id": "spike_swiftly_ingest_rationale_1", "label": "Live spike for the Swiftly product API (R3-0, ad-hoc admin tool). Usage: py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "Live spike for the Swiftly product API (R3-0, ad-hoc admin tool). Usage: py", "community": 4, "community_name": "SwiftlyAuthMintError", "source_file": "scripts/spike_swiftly_ingest.py", "file_type": "rationale", "degree": 3}, {"id": "scripts_seed_family_py", "label": "seed_family.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "seed_family.py", "community": 8, "community_name": "APScheduler entry point for", "source_file": "scripts/seed_family.py", "file_type": "code", "degree": 0}, {"id": "scripts_enrich_recipes_spoonacular_py", "label": "enrich_recipes_spoonacular.py", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "enrich_recipes_spoonacular.py", "community": 52, "community_name": "main", "source_file": "scripts/enrich_recipes_spoonacular.py", "file_type": "code", "degree": 3}, {"id": "enrich_recipes_spoonacular_strip_html", "label": "strip_html()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "strip_html()", "community": 52, "community_name": "main", "source_file": "scripts/enrich_recipes_spoonacular.py", "file_type": "code", "degree": 2}, {"id": "enrich_recipes_spoonacular_search_recipe", "label": "search_recipe()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "search_recipe()", "community": 52, "community_name": "main", "source_file": "scripts/enrich_recipes_spoonacular.py", "file_type": "code", "degree": 2}, {"id": "enrich_recipes_spoonacular_main", "label": "main()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.9, "font": {"size": 0, "color": "#ffffff"}, "title": "main()", "community": 52, "community_name": "main", "source_file": "scripts/enrich_recipes_spoonacular.py", "file_type": "code", "degree": 3}, {"id": "meal_planner_plan_md", "label": "meal-planner-plan.md", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 14.1, "font": {"size": 0, "color": "#ffffff"}, "title": "meal-planner-plan.md", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 13}, {"id": "meal_planner_plan_md_meal_planner_system", "label": "Meal Planner System", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Meal Planner System", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_goal", "label": "Goal", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Goal", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_architecture", "label": "Architecture", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Architecture", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_tech_stack", "label": "Tech Stack", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Tech Stack", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_project_structure", "label": "Project Structure", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Project Structure", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_tasks", "label": "Tasks", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Tasks", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_phase_1_foundation", "label": "Phase 1: Foundation", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 1: Foundation", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_phase_2_scraping", "label": "Phase 2: Scraping", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 2: Scraping", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_phase_3_recipe_meal_engine", "label": "Phase 3: Recipe & Meal Engine", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 3: Recipe & Meal Engine", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_phase_4_notifications_approval", "label": "Phase 4: Notifications & Approval", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 4: Notifications & Approval", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_phase_5_shopping_list_ui", "label": "Phase 5: Shopping List & UI", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 5: Shopping List & UI", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_phase_6_polish", "label": "Phase 6: Polish", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 6: Polish", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "meal_planner_plan_md_done_when", "label": "Done When", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Done When", "community": 28, "community_name": "Done When", "source_file": "meal-planner-plan.md", "file_type": "document", "degree": 1}, {"id": "readme_md", "label": "README.md", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 15.4, "font": {"size": 12, "color": "#ffffff"}, "title": "README.md", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 17}, {"id": "readme_md_meal_planner", "label": "Meal Planner", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Meal Planner", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_background", "label": "Background", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Background", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_features", "label": "Features", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Features", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_architecture", "label": "Architecture", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Architecture", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_documentation", "label": "Documentation", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Documentation", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_quick_start", "label": "Quick Start", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Quick Start", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_clone_and_start", "label": "Clone and start", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Clone and start", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_view_logs", "label": "View logs", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "View logs", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_stop", "label": "Stop", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Stop", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_family_profile", "label": "Family Profile", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Family Profile", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_approval_workflow", "label": "Approval Workflow", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Approval Workflow", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "readme_md_tech_stack", "label": "Tech Stack", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Tech Stack", "community": 7, "community_name": "Meal Planner - Database", "source_file": "README.md", "file_type": "document", "degree": 1}, {"id": "claude_md", "label": "CLAUDE.md", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 14.1, "font": {"size": 0, "color": "#ffffff"}, "title": "CLAUDE.md", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 13}, {"id": "claude_md_context_mode_mandatory_routing_rules", "label": "context-mode \u2014 MANDATORY routing rules", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "context-mode \u2014 MANDATORY routing rules", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_blocked_commands_do_not_attempt_these", "label": "BLOCKED commands \u2014 do NOT attempt these", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "BLOCKED commands \u2014 do NOT attempt these", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_curl_wget_blocked", "label": "curl / wget \u2014 BLOCKED", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "curl / wget \u2014 BLOCKED", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_inline_http_blocked", "label": "Inline HTTP \u2014 BLOCKED", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Inline HTTP \u2014 BLOCKED", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_webfetch_blocked", "label": "WebFetch \u2014 BLOCKED", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "WebFetch \u2014 BLOCKED", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_redirected_tools_use_sandbox_equivalents", "label": "REDIRECTED tools \u2014 use sandbox equivalents", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "REDIRECTED tools \u2014 use sandbox equivalents", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_bash_20_lines_output", "label": "Bash (>20 lines output)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Bash (>20 lines output)", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_read_for_analysis", "label": "Read (for analysis)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Read (for analysis)", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_grep_large_results", "label": "Grep (large results)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Grep (large results)", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_tool_selection_hierarchy", "label": "Tool selection hierarchy", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Tool selection hierarchy", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_subagent_routing", "label": "Subagent routing", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Subagent routing", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_output_constraints", "label": "Output constraints", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Output constraints", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "claude_md_ctx_commands", "label": "ctx commands", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "ctx commands", "community": 29, "community_name": "Bash (>20 lines output)", "source_file": "CLAUDE.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md", "label": "SPEC.md", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 20.1, "font": {"size": 12, "color": "#ffffff"}, "title": "SPEC.md", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 32}, {"id": "docs_spec_md_meal_planner_project_specification", "label": "Meal Planner - Project Specification", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Meal Planner - Project Specification", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_1_overview", "label": "1. Overview", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Overview", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_2_problem_statement", "label": "2. Problem Statement", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. Problem Statement", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_3_goals", "label": "3. Goals", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Goals", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_primary_goals", "label": "Primary Goals", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Primary Goals", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_secondary_goals", "label": "Secondary Goals", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Secondary Goals", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_4_non_goals_out_of_scope", "label": "4. Non-Goals (Out of Scope)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4. Non-Goals (Out of Scope)", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_5_user_stories", "label": "5. User Stories", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5. User Stories", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_as_a_family_member_i_can", "label": "As a family member, I can:", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "As a family member, I can:", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_as_the_system_administrator_i_can", "label": "As the system administrator, I can:", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "As the system administrator, I can:", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_6_family_profile", "label": "6. Family Profile", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6. Family Profile", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_household", "label": "Household", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Household", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_family_members", "label": "Family Members", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Family Members", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_dietary_constraints", "label": "Dietary Constraints", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Dietary Constraints", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_preference_signals", "label": "Preference Signals", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Preference Signals", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_7_approval_workflow", "label": "7. Approval Workflow", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7. Approval Workflow", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_weekly_flow", "label": "Weekly Flow", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Weekly Flow", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_approval_token_security", "label": "Approval Token Security", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Approval Token Security", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_8_technical_constraints", "label": "8. Technical Constraints", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8. Technical Constraints", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_self_hosting_requirements", "label": "Self-Hosting Requirements", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Self-Hosting Requirements", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_authentication_authorization", "label": "Authentication & Authorization", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Authentication & Authorization", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_lucky_california_integration", "label": "Lucky California Integration", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Lucky California Integration", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_email", "label": "Email", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Email", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_external_dependencies", "label": "External Dependencies", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "External Dependencies", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_9_accessibility_wcag_2_1_aa", "label": "9. Accessibility (WCAG 2.1 AA)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "9. Accessibility (WCAG 2.1 AA)", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_web_ui", "label": "Web UI", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Web UI", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_10_data_retention", "label": "10. Data Retention", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "10. Data Retention", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_stored_data", "label": "Stored Data", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Stored Data", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_retention_period", "label": "Retention Period", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Retention Period", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_11_success_metrics", "label": "11. Success Metrics", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "11. Success Metrics", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_spec_md_12_future_considerations", "label": "12. Future Considerations", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "12. Future Considerations", "community": 12, "community_name": "Approval Token Security", "source_file": "docs/SPEC.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md", "label": "ARCHITECTURE.md", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 20.1, "font": {"size": 12, "color": "#ffffff"}, "title": "ARCHITECTURE.md", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 32}, {"id": "docs_architecture_md_meal_planner_architecture", "label": "Meal Planner - Architecture", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Meal Planner - Architecture", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_1_system_overview", "label": "1. System Overview", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. System Overview", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_2_component_descriptions", "label": "2. Component Descriptions", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. Component Descriptions", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_2_1_scraper_service", "label": "2.1 Scraper Service", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.1 Scraper Service", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_2_2_recipe_engine", "label": "2.2 Recipe Engine", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.2 Recipe Engine", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_2_3_meal_planner_service", "label": "2.3 Meal Planner Service", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.3 Meal Planner Service", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_2_4_notification_service", "label": "2.4 Notification Service", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.4 Notification Service", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_2_5_feedback_service", "label": "2.5 Feedback Service", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.5 Feedback Service", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_2_6_web_ui_react_tailwind", "label": "2.6 Web UI (React + Tailwind)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.6 Web UI (React + Tailwind)", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_3_data_architecture", "label": "3. Data Architecture", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Data Architecture", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_3_1_postgresql_schema_overview", "label": "3.1 PostgreSQL Schema Overview", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.1 PostgreSQL Schema Overview", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_3_2_key_relationships", "label": "3.2 Key Relationships", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.2 Key Relationships", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_4_api_design", "label": "4. API Design", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4. API Design", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_4_1_core_endpoints", "label": "4.1 Core Endpoints", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.1 Core Endpoints", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_4_2_email_approval_links", "label": "4.2 Email Approval Links", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.2 Email Approval Links", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_5_deployment_architecture", "label": "5. Deployment Architecture", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5. Deployment Architecture", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_5_1_docker_compose_services", "label": "5.1 Docker Compose Services", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5.1 Docker Compose Services", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_5_2_reverse_proxy_nginx", "label": "5.2 Reverse Proxy (Nginx)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5.2 Reverse Proxy (Nginx)", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_5_3_remote_access_security", "label": "5.3 Remote Access Security", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5.3 Remote Access Security", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_6_image_strategy", "label": "6. Image Strategy", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6. Image Strategy", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_6_1_primary_scraped_images", "label": "6.1 Primary: Scraped Images", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.1 Primary: Scraped Images", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_6_2_fallback_ai_generation", "label": "6.2 Fallback: AI Generation", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.2 Fallback: AI Generation", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_6_3_email_image_handling", "label": "6.3 Email Image Handling", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.3 Email Image Handling", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_7_error_handling_strategy", "label": "7. Error Handling Strategy", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7. Error Handling Strategy", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_7_1_scraper_failures", "label": "7.1 Scraper Failures", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7.1 Scraper Failures", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_7_2_email_failures", "label": "7.2 Email Failures", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7.2 Email Failures", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_7_3_database_failures", "label": "7.3 Database Failures", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7.3 Database Failures", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_8_logging_monitoring", "label": "8. Logging & Monitoring", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8. Logging & Monitoring", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_8_1_log_categories", "label": "8.1 Log Categories", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8.1 Log Categories", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_8_2_log_storage", "label": "8.2 Log Storage", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8.2 Log Storage", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_architecture_md_8_3_monitoring_future", "label": "8.3 Monitoring (Future)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8.3 Monitoring (Future)", "community": 13, "community_name": "Meal Planner - Architecture", "source_file": "docs/ARCHITECTURE.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md", "label": "database-schema.md", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 19.5, "font": {"size": 12, "color": "#ffffff"}, "title": "database-schema.md", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 30}, {"id": "docs_database_schema_md_meal_planner_database_schema", "label": "Meal Planner - Database Schema", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Meal Planner - Database Schema", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_1_schema_overview", "label": "1. Schema Overview", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Schema Overview", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_2_enums", "label": "2. Enums", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. Enums", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_tables", "label": "3. Tables", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Tables", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_1_family_profile", "label": "3.1 `family_profile`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.1 `family_profile`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_2_family_member", "label": "3.2 `family_member`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.2 `family_member`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_3_ingredient", "label": "3.3 `ingredient`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.3 `ingredient`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_4_recipe", "label": "3.4 `recipe`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.4 `recipe`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_5_meal_plan", "label": "3.5 `meal_plan`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.5 `meal_plan`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_6_meal_plan_item", "label": "3.6 `meal_plan_item`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.6 `meal_plan_item`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_7_meal_plan_vote", "label": "3.7 `meal_plan_vote`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.7 `meal_plan_vote`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_8_approval_token", "label": "3.8 `approval_token`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.8 `approval_token`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_9_home_pantry", "label": "3.9 `home_pantry`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.9 `home_pantry`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_10_feedback", "label": "3.10 `feedback`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.10 `feedback`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_11_never_suggest", "label": "3.11 `never_suggest`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.11 `never_suggest`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_12_grocery_item", "label": "3.12 `grocery_item`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.12 `grocery_item`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_13_scrape_log", "label": "3.13 `scrape_log`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.13 `scrape_log`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_3_14_email_log", "label": "3.14 `email_log`", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.14 `email_log`", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_4_indexes", "label": "4. Indexes", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4. Indexes", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_4_1_primary_indexes", "label": "4.1 Primary Indexes", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.1 Primary Indexes", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_4_2_foreign_key_indexes", "label": "4.2 Foreign Key Indexes", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.2 Foreign Key Indexes", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_4_3_full_text_search_indexes", "label": "4.3 Full-Text Search Indexes", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.3 Full-Text Search Indexes", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_5_day_of_week_convention", "label": "5. Day of Week Convention", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5. Day of Week Convention", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_6_data_migration_strategy", "label": "6. Data Migration Strategy", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6. Data Migration Strategy", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_6_1_initial_schema", "label": "6.1 Initial Schema", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.1 Initial Schema", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_6_2_migration_policy", "label": "6.2 Migration Policy", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.2 Migration Policy", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_6_3_seed_data", "label": "6.3 Seed Data", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.3 Seed Data", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_7_data_retention", "label": "7. Data Retention", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7. Data Retention", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_database_schema_md_8_row_level_security_future", "label": "8. Row-Level Security (Future)", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8. Row-Level Security (Future)", "community": 7, "community_name": "Meal Planner - Database", "source_file": "docs/database-schema.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md", "label": "implementation-plan.md", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 35.6, "font": {"size": 12, "color": "#ffffff"}, "title": "implementation-plan.md", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 81}, {"id": "docs_implementation_plan_md_meal_planner_implementation_plan", "label": "Meal Planner - Implementation Plan", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Meal Planner - Implementation Plan", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_overview", "label": "Overview", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Overview", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_1_infrastructure_foundation", "label": "Phase 1: Infrastructure & Foundation", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 1: Infrastructure & Foundation", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_1_1_project_setup", "label": "1.1 Project Setup", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.1 Project Setup", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_1_2_backend_skeleton", "label": "1.2 Backend Skeleton", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.2 Backend Skeleton", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_1_3_frontend_skeleton", "label": "1.3 Frontend Skeleton", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.3 Frontend Skeleton", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_1_4_reverse_proxy_nginx", "label": "1.4 Reverse Proxy (Nginx)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.4 Reverse Proxy (Nginx)", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_2_database_models", "label": "Phase 2: Database & Models", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 2: Database & Models", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_2_1_sqlalchemy_models", "label": "2.1 SQLAlchemy Models", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.1 SQLAlchemy Models", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_2_2_pydantic_schemas", "label": "2.2 Pydantic Schemas", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.2 Pydantic Schemas", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_2_3_database_migrations", "label": "2.3 Database Migrations", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.3 Database Migrations", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_3_api_endpoints", "label": "Phase 3: API Endpoints", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 3: API Endpoints", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_3_1_core_crud_endpoints", "label": "3.1 Core CRUD Endpoints", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.1 Core CRUD Endpoints", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_3_2_meal_plan_endpoints", "label": "3.2 Meal Plan Endpoints", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.2 Meal Plan Endpoints", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_3_3_shopping_list_endpoints", "label": "3.3 Shopping List Endpoints", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.3 Shopping List Endpoints", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_3_4_feedback_endpoints", "label": "3.4 Feedback Endpoints", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.4 Feedback Endpoints", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_3_5_admin_endpoints", "label": "3.5 Admin Endpoints", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.5 Admin Endpoints", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_4_lucky_california_scraper", "label": "Phase 4: Lucky California Scraper", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 4: Lucky California Scraper", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_4_1_scraper_infrastructure", "label": "4.1 Scraper Infrastructure", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.1 Scraper Infrastructure", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_4_2_weekly_ad_scraper", "label": "4.2 Weekly Ad Scraper", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.2 Weekly Ad Scraper", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_4_3_product_catalog_scraper_future", "label": "4.3 Product Catalog Scraper (Future)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.3 Product Catalog Scraper (Future)", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_4_4_scrape_scheduling", "label": "4.4 Scrape Scheduling", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.4 Scrape Scheduling", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_4_5_error_handling", "label": "4.5 Error Handling", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.5 Error Handling", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_5_recipe_engine", "label": "Phase 5: Recipe Engine", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 5: Recipe Engine", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_5_1_recipe_database", "label": "5.1 Recipe Database", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5.1 Recipe Database", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_5_2_recipe_importing", "label": "5.2 Recipe Importing", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5.2 Recipe Importing", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_5_3_ingredient_mapping", "label": "5.3 Ingredient Mapping", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5.3 Ingredient Mapping", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_6_meal_planner_engine", "label": "Phase 6: Meal Planner Engine", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 6: Meal Planner Engine", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_6_1_plan_generation_algorithm", "label": "6.1 Plan Generation Algorithm", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.1 Plan Generation Algorithm", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_6_2_substitution_logic", "label": "6.2 Substitution Logic", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.2 Substitution Logic", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_6_3_cost_calculation", "label": "6.3 Cost Calculation", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.3 Cost Calculation", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_6_4_plan_persistence", "label": "6.4 Plan Persistence", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6.4 Plan Persistence", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_7_sendgrid_email_integration", "label": "Phase 7: SendGrid Email Integration", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 7: SendGrid Email Integration", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_7_1_sendgrid_setup", "label": "7.1 SendGrid Setup", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7.1 SendGrid Setup", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_7_2_meal_proposal_email", "label": "7.2 Meal Proposal Email", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7.2 Meal Proposal Email", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_7_3_reminder_email", "label": "7.3 Reminder Email", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7.3 Reminder Email", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_7_4_confirmation_email", "label": "7.4 Confirmation Email", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7.4 Confirmation Email", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_8_web_ui_core_features", "label": "Phase 8: Web UI - Core Features", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 8: Web UI - Core Features", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_8_1_dashboard", "label": "8.1 Dashboard", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8.1 Dashboard", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_8_2_meal_detail_page", "label": "8.2 Meal Detail Page", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8.2 Meal Detail Page", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_8_3_approval_center", "label": "8.3 Approval Center", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8.3 Approval Center", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_8_4_pantry_manager", "label": "8.4 Pantry Manager", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8.4 Pantry Manager", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_9_web_ui_feedback_learning", "label": "Phase 9: Web UI - Feedback & Learning", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 9: Web UI - Feedback & Learning", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_9_1_feedback_portal", "label": "9.1 Feedback Portal", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "9.1 Feedback Portal", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_9_2_learning_integration", "label": "9.2 Learning Integration", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "9.2 Learning Integration", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_9_3_recipe_discovery", "label": "9.3 Recipe Discovery", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "9.3 Recipe Discovery", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_10_shopping_list_print", "label": "Phase 10: Shopping List & Print", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 10: Shopping List & Print", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_10_1_shopping_list_generation", "label": "10.1 Shopping List Generation", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "10.1 Shopping List Generation", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_10_2_printable_shopping_list", "label": "10.2 Printable Shopping List", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "10.2 Printable Shopping List", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_10_3_web_ui_shopping_list_view", "label": "10.3 Web UI Shopping List View", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "10.3 Web UI Shopping List View", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_11_image_strategy_implementation", "label": "Phase 11: Image Strategy Implementation", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 11: Image Strategy Implementation", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_11_1_scraped_images", "label": "11.1 Scraped Images", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "11.1 Scraped Images", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_11_2_ai_image_generation_fallback", "label": "11.2 AI Image Generation (Fallback)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "11.2 AI Image Generation (Fallback)", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_11_3_email_image_handling", "label": "11.3 Email Image Handling", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "11.3 Email Image Handling", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_phase_12_polish_future_features", "label": "Phase 12: Polish & Future Features", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 12: Polish & Future Features", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_12_1_variety_analysis", "label": "12.1 Variety Analysis", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "12.1 Variety Analysis", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_12_2_budget_tracking", "label": "12.2 Budget Tracking", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "12.2 Budget Tracking", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_12_3_whatsapp_integration_future", "label": "12.3 WhatsApp Integration (Future)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "12.3 WhatsApp Integration (Future)", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_12_4_recipe_scraping_future", "label": "12.4 Recipe Scraping (Future)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "12.4 Recipe Scraping (Future)", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_verification_commands", "label": "Verification Commands", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verification Commands", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_backend_tests", "label": "Backend Tests", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Backend Tests", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_health_check", "label": "Health check", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Health check", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_api_tests", "label": "API tests", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "API tests", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_frontend_tests", "label": "Frontend Tests", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Frontend Tests", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_build_test", "label": "Build test", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Build test", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_dev_server", "label": "Dev server", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Dev server", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_full_stack_tests", "label": "Full Stack Tests", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Full Stack Tests", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_start_all_services", "label": "Start all services", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Start all services", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_check_all_services_running", "label": "Check all services running", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check all services running", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_view_logs", "label": "View logs", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "View logs", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_stop_all_services", "label": "Stop all services", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Stop all services", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_file_structure", "label": "File Structure", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "File Structure", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_dependencies", "label": "Dependencies", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Dependencies", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_backend_python_3_11", "label": "Backend (Python 3.11+)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Backend (Python 3.11+)", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_frontend_node_18", "label": "Frontend (Node 18+)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Frontend (Node 18+)", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_environment_variables", "label": "Environment Variables", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Environment Variables", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_backend", "label": "Backend", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Backend", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_frontend", "label": "Frontend", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Frontend", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_docker", "label": "Docker", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Docker", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_implementation_plan_md_notes", "label": "Notes", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Notes", "community": 3, "community_name": "API tests", "source_file": "docs/implementation-plan.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md", "label": "RUNNING.md", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 40.0, "font": {"size": 12, "color": "#ffffff"}, "title": "RUNNING.md", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 95}, {"id": "docs_running_md_running_the_meal_planner", "label": "Running the Meal Planner", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Running the Meal Planner", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_prerequisites", "label": "Prerequisites", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Prerequisites", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_environment_setup", "label": "Environment Setup", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Environment Setup", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_1_clone_repository", "label": "1. Clone Repository", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Clone Repository", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_2_create_environment_file", "label": "2. Create Environment File", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. Create Environment File", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_database", "label": "Database", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Database", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_sendgrid", "label": "SendGrid", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "SendGrid", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_family_emails", "label": "Family Emails", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Family Emails", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_lucky_california_for_scraping", "label": "Lucky California (for scraping)", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Lucky California (for scraping)", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_ai_images_optional", "label": "AI Images (optional)", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "AI Images (optional)", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_3_create_ssl_certificates_for_remote_acc", "label": "3. Create SSL Certificates (for remote access)", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Create SSL Certificates (for remote access)", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_option_1_let_s_encrypt_with_certbot", "label": "Option 1: Let's Encrypt with Certbot", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Option 1: Let's Encrypt with Certbot", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_option_2_self_signed_for_local_testing", "label": "Option 2: Self-signed for local testing", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Option 2: Self-signed for local testing", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_starting_services", "label": "Starting Services", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Starting Services", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_local_development", "label": "Local Development", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Local Development", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_start_all_services", "label": "Start all services", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Start all services", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_view_logs", "label": "View logs", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "View logs", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_stop_all_services", "label": "Stop all services", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Stop all services", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_production_deployment", "label": "Production Deployment", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Production Deployment", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_start_with_production_settings", "label": "Start with production settings", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Start with production settings", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_service_status", "label": "Check service status", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check service status", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_view_resource_usage", "label": "View resource usage", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "View resource usage", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_accessing_the_application", "label": "Accessing the Application", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Accessing the Application", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_local_access", "label": "Local Access", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Local Access", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_remote_access_with_reverse_proxy", "label": "Remote Access (with reverse proxy)", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Remote Access (with reverse proxy)", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_database_management", "label": "Database Management", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Database Management", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_initial_migration", "label": "Initial Migration", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Initial Migration", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_run_migrations", "label": "Run migrations", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Run migrations", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_current_migration", "label": "Check current migration", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check current migration", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_create_new_migration_after_model_changes", "label": "Create new migration after model changes", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Create new migration after model changes", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_backup_database", "label": "Backup Database", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Backup Database", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_backup_to_file", "label": "Backup to file", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Backup to file", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_restore_from_backup", "label": "Restore from backup", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Restore from backup", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_reset_database", "label": "Reset Database", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Reset Database", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_danger_drops_and_recreates_all_data", "label": "Danger: Drops and recreates all data", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Danger: Drops and recreates all data", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_scraping", "label": "Scraping", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Scraping", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_manual_scrape_trigger", "label": "Manual Scrape Trigger", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Manual Scrape Trigger", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_scrape_lucky_california_weekly_ad", "label": "Scrape Lucky California weekly ad", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Scrape Lucky California weekly ad", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_scrape_logs", "label": "Check Scrape Logs", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check Scrape Logs", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_view_recent_scrape_operations", "label": "View recent scrape operations", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "View recent scrape operations", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_scheduling", "label": "Scheduling", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Scheduling", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_email_testing", "label": "Email Testing", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Email Testing", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_test_email_send", "label": "Test Email Send", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Test Email Send", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_send_test_email", "label": "Send test email", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Send test email", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_view_email_logs", "label": "View Email Logs", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "View Email Logs", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_troubleshooting", "label": "Troubleshooting", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Troubleshooting", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_backend_won_t_start", "label": "Backend Won't Start", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Backend Won't Start", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_logs", "label": "Check logs", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check logs", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_common_issues", "label": "Common issues:", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Common issues:", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_database_not_ready_wait_for_db_to_be_hea", "label": "- Database not ready: wait for db to be healthy", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "- Database not ready: wait for db to be healthy", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_port_conflict_check_if_port_8000_is_in_u", "label": "- Port conflict: check if port 8000 is in use", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "- Port conflict: check if port 8000 is in use", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_missing_env_vars_verify_env_file_exists_", "label": "- Missing env vars: verify .env file exists and is valid", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "- Missing env vars: verify .env file exists and is valid", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_frontend_build_fails", "label": "Frontend Build Fails", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Frontend Build Fails", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_for_node_version_issues", "label": "Check for Node version issues", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check for Node version issues", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_clear_cache_and_rebuild", "label": "Clear cache and rebuild", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Clear cache and rebuild", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_database_connection_errors", "label": "Database Connection Errors", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Database Connection Errors", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_verify_database_is_running", "label": "Verify database is running", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verify database is running", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_test_connection_from_backend", "label": "Test connection from backend", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Test connection from backend", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_credentials", "label": "Check credentials", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check credentials", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_scraping_failures", "label": "Scraping Failures", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Scraping Failures", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_lucky_california_is_accessible", "label": "Check Lucky California is accessible", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check Lucky California is accessible", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_verify_playwright_browser_installed", "label": "Verify Playwright browser installed", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verify Playwright browser installed", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_manual_retry", "label": "Manual retry", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Manual retry", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_email_not_sending", "label": "Email Not Sending", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Email Not Sending", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_verify_sendgrid_api_key", "label": "Verify SendGrid API key", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verify SendGrid API key", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_sendgrid_dashboard_for_failures", "label": "Check SendGrid dashboard for failures", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check SendGrid dashboard for failures", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_ensure_sender_email_is_verified_in_sendg", "label": "Ensure sender email is verified in SendGrid", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Ensure sender email is verified in SendGrid", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_development", "label": "Development", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Development", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_backend_development", "label": "Backend Development", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Backend Development", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_enter_backend_container", "label": "Enter backend container", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Enter backend container", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_run_tests", "label": "Run tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Run tests", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_run_with_hot_reload", "label": "Run with hot reload", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Run with hot reload", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_frontend_development", "label": "Frontend Development", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Frontend Development", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_enter_frontend_container", "label": "Enter frontend container", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Enter frontend container", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_run_dev_server_with_hot_reload", "label": "Run dev server with hot reload", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Run dev server with hot reload", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_database_migrations", "label": "Database Migrations", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Database Migrations", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_create_migration", "label": "Create migration", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Create migration", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_upgrade", "label": "Upgrade", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Upgrade", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_downgrade", "label": "Downgrade", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Downgrade", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_show_migration_history", "label": "Show migration history", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Show migration history", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_health_checks", "label": "Health Checks", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Health Checks", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_backend_health", "label": "Check backend health", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check backend health", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_database_connectivity", "label": "Check database connectivity", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check database connectivity", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_check_all_services", "label": "Check all services", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Check all services", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_logs", "label": "Logs", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Logs", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_view_all_logs", "label": "View All Logs", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "View All Logs", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_view_specific_service", "label": "View Specific Service", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "View Specific Service", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_configure_log_level", "label": "Configure Log Level", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Configure Log Level", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_security_notes", "label": "Security Notes", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Security Notes", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_updating", "label": "Updating", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Updating", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_pull_latest_code", "label": "Pull latest code", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Pull latest code", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_rebuild_images", "label": "Rebuild images", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Rebuild images", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_restart_services", "label": "Restart services", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Restart services", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_running_md_stopping_completely", "label": "Stopping Completely", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Stopping Completely", "community": 1, "community_name": "Accessing the Application", "source_file": "docs/RUNNING.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md", "label": "ORIENTATION.md", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 17.3, "font": {"size": 12, "color": "#ffffff"}, "title": "ORIENTATION.md", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 23}, {"id": "docs_orientation_md_meal_planner_orientation", "label": "Meal Planner \u2014 Orientation", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Meal Planner \u2014 Orientation", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_what_this_project_is", "label": "What this project is", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "What this project is", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_architecture_current", "label": "Architecture (current)", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Architecture (current)", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_phase_status_2026_05_08", "label": "Phase status (2026-05-08)", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase status (2026-05-08)", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_auth_model_r1_b_d_locked_in", "label": "Auth model (R1-B+D, locked in)", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Auth model (R1-B+D, locked in)", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_database_schema_highlights", "label": "Database schema highlights", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Database schema highlights", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_environment_variables_verified", "label": "Environment variables (verified)", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Environment variables (verified)", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_database", "label": "Database", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Database", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_auth", "label": "Auth", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Auth", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_email", "label": "Email", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Email", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_phase_5_orchestration", "label": "Phase 5 orchestration", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 5 orchestration", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_lucky_swiftly", "label": "Lucky / Swiftly", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Lucky / Swiftly", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_no_bearer_token_env_var_minted_on_demand", "label": "(no bearer-token env var \u2014 minted on demand by app/services/swiftly_auth.py)", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "(no bearer-token env var \u2014 minted on demand by app/services/swiftly_auth.py)", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_other", "label": "Other", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Other", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_verification_commands", "label": "Verification commands", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verification commands", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_full_local_stack_include_scheduler_for_p", "label": "Full local stack (include scheduler for Phase 5)", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Full local stack (include scheduler for Phase 5)", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_verify_scheduler", "label": "Verify scheduler", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verify scheduler", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_expected_6_lines_scrape_generate_email_r", "label": "Expected: 6 lines \u2014 scrape/generate/email/reminder/deadline/finalize", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Expected: 6 lines \u2014 scrape/generate/email/reminder/deadline/finalize", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_manual_step_trigger_useful_for_testing_w", "label": "Manual step trigger (useful for testing without waiting for Friday)", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Manual step trigger (useful for testing without waiting for Friday)", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_frontend", "label": "Frontend", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Frontend", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_ci_github_workflows_ci_yml_runs_both_job", "label": "CI: .github/workflows/ci.yml runs both jobs on push/PR.", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "CI: .github/workflows/ci.yml runs both jobs on push/PR.", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_conventions", "label": "Conventions", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Conventions", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_orientation_md_where_to_look", "label": "Where to look", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Where to look", "community": 18, "community_name": "Architecture (current)", "source_file": "docs/ORIENTATION.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md", "label": "HANDOFF.md", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 22.3, "font": {"size": 12, "color": "#ffffff"}, "title": "HANDOFF.md", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 39}, {"id": "docs_handoff_md_mealplanner_agent_handoff", "label": "MealPlanner \u2014 Agent Handoff", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "MealPlanner \u2014 Agent Handoff", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_tl_dr", "label": "TL;DR", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "TL;DR", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_infrastructure_read_this_first", "label": "Infrastructure \u2014 READ THIS FIRST", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Infrastructure \u2014 READ THIS FIRST", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_access", "label": "Access", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Access", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_stack_up", "label": "Stack up", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Stack up", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_applying_python_code_changes", "label": "Applying Python code changes", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Applying Python code changes", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_db_connection", "label": "DB connection", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "DB connection", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_admin_api_auth", "label": "Admin API auth", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Admin API auth", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_key_env_vars_env_test", "label": "Key env vars (`.env.test`)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Key env vars (`.env.test`)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_family_data_live_seeded", "label": "Family data (live, seeded)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Family data (live, seeded)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_what_changed_in_this_session", "label": "What changed in this session", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "What changed in this session", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_mvp_login_auth_gating_committed_in_featu", "label": "MVP login + auth gating (committed in `feature/mvp-login`, merged to master)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "MVP login + auth gating (committed in `feature/mvp-login`, merged to master)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_nginx_committed_in_59a15a2", "label": "nginx (committed in `59a15a2`)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "nginx (committed in `59a15a2`)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_vote_email_enrichment_aeed2a4", "label": "Vote email enrichment (`aeed2a4`)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Vote email enrichment (`aeed2a4`)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_shopping_list_email_improvements_aeed2a4", "label": "Shopping list email improvements (`aeed2a4`)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Shopping list email improvements (`aeed2a4`)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_ingredient_matcher_full_rewrite_ac2b575_", "label": "Ingredient matcher \u2014 full rewrite (`ac2b575`, `d7a3f5c`, `2373883`)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Ingredient matcher \u2014 full rewrite (`ac2b575`, `d7a3f5c`, `2373883`)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_scraper_fix_save_priceless_produce_23738", "label": "Scraper fix \u2014 save priceless produce (`2373883`)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Scraper fix \u2014 save priceless produce (`2373883`)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_what_is_real_verified", "label": "What is real (verified)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "What is real (verified)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_lucky_ca_api_swiftly_full_catalog_access", "label": "Lucky CA API (Swiftly) \u2014 full catalog accessible", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Lucky CA API (Swiftly) \u2014 full catalog accessible", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_matcher_runs_automatically", "label": "Matcher runs automatically", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Matcher runs automatically", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_what_is_stubbed_or_missing", "label": "What is stubbed or missing", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "What is stubbed or missing", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_recipe_images_phase_10_approved_not_star", "label": "Recipe images (Phase 10 \u2014 approved, not started)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Recipe images (Phase 10 \u2014 approved, not started)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_recipe_descriptions", "label": "Recipe descriptions", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Recipe descriptions", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_olive_oil_corn_tortillas_lucky_catalog_g", "label": "Olive Oil + Corn Tortillas (Lucky catalog gap)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Olive Oil + Corn Tortillas (Lucky catalog gap)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_phase_8_feedback_ui_done", "label": "Phase 8 \u2014 Feedback UI (done)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 8 \u2014 Feedback UI (done)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_known_caveats_and_traps", "label": "Known caveats and traps", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Known caveats and traps", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_admin_api_reference", "label": "Admin API reference", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Admin API reference", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_trigger_individual_steps", "label": "Trigger individual steps", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Trigger individual steps", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_valid_steps_scrape_generate_email_remind", "label": "Valid steps: scrape, generate, email, reminder, deadline, finalize", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Valid steps: scrape, generate, email, reminder, deadline, finalize", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_full_week_cycle_background", "label": "Full week cycle (background)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Full week cycle (background)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_scrape_status", "label": "Scrape status", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Scrape status", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_weekly_run_status", "label": "Weekly run status", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Weekly run status", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_trigger_fresh_scrape_auto_match", "label": "Trigger fresh scrape + auto-match", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Trigger fresh scrape + auto-match", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_suggested_next_moves", "label": "Suggested next moves", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Suggested next moves", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_1_spoonacular_recipe_enrichment_images_d", "label": "1. Spoonacular recipe enrichment (images + descriptions)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Spoonacular recipe enrichment (images + descriptions)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_2_ollama_llm_matcher_olive_oil_corn_tort", "label": "2. Ollama LLM matcher (Olive Oil, Corn Tortillas, etc.)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. Ollama LLM matcher (Olive Oil, Corn Tortillas, etc.)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_3_natural_friday_cycle", "label": "3. Natural Friday cycle", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Natural Friday cycle", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_file_map_additions_from_this_session", "label": "File map (additions from this session)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "File map (additions from this session)", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_handoff_md_final_words", "label": "Final words", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Final words", "community": 9, "community_name": "Access", "source_file": "docs/HANDOFF.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "label": "2026-05-05-meal-planner-algorithm-design.md", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 16.3, "font": {"size": 12, "color": "#ffffff"}, "title": "2026-05-05-meal-planner-algorithm-design.md", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 20}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_meal_planner_algorithm_design_spec", "label": "Meal Planner Algorithm \u2014 Design Spec", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Meal Planner Algorithm \u2014 Design Spec", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_1_goal", "label": "1. Goal", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Goal", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_2_algorithm_shape", "label": "2. Algorithm shape", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. Algorithm shape", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_2_1_hard_constraints", "label": "2.1 Hard constraints", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.1 Hard constraints", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_2_2_scoring_signals", "label": "2.2 Scoring signals", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.2 Scoring signals", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_2_3_set_selection_diversity", "label": "2.3 Set-selection diversity", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.3 Set-selection diversity", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_ingredient_grocery_item_matching_layer", "label": "3. Ingredient \u2194 grocery_item matching layer", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Ingredient \u2194 grocery_item matching layer", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_1_schema", "label": "3.1 Schema", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.1 Schema", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_2_match_job", "label": "3.2 Match job", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.2 Match job", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_3_manual_override", "label": "3.3 Manual override", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.3 Manual override", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_4_recipe_create_assist", "label": "3.4 Recipe-create assist", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3.4 Recipe-create assist", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_4_thin_phase_4_surface", "label": "4. Thin Phase 4 surface", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4. Thin Phase 4 surface", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_4_1_in_scope", "label": "4.1 In scope", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.1 In scope", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_4_2_recipe_model_fields_additions_to_exi", "label": "4.2 Recipe model fields (additions to existing `recipe` table)", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.2 Recipe model fields (additions to existing `recipe` table)", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_4_3_out_of_scope_deferred", "label": "4.3 Out of scope (deferred)", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4.3 Out of scope (deferred)", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_5_phase_9_api_surface", "label": "5. Phase 9 API surface", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5. Phase 9 API surface", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_6_recipe_source_comparison_deferred_deci", "label": "6. Recipe source comparison (deferred decision)", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6. Recipe source comparison (deferred decision)", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_7_open_questions_deferred", "label": "7. Open questions / deferred", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7. Open questions / deferred", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_8_implementation_order", "label": "8. Implementation order", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8. Implementation order", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_9_out_of_scope_for_this_spec", "label": "9. Out of scope for this spec", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "9. Out of scope for this spec", "community": 21, "community_name": "Meal Planner Algorithm \u2014", "source_file": "docs/specs/2026-05-05-meal-planner-algorithm-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "label": "2026-05-05-thin-phase-4-recipe-engine.md", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 16.6, "font": {"size": 12, "color": "#ffffff"}, "title": "2026-05-05-thin-phase-4-recipe-engine.md", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 21}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_thin_phase_4_recipe_engine_matching_laye", "label": "Thin Phase 4 \u2014 Recipe Engine + Matching Layer Implementation Plan", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Thin Phase 4 \u2014 Recipe Engine + Matching Layer Implementation Plan", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_file_structure", "label": "File Structure", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "File Structure", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_1_add_rapidfuzz_dependency", "label": "Task 1: Add rapidfuzz dependency", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 1: Add rapidfuzz dependency", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_2_migration_0006_schema_changes", "label": "Task 2: Migration 0006 \u2014 schema changes", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 2: Migration 0006 \u2014 schema changes", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_3_update_sqlalchemy_models", "label": "Task 3: Update SQLAlchemy models", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 3: Update SQLAlchemy models", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_4_pydantic_schemas_ingredient", "label": "Task 4: Pydantic schemas \u2014 ingredient", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 4: Pydantic schemas \u2014 ingredient", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_5_pydantic_schemas_recipe", "label": "Task 5: Pydantic schemas \u2014 recipe", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 5: Pydantic schemas \u2014 recipe", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_6_ingredient_crud_endpoints", "label": "Task 6: Ingredient CRUD endpoints", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 6: Ingredient CRUD endpoints", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_7_recipe_crud_endpoints", "label": "Task 7: Recipe CRUD endpoints", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 7: Recipe CRUD endpoints", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_8_resolve_ingredient_assist_endpoin", "label": "Task 8: Resolve-ingredient assist endpoint", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 8: Resolve-ingredient assist endpoint", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_9_matcher_service_rapidfuzz_top_3", "label": "Task 9: Matcher service (rapidfuzz top-3)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 9: Matcher service (rapidfuzz top-3)", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_10_wire_matcher_into_scrape_success", "label": "Task 10: Wire matcher into scrape success path", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 10: Wire matcher into scrape success path", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_11_manual_match_override_endpoints", "label": "Task 11: Manual match override endpoints", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 11: Manual match override endpoints", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_re_import_basemodel_near_the_top_of_the_", "label": "Re-import BaseModel near the top of the file if not already present.", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Re-import BaseModel near the top of the file if not already present.", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_12_neversuggest_crud_endpoints", "label": "Task 12: NeverSuggest CRUD endpoints", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 12: NeverSuggest CRUD endpoints", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_13_migration_0007_seed_canonical_in", "label": "Task 13: Migration 0007 \u2014 seed canonical ingredients", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 13: Migration 0007 \u2014 seed canonical ingredients", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_stable_uuids_so_re_running_upgrade_after", "label": "Stable UUIDs so re-running upgrade after a downgrade is idempotent on FK refs.", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Stable UUIDs so re-running upgrade after a downgrade is idempotent on FK refs.", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_14_migration_0007_populate_30_start", "label": "Task 14: Migration 0007 \u2014 populate 30 starter recipes", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 14: Migration 0007 \u2014 populate 30 starter recipes", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_15_end_to_end_smoke_test_docs_refre", "label": "Task 15: End-to-end smoke test + docs refresh", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 15: End-to-end smoke test + docs refresh", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_verification_gate", "label": "Verification gate", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verification gate", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_out_of_scope_phase_9_plan_written_separa", "label": "Out of scope (Phase 9 plan, written separately)", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Out of scope (Phase 9 plan, written separately)", "community": 19, "community_name": "Out of scope (Phase", "source_file": "docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "label": "2026-05-05-phase-9-planner-algorithm.md", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 14.1, "font": {"size": 0, "color": "#ffffff"}, "title": "2026-05-05-phase-9-planner-algorithm.md", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 13}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_phase_9_meal_planner_algorithm_implement", "label": "Phase 9 \u2014 Meal-Planner Algorithm Implementation Plan", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 9 \u2014 Meal-Planner Algorithm Implementation Plan", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_file_structure", "label": "File Structure", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "File Structure", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_1_planner_config_types", "label": "Task 1: Planner config + types", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 1: Planner config + types", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_2_cost_savings_estimator", "label": "Task 2: Cost + savings estimator", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 2: Cost + savings estimator", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_3_hard_constraint_filter", "label": "Task 3: Hard-constraint filter", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 3: Hard-constraint filter", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_4_individual_scoring", "label": "Task 4: Individual scoring", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 4: Individual scoring", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_5_top_k_set_selection_with_diversit", "label": "Task 5: Top-K set selection with diversity", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 5: Top-K set selection with diversity", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_6_generation_orchestrator", "label": "Task 6: Generation orchestrator", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 6: Generation orchestrator", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_7_generate_api_endpoint", "label": "Task 7: Generate API endpoint", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 7: Generate API endpoint", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_8_final_regression_sweep_docs_refre", "label": "Task 8: Final regression sweep + docs refresh", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 8: Final regression sweep + docs refresh", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_verification_gate", "label": "Verification gate", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verification gate", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_open_items_deferred_tracked_here", "label": "Open items (deferred, tracked here)", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Open items (deferred, tracked here)", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_out_of_scope_other_phases", "label": "Out of scope (other phases)", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Out of scope (other phases)", "community": 30, "community_name": "Open items (deferred, tracked", "source_file": "docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "label": "2026-05-07-phase5-orchestration.md", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 20.1, "font": {"size": 12, "color": "#ffffff"}, "title": "2026-05-07-phase5-orchestration.md", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 32}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_phase_5_weekly_orchestration_implementat", "label": "Phase 5 \u2014 Weekly Orchestration Implementation Plan", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 5 \u2014 Weekly Orchestration Implementation Plan", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_file_map", "label": "File Map", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "File Map", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_1_alembic_migration_0008", "label": "Task 1 \u2014 Alembic migration 0008", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 1 \u2014 Alembic migration 0008", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_backend_alembic_versions_0008_phase5_orc", "label": "backend/alembic/versions/0008_phase5_orchestration.py", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "backend/alembic/versions/0008_phase5_orchestration.py", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_2_weeklyrun_model_familyprofile_upd", "label": "Task 2 \u2014 WeeklyRun model + FamilyProfile update", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 2 \u2014 WeeklyRun model + FamilyProfile update", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_column_after_calorie_target_line", "label": "column (after calorie_target line):", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "column (after calorie_target line):", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_relationship_after_the_existing_relation", "label": "relationship (after the existing relationships):", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "relationship (after the existing relationships):", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_3_settings_admin_email_app_base_url", "label": "Task 3 \u2014 Settings: ADMIN_EMAIL + APP_BASE_URL", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 3 \u2014 Settings: ADMIN_EMAIL + APP_BASE_URL", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_4_alerts_py", "label": "Task 4 \u2014 alerts.py", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 4 \u2014 alerts.py", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_", "label": "---------------------------------------------------------------------------", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "---------------------------------------------------------------------------", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_fixtures", "label": "Fixtures", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Fixtures", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_alerts_py_tests", "label": "alerts.py tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "alerts.py tests", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_5_step_scrape", "label": "Task 5 \u2014 step_scrape", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 5 \u2014 step_scrape", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_scrape_tests", "label": "step_scrape tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "step_scrape tests", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_6_step_generate", "label": "Task 6 \u2014 step_generate", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 6 \u2014 step_generate", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_generate_tests", "label": "step_generate tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "step_generate tests", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_7_step_email", "label": "Task 7 \u2014 step_email", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 7 \u2014 step_email", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_email_tests", "label": "step_email tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "step_email tests", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_8_step_deadline", "label": "Task 8 \u2014 step_deadline", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 8 \u2014 step_deadline", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_deadline_tests", "label": "step_deadline tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "step_deadline tests", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_9_step_finalize", "label": "Task 9 \u2014 step_finalize", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 9 \u2014 step_finalize", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_finalize_tests", "label": "step_finalize tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "step_finalize tests", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_10_runner_py_orchestrator_init_py", "label": "Task 10 \u2014 runner.py + orchestrator/__init__.py", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 10 \u2014 runner.py + orchestrator/__init__.py", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_runner_tests", "label": "runner tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "runner tests", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_backend_app_services_orchestrator_init_p", "label": "backend/app/services/orchestrator/__init__.py", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "backend/app/services/orchestrator/__init__.py", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_11_admin_orchestrate_endpoints", "label": "Task 11 \u2014 Admin orchestrate endpoints", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 11 \u2014 Admin orchestrate endpoints", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_admin_endpoint_tests", "label": "Admin endpoint tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Admin endpoint tests", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_12_scheduler_entry_point", "label": "Task 12 \u2014 Scheduler entry point", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 12 \u2014 Scheduler entry point", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_13_docker_compose_scheduler_service", "label": "Task 13 \u2014 Docker Compose: scheduler service", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 13 \u2014 Docker Compose: scheduler service", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_final_verification", "label": "Final verification", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Final verification", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_seed_a_family_profile_row_first_if_db_is", "label": "Seed a family_profile row first if DB is fresh", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Seed a family_profile row first if DB is fresh", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_environment_variables_added", "label": "Environment variables added", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Environment variables added", "community": 11, "community_name": "Admin endpoint tests", "source_file": "docs/superpowers/plans/2026-05-07-phase5-orchestration.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "label": "2026-05-07-phase6-sendgrid.md", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 13.8, "font": {"size": 0, "color": "#ffffff"}, "title": "2026-05-07-phase6-sendgrid.md", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 12}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_phase_6_sendgrid_email_integration_imple", "label": "Phase 6 \u2014 SendGrid Email Integration Implementation Plan", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 6 \u2014 SendGrid Email Integration Implementation Plan", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_file_map", "label": "File map", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "File map", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_1_migration_0009_add_reminded_at_to", "label": "Task 1: Migration 0009 \u2014 add `reminded_at` to `weekly_run`", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 1: Migration 0009 \u2014 add `reminded_at` to `weekly_run`", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_context", "label": "Context", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Context", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_expected_info_alembic_runtime_migration_", "label": "Expected: INFO [alembic.runtime.migration] Running upgrade 0008 -> 0009 ...", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Expected: INFO [alembic.runtime.migration] Running upgrade 0008 -> 0009 ...", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_expected_running_upgrade_0008_0009_again", "label": "Expected: Running upgrade 0008 -> 0009 again, clean", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Expected: Running upgrade 0008 -> 0009 again, clean", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_2_wire_sendgridemailbackend", "label": "Task 2: Wire `SendGridEmailBackend`", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 2: Wire `SendGridEmailBackend`", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_3_step_reminder_tests", "label": "Task 3: `step_reminder` + tests", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 3: `step_reminder` + tests", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_step_reminder", "label": "\u2500\u2500 step_reminder \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "\u2500\u2500 step_reminder \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_4_wire_reminder_into_runner_admin_a", "label": "Task 4: Wire reminder into runner, admin, and scheduler", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 4: Wire reminder into runner, admin, and scheduler", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_5_html_escape_p5_a_and_getattr_clea", "label": "Task 5: HTML-escape (#P5-a) and `getattr` cleanup (#P5-b)", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 5: HTML-escape (#P5-a) and `getattr` cleanup (#P5-b)", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_final_verification", "label": "Final verification", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Final verification", "community": 31, "community_name": "Expected: INFO [alembic.runtime.migration] Running", "source_file": "docs/superpowers/plans/2026-05-07-phase6-sendgrid.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md", "label": "2026-05-09-mvp-login.md", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 16.0, "font": {"size": 12, "color": "#ffffff"}, "title": "2026-05-09-mvp-login.md", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 19}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_mvp_login_family_seed_implementation_pla", "label": "MVP Login + Family Seed Implementation Plan", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "MVP Login + Family Seed Implementation Plan", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_file_map", "label": "File map", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "File map", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_task_1_login_page_401_interceptor_nav_lo", "label": "Task 1: Login page + 401 interceptor + nav logout", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 1: Login page + 401 interceptor + nav logout", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_1_create_frontend_src_pages_login_t", "label": "Step 1: Create `frontend/src/pages/Login.tsx`", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Step 1: Create `frontend/src/pages/Login.tsx`", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_2_modify_frontend_src_app_tsx", "label": "Step 2: Modify `frontend/src/App.tsx`", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Step 2: Modify `frontend/src/App.tsx`", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_3_add_401_interceptor_to_frontend_s", "label": "Step 3: Add 401 interceptor to `frontend/src/api/index.ts`", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Step 3: Add 401 interceptor to `frontend/src/api/index.ts`", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_4_build_and_verify", "label": "Step 4: Build and verify", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Step 4: Build and verify", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_expected_no_typescript_errors_build_succ", "label": "Expected: no TypeScript errors, build succeeds", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Expected: no TypeScript errors, build succeeds", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_5_commit", "label": "Step 5: Commit", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Step 5: Commit", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_task_2_family_profile_seed_script", "label": "Task 2: Family profile seed script", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Task 2: Family profile seed script", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_edit_these_before_running", "label": "\u2500\u2500 Edit these before running \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "\u2500\u2500 Edit these before running \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_", "label": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_commit", "label": "Step: Commit", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Step: Commit", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_post_merge_steps_run_by_operator_after_m", "label": "Post-merge steps (run by operator after merge)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Post-merge steps (run by operator after merge)", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_1_add_app_base_url_to_env_test", "label": "1. Add APP_BASE_URL to `.env.test`", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Add APP_BASE_URL to `.env.test`", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_2_rebuild_frontend_container_and_restart", "label": "2. Rebuild frontend container and restart", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. Rebuild frontend container and restart", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_3_run_the_seed_script", "label": "3. Run the seed script", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Run the seed script", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_edit_scripts_seed_family_py_to_fill_in_r", "label": "Edit scripts/seed_family.py to fill in real names/emails first, then:", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Edit scripts/seed_family.py to fill in real names/emails first, then:", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_plans_2026_05_09_mvp_login_md_4_verify_login_works", "label": "4. Verify login works", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4. Verify login works", "community": 23, "community_name": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "source_file": "docs/superpowers/plans/2026-05-09-mvp-login.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "label": "2026-05-07-phase6-sendgrid-design.md", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 16.3, "font": {"size": 12, "color": "#ffffff"}, "title": "2026-05-07-phase6-sendgrid-design.md", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 20}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_phase_6_sendgrid_email_integration_desig", "label": "Phase 6 \u2014 SendGrid Email Integration Design", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 6 \u2014 SendGrid Email Integration Design", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_goal", "label": "Goal", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Goal", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_scope", "label": "Scope", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Scope", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_architecture", "label": "Architecture", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Architecture", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_components", "label": "Components", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Components", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_services_email_py_modify", "label": "`backend/app/services/email.py` (modify)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "`backend/app/services/email.py` (modify)", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_config_py_modify", "label": "`backend/app/config.py` (modify)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "`backend/app/config.py` (modify)", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_services_orchestrator_steps_", "label": "`backend/app/services/orchestrator/steps.py` (modify)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "`backend/app/services/orchestrator/steps.py` (modify)", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_alembic_versions_0009_phase6_rem", "label": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_models_init_py_modify", "label": "`backend/app/models/__init__.py` (modify)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "`backend/app/models/__init__.py` (modify)", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_services_orchestrator_runner", "label": "`backend/app/services/orchestrator/runner.py` (modify)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "`backend/app/services/orchestrator/runner.py` (modify)", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_api_admin_py_modify", "label": "`backend/app/api/admin.py` (modify)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "`backend/app/api/admin.py` (modify)", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_scheduler_main_py_modify", "label": "`backend/app/scheduler/__main__.py` (modify)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "`backend/app/scheduler/__main__.py` (modify)", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_requirements_txt_verify_add", "label": "`requirements.txt` (verify / add)", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "`requirements.txt` (verify / add)", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_data_flow", "label": "Data flow", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Data flow", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_error_handling", "label": "Error handling", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Error handling", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_testing", "label": "Testing", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Testing", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_environment_variables", "label": "Environment variables", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Environment variables", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_required_for_email_backend_sendgrid", "label": "Required for EMAIL_BACKEND=sendgrid", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Required for EMAIL_BACKEND=sendgrid", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_files_touched", "label": "Files touched", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Files touched", "community": 22, "community_name": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "source_file": "docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md", "file_type": "document", "degree": 1}, {"id": "backend_requirements_dev_txt", "label": "requirements-dev.txt", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "requirements-dev.txt", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/requirements-dev.txt", "file_type": "document", "degree": 1}, {"id": "backend_requirements_dev_txt_dev_test_only_dependencies_production_de", "label": "Dev / test-only dependencies. Production deps live in requirements.txt.", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Dev / test-only dependencies. Production deps live in requirements.txt.", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/requirements-dev.txt", "file_type": "document", "degree": 1}, {"id": "backend_requirements_txt", "label": "requirements.txt", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "requirements.txt", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/requirements.txt", "file_type": "document", "degree": 0}, {"id": "backend_tests_fixtures_lucky_ca_meta_md", "label": "META.md", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 11.3, "font": {"size": 0, "color": "#ffffff"}, "title": "META.md", "community": 43, "community_name": "First parsed item (sample)", "source_file": "backend/tests/fixtures/lucky_ca/META.md", "file_type": "document", "degree": 4}, {"id": "backend_tests_fixtures_lucky_ca_meta_md_lucky_california_weekly_ad_spike_r2_a", "label": "Lucky California weekly-ad spike (R2-A)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Lucky California weekly-ad spike (R2-A)", "community": 43, "community_name": "First parsed item (sample)", "source_file": "backend/tests/fixtures/lucky_ca/META.md", "file_type": "document", "degree": 1}, {"id": "backend_tests_fixtures_lucky_ca_meta_md_selectors_used_verified_against_this_fix", "label": "Selectors used (verified against this fixture)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Selectors used (verified against this fixture)", "community": 43, "community_name": "First parsed item (sample)", "source_file": "backend/tests/fixtures/lucky_ca/META.md", "file_type": "document", "degree": 1}, {"id": "backend_tests_fixtures_lucky_ca_meta_md_first_parsed_item_sample", "label": "First parsed item (sample)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "First parsed item (sample)", "community": 43, "community_name": "First parsed item (sample)", "source_file": "backend/tests/fixtures/lucky_ca/META.md", "file_type": "document", "degree": 1}, {"id": "backend_tests_fixtures_lucky_ca_meta_md_notes", "label": "Notes", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Notes", "community": 43, "community_name": "First parsed item (sample)", "source_file": "backend/tests/fixtures/lucky_ca/META.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md", "label": "docs-gpt5.5.md", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 17.6, "font": {"size": 12, "color": "#ffffff"}, "title": "docs-gpt5.5.md", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 24}, {"id": "review_docs_gpt5_5_md_adversarial_documentation_review", "label": "Adversarial Documentation Review", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Adversarial Documentation Review", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_verdict", "label": "Verdict", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verdict", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_blocking_findings", "label": "Blocking Findings", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Blocking Findings", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_1_phase_status_docs_contradict_current_i", "label": "1. Phase/status docs contradict current implementation state", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Phase/status docs contradict current implementation state", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_2_database_schema_is_internally_inconsis", "label": "2. Database schema is internally inconsistent and conflicts with current models", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. Database schema is internally inconsistent and conflicts with current models", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_3_api_endpoint_definitions_conflict_acro", "label": "3. API endpoint definitions conflict across docs", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. API endpoint definitions conflict across docs", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_4_security_model_is_missing_for_external", "label": "4. Security model is missing for externally reachable workflows", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4. Security model is missing for externally reachable workflows", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_5_migration_strategy_conflicts_with_runt", "label": "5. Migration strategy conflicts with runtime table creation", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5. Migration strategy conflicts with runtime table creation", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_6_current_code_appears_incompatible_with", "label": "6. Current code appears incompatible with documented model layout", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6. Current code appears incompatible with documented model layout", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_high_risk_gaps", "label": "High-Risk Gaps", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "High-Risk Gaps", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_7_scraping_feasibility_is_under_specifie", "label": "7. Scraping feasibility is under-specified", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7. Scraping feasibility is under-specified", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_8_meal_planning_algorithm_lacks_determin", "label": "8. Meal-planning algorithm lacks deterministic requirements", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8. Meal-planning algorithm lacks deterministic requirements", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_9_shopping_list_math_is_not_implementabl", "label": "9. Shopping-list math is not implementable from current docs", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "9. Shopping-list math is not implementable from current docs", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_10_deployment_docs_promise_production_fe", "label": "10. Deployment docs promise production features that compose file does not provide", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "10. Deployment docs promise production features that compose file does not provide", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_11_environment_variable_docs_are_inconsi", "label": "11. Environment-variable docs are inconsistent and include unsafe examples", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "11. Environment-variable docs are inconsistent and include unsafe examples", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_medium_risk_issues", "label": "Medium-Risk Issues", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Medium-Risk Issues", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_12_documentation_contains_stale_and_miss", "label": "12. Documentation contains stale and misspelled file paths", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "12. Documentation contains stale and misspelled file paths", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_13_tech_stack_docs_are_already_version_s", "label": "13. Tech-stack docs are already version stale", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "13. Tech-stack docs are already version stale", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_14_operational_docs_assume_endpoints_tha", "label": "14. Operational docs assume endpoints that are not proven to exist", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "14. Operational docs assume endpoints that are not proven to exist", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_15_data_retention_lacks_implementation_m", "label": "15. Data retention lacks implementation mechanics", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "15. Data retention lacks implementation mechanics", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_16_accessibility_is_barely_addressed_des", "label": "16. Accessibility is barely addressed despite family-facing UI", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "16. Accessibility is barely addressed despite family-facing UI", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_17_observability_requirements_are_aspira", "label": "17. Observability requirements are aspirational", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "17. Observability requirements are aspirational", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_suggested_gate_before_implementation", "label": "Suggested Gate Before Implementation", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Suggested Gate Before Implementation", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_gpt5_5_md_implementation_readiness_rating", "label": "Implementation Readiness Rating", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Implementation Readiness Rating", "community": 17, "community_name": "Adversarial Documentation Review", "source_file": "Review/docs-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md", "label": "repo-gpt5.5.md", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 19.8, "font": {"size": 12, "color": "#ffffff"}, "title": "repo-gpt5.5.md", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 31}, {"id": "review_repo_gpt5_5_md_repository_analysis", "label": "Repository Analysis", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Repository Analysis", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_executive_summary", "label": "Executive Summary", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Executive Summary", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_current_repo_shape", "label": "Current Repo Shape", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Current Repo Shape", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_blocking_findings", "label": "Blocking Findings", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Blocking Findings", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_1_backend_likely_fails_during_import_bec", "label": "1. Backend likely fails during import because model module layout is inconsistent", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Backend likely fails during import because model module layout is inconsistent", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_2_sqlalchemy_relationships_contain_at_le", "label": "2. SQLAlchemy relationships contain at least one broken back-populates reference", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. SQLAlchemy relationships contain at least one broken back-populates reference", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_3_frontend_build_is_blocked_by_a_missing", "label": "3. Frontend build is blocked by a missing imported page", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Frontend build is blocked by a missing imported page", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_4_frontend_docker_build_is_blocked_by_mi", "label": "4. Frontend Docker build is blocked by missing npm lockfile", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4. Frontend Docker build is blocked by missing npm lockfile", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_5_vite_app_is_missing_required_html_entr", "label": "5. Vite app is missing required HTML entrypoint", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5. Vite app is missing required HTML entrypoint", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_6_alembic_is_documented_and_installed_bu", "label": "6. Alembic is documented and installed but not configured", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6. Alembic is documented and installed but not configured", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_important_findings", "label": "Important Findings", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Important Findings", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_7_api_routes_are_placeholders_with_no_sc", "label": "7. API routes are placeholders with no schemas or persistence", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7. API routes are placeholders with no schemas or persistence", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_8_admin_endpoints_are_unauthenticated", "label": "8. Admin endpoints are unauthenticated", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8. Admin endpoints are unauthenticated", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_9_email_approval_security_is_not_impleme", "label": "9. Email approval security is not implemented and not modeled yet", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "9. Email approval security is not implemented and not modeled yet", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_10_secret_key_has_an_unsafe_default", "label": "10. `SECRET_KEY` has an unsafe default", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "10. `SECRET_KEY` has an unsafe default", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_11_sqlalchemy_2_health_query_may_fail", "label": "11. SQLAlchemy 2 health query may fail", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "11. SQLAlchemy 2 health query may fail", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_12_docker_compose_exposes_backend_and_fr", "label": "12. Docker Compose exposes backend and frontend directly plus nginx", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "12. Docker Compose exposes backend and frontend directly plus nginx", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_13_nginx_ssl_and_rate_limiting_are_not_i", "label": "13. Nginx SSL and rate limiting are not implemented", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "13. Nginx SSL and rate limiting are not implemented", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_maintainability_findings", "label": "Maintainability Findings", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Maintainability Findings", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_14_model_file_is_too_large_for_early_ite", "label": "14. Model file is too large for early iteration and hides domain decisions", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "14. Model file is too large for early iteration and hides domain decisions", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_15_schema_constraints_are_only_partially", "label": "15. Schema constraints are only partially represented", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "15. Schema constraints are only partially represented", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_16_api_prefix_behavior_may_produce_trail", "label": "16. API prefix behavior may produce trailing-slash-only endpoints", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "16. API prefix behavior may produce trailing-slash-only endpoints", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_17_no_repository_level_quality_gates_exi", "label": "17. No repository-level quality gates exist", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "17. No repository-level quality gates exist", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_documentation_alignment", "label": "Documentation Alignment", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Documentation Alignment", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_recommended_remediation_order", "label": "Recommended Remediation Order", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Recommended Remediation Order", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_phase_0_make_skeleton_start_and_build", "label": "Phase 0: Make skeleton start and build", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 0: Make skeleton start and build", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_phase_1_establish_schema_migration_basel", "label": "Phase 1: Establish schema/migration baseline", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 1: Establish schema/migration baseline", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_phase_2_establish_api_and_security_basel", "label": "Phase 2: Establish API and security baseline", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 2: Establish API and security baseline", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_phase_3_implement_first_vertical_slice", "label": "Phase 3: Implement first vertical slice", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Phase 3: Implement first vertical slice", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_verification_matrix_to_add", "label": "Verification Matrix To Add", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verification Matrix To Add", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_repo_gpt5_5_md_final_assessment", "label": "Final Assessment", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Final Assessment", "community": 14, "community_name": "Blocking Findings", "source_file": "Review/repo-gpt5.5.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md", "label": "docs-claude.md", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 18.5, "font": {"size": 12, "color": "#ffffff"}, "title": "docs-claude.md", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 27}, {"id": "review_docs_claude_md_adversarial_documentation_review_claude", "label": "Adversarial Documentation Review \u2014 Claude", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Adversarial Documentation Review \u2014 Claude", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_verdict", "label": "Verdict", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Verdict", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_blocking", "label": "Blocking", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Blocking", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_b1_family_profile_is_internally_inconsis", "label": "B1. Family profile is internally inconsistent \u2014 the math doesn't close", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "B1. Family profile is internally inconsistent \u2014 the math doesn't close", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_b2_there_is_no_family_member_or_user_tab", "label": "B2. There is no `family_member` (or `user`) table \u2014 but the spec is per-person", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "B2. There is no `family_member` (or `user`) table \u2014 but the spec is per-person", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_b3_recipe_ingredient_relationship_is_doc", "label": "B3. Recipe\u2194ingredient relationship is documented two contradictory ways", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "B3. Recipe\u2194ingredient relationship is documented two contradictory ways", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_b4_there_is_no_authentication_anywhere_i", "label": "B4. There is no authentication anywhere in the system", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "B4. There is no authentication anywhere in the system", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_b5_approval_by_email_is_fragile_and_prob", "label": "B5. Approval-by-email is fragile and probably exploitable", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "B5. Approval-by-email is fragile and probably exploitable", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_b6_self_hosted_no_external_cloud_service", "label": "B6. \"Self-hosted, no external cloud services *except SendGrid*\" is undermined", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "B6. "Self-hosted, no external cloud services *except SendGrid*" is undermined", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_major", "label": "Major", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Major", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m1_scraping_legality_tos_unaddressed", "label": "M1. Scraping legality / ToS unaddressed", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "M1. Scraping legality / ToS unaddressed", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m2_phase_ordering_buries_the_hard_proble", "label": "M2. Phase ordering buries the hard problems behind weeks of plumbing", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "M2. Phase ordering buries the hard problems behind weeks of plumbing", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m3_apscheduler_multiple_workers_will_mis", "label": "M3. APScheduler + multiple workers will misfire", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "M3. APScheduler + multiple workers will misfire", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m4_schema_has_avoidable_defects", "label": "M4. Schema has avoidable defects", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "M4. Schema has avoidable defects", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m5_migration_story_is_muddled", "label": "M5. Migration story is muddled", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "M5. Migration story is muddled", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m6_if_both_approve_or_no_response_meal_c", "label": "M6. \"If both approve OR no response \u2192 meal confirmed\" is silence-as-consent", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "M6. "If both approve OR no response \u2192 meal confirmed" is silence-as-consent", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m7_calorie_target_appears_in_the_schema_", "label": "M7. \"Calorie target\" appears in the schema but is a non-goal", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "M7. "Calorie target" appears in the schema but is a non-goal", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m8_image_strategy_contradicts_itself", "label": "M8. Image strategy contradicts itself", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "M8. Image strategy contradicts itself", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_minor", "label": "Minor", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Minor", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m1_doc_hygiene", "label": "m1. Doc hygiene", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "m1. Doc hygiene", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m2_operational_gaps_not_in_any_doc", "label": "m2. Operational gaps not in any doc", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "m2. Operational gaps not in any doc", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m3_docker_compose_exposure", "label": "m3. Docker-compose exposure", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "m3. Docker-compose exposure", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m4_success_metrics_aren_t_measurable", "label": "m4. Success metrics aren't measurable", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "m4. Success metrics aren't measurable", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m5_future_features_are_mixed_into_the_im", "label": "m5. Future features are mixed into the implementation plan", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "m5. Future features are mixed into the implementation plan", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_m6_secret_key_ghost_variable", "label": "m6. `SECRET_KEY` ghost variable", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "m6. `SECRET_KEY` ghost variable", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_cross_doc_contradictions_summarized", "label": "Cross-doc contradictions, summarized", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Cross-doc contradictions, summarized", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_docs_claude_md_suggested_order_of_operations_before_any", "label": "Suggested order of operations before any more code", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Suggested order of operations before any more code", "community": 16, "community_name": "Adversarial Documentation Review \u2014", "source_file": "Review/docs-claude.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md", "label": "synthesis.md", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 13.5, "font": {"size": 0, "color": "#ffffff"}, "title": "synthesis.md", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 11}, {"id": "review_synthesis_md_review_synthesis_three_reviewers_compare", "label": "Review Synthesis \u2014 Three Reviewers Compared", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Review Synthesis \u2014 Three Reviewers Compared", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_1_strong_consensus_all_reviewers_blockin", "label": "1. Strong Consensus (all reviewers, blocking)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Strong Consensus (all reviewers, blocking)", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_2_partial_agreement_2_of_3", "label": "2. Partial Agreement (2 of 3)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. Partial Agreement (2 of 3)", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_3_unique_findings_only_one_reviewer", "label": "3. Unique Findings (only one reviewer)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Unique Findings (only one reviewer)", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_claude_only", "label": "Claude only", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Claude only", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_gpt_5_5_docs_only", "label": "GPT-5.5 docs only", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "GPT-5.5 docs only", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_gpt_5_5_repo_only_claude_could_not_have_", "label": "GPT-5.5 repo only (Claude could not have caught these \u2014 doc-only review)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "GPT-5.5 repo only (Claude could not have caught these \u2014 doc-only review)", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_4_where_reviewers_conflict", "label": "4. Where Reviewers Conflict", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4. Where Reviewers Conflict", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_5_combined_blocker_list_deduplicated_ran", "label": "5. Combined Blocker List (deduplicated, ranked)", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5. Combined Blocker List (deduplicated, ranked)", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_6_additional_investigation_needed", "label": "6. Additional Investigation Needed", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6. Additional Investigation Needed", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_synthesis_md_7_net_assessment", "label": "7. Net Assessment", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7. Net Assessment", "community": 33, "community_name": "Claude only", "source_file": "Review/synthesis.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md", "label": "reviewconcensus.md", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 19.2, "font": {"size": 12, "color": "#ffffff"}, "title": "reviewconcensus.md", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 29}, {"id": "review_reviewconcensus_md_review_consensus_feedback_for_originatin", "label": "Review Consensus \u2014 Feedback for Originating Agent", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Review Consensus \u2014 Feedback for Originating Agent", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_headline", "label": "Headline", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Headline", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_1_consensus_blockers_must_resolve_before", "label": "1. Consensus Blockers \u2014 must resolve before any further code", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1. Consensus Blockers \u2014 must resolve before any further code", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_1_1_recipe_ingredient_relationship_is_mo", "label": "1.1 Recipe \u2194 Ingredient relationship is modeled two contradictory ways", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.1 Recipe \u2194 Ingredient relationship is modeled two contradictory ways", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_1_2_no_authentication_exists_anywhere_in", "label": "1.2 No authentication exists anywhere in the system", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.2 No authentication exists anywhere in the system", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_1_3_email_approval_flow_is_unsafe_and_pr", "label": "1.3 Email approval flow is unsafe and probably exploitable", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.3 Email approval flow is unsafe and probably exploitable", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_1_4_no_family_member_table_despite_per_p", "label": "1.4 No `family_member` table despite per-person spec", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.4 No `family_member` table despite per-person spec", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_1_5_phase_status_is_contradictory_and_th", "label": "1.5 Phase status is contradictory and the skeleton does not work", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.5 Phase status is contradictory and the skeleton does not work", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_1_6_schema_has_avoidable_correctness_def", "label": "1.6 Schema has avoidable correctness defects", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.6 Schema has avoidable correctness defects", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_1_7_docker_compose_exposes_backend_8000_", "label": "1.7 Docker compose exposes backend (8000) and frontend (3000) directly", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.7 Docker compose exposes backend (8000) and frontend (3000) directly", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_1_8_production_deployment_claims_exceed_", "label": "1.8 Production deployment claims exceed implementation", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "1.8 Production deployment claims exceed implementation", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_2_high_risk_gaps_agreed_by_2_of_3_review", "label": "2. High-Risk Gaps \u2014 agreed by 2 of 3 reviewers", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2. High-Risk Gaps \u2014 agreed by 2 of 3 reviewers", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_2_1_migration_tooling_is_muddled", "label": "2.1 Migration tooling is muddled", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.1 Migration tooling is muddled", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_2_2_api_endpoint_contract_conflicts_acro", "label": "2.2 API endpoint contract conflicts across docs", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.2 API endpoint contract conflicts across docs", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_2_3_scraping_is_under_specified_and_risk", "label": "2.3 Scraping is under-specified and risky", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.3 Scraping is under-specified and risky", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_2_4_phase_ordering_hides_risk_behind_plu", "label": "2.4 Phase ordering hides risk behind plumbing", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.4 Phase ordering hides risk behind plumbing", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_2_5_shopping_list_math_is_not_implementa", "label": "2.5 Shopping-list math is not implementable from current docs", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.5 Shopping-list math is not implementable from current docs", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_2_6_environment_variables_inconsistent_a", "label": "2.6 Environment variables inconsistent across `.env.example`, ORIENTATION, RUNNING, plan", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.6 Environment variables inconsistent across `.env.example`, ORIENTATION, RUNNING, plan", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_2_7_accessibility_absent_despite_family_", "label": "2.7 Accessibility absent despite family-facing UI + email", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.7 Accessibility absent despite family-facing UI + email", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_2_8_health_check_will_fail_under_sqlalch", "label": "2.8 Health check will fail under SQLAlchemy 2", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "2.8 Health check will fail under SQLAlchemy 2", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_3_single_reviewer_findings_worth_keeping", "label": "3. Single-Reviewer Findings worth keeping", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "3. Single-Reviewer Findings worth keeping", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_from_claude", "label": "From Claude", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "From Claude", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_from_gpt_5_5_docs", "label": "From GPT-5.5 (docs)", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "From GPT-5.5 (docs)", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_from_gpt_5_5_repo", "label": "From GPT-5.5 (repo)", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "From GPT-5.5 (repo)", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_4_where_reviewers_disagreed", "label": "4. Where Reviewers Disagreed", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "4. Where Reviewers Disagreed", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_5_combined_remediation_order", "label": "5. Combined Remediation Order", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "5. Combined Remediation Order", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_6_verification_matrix_currently_failing_", "label": "6. Verification Matrix (currently failing \u2014 make this pass to claim Phase 1 complete)", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "6. Verification Matrix (currently failing \u2014 make this pass to claim Phase 1 complete)", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_7_additional_investigation_still_needed", "label": "7. Additional Investigation Still Needed", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "7. Additional Investigation Still Needed", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "review_reviewconcensus_md_8_suggested_response_format_from_origina", "label": "8. Suggested Response Format from Originating Agent", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "8. Suggested Response Format from Originating Agent", "community": 15, "community_name": "From Claude", "source_file": "Review/reviewconcensus.md", "file_type": "document", "degree": 1}, {"id": "backend_tests_fixtures_lucky_ca_weekly_ad_png", "label": "weekly_ad.png", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "weekly_ad.png", "community": 8, "community_name": "APScheduler entry point for", "source_file": "backend/tests/fixtures/lucky_ca/weekly_ad.png", "file_type": "image", "degree": 0}];
|
|
const RAW_EDGES = [{"from": "backend_app_database_py", "to": "database_get_db", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "database_get_db", "to": "security_require_session", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_security_py", "to": "security_require_admin", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_security_py", "to": "security_signer", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_security_py", "to": "security_issue_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_security_py", "to": "security_require_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_security_py", "to": "security_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "security_require_admin", "to": "security_rationale_30", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "security_signer", "to": "security_issue_session", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "security_signer", "to": "security_require_session", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "security_issue_session", "to": "security_rationale_50", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "security_issue_session", "to": "auth_login", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "security_require_session", "to": "security_rationale_55", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "security_require_session", "to": "str", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_main_py", "to": "main_health_check", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_main_py", "to": "main_health_check_db", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_health_check_db", "to": "str", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_config_py", "to": "config_settings", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_config_py", "to": "config_config", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_config_py", "to": "config_require_database_url", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "config_settings", "to": "basesettings", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "config_settings", "to": "test_auth_reload_settings", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "config_settings", "to": "test_config_test_database_url_required", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_models_init_py", "to": "enum", "label": "imports", "title": "imports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_dayofweek", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_mealtype", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_mealplanstatus", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_mealplanitemstatus", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_approvaltokenstatus", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_familymemberrole", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_denialreason", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_neversuggestreason", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_scrapestatus", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_emailstatus", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_ingredientmatchsource", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_familyprofile", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_familymember", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_total_time_minutes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_mealplan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_mealplanitem", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_mealplanvote", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_approvaltoken", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_homepantry", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_feedback", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_neversuggest", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_groceryitem", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_scrapelog", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_emaillog", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_ingredientgrocerymatch", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_models_init_py", "to": "init_weeklyrun", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealtype", "to": "backend_app_schemas_init_py", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealtype", "to": "str", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealtype", "to": "enum", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanstatus", "to": "backend_app_schemas_init_py", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanstatus", "to": "str", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanstatus", "to": "enum", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanitemstatus", "to": "str", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanitemstatus", "to": "backend_app_schemas_init_py", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanitemstatus", "to": "enum", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "str", "to": "init_familymemberrole", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "str", "to": "init_denialreason", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "str", "to": "init_neversuggestreason", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "str", "to": "auth_login", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "recipes_validate_ingredient_ids", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "ingredients_pin_match", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "meal_plans_generate", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "admin_trigger_scrape", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "admin_get_logs", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "admin_get_log", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "admin_get_email_logs", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "admin_get_all_meal_plans", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "admin_test_email", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "meals_get_vote_page", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "meals_get_meal_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "meals_move_meal_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "orchestrate_orchestrate_status", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "orchestrate_orchestrate_run_week", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "orchestrate_orchestrate_step", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "approval_issue_token", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "approval_consume_token", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "matcher_run_match_job", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "scraper_service_run_scrape_in_background", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "scraper_service_scraperservice_run_scrape", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "scraper_service_scraperservice_get_sale_items", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "cost_decimal", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "cost_scale", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "steps_step_generate", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "steps_step_email", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "steps_step_finalize", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "steps_step_reminder", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "lucky_ca_scraper_map_product", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "0007_seed_recipes_insert_recipes", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_alembic_test_alembic_upgrade_head_roundtrip", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_approval_test_issue_and_verify_token_roundtrip", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "conftest_schema", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_ingredient_api_seed_grocery", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_never_suggest_api_seed_family", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_planner_cost_match", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_planner_filter_cost", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_meal_plan_generate_api_test_generate_endpoint_returns_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_meal_plan_generate_api_test_generate_endpoint_requires_admin_token", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_meal_plan_generate_api_test_generate_endpoint_returns_404_for_unknown_family", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_swiftly_auth_test_mint_raises_on_firebase_non_200", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_swiftly_api_test_swiftly_auth_error_on_401_from_api", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "test_orchestrator_test_step_email_sends_per_member", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "spike_lucky_scrape_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "str", "to": "spike_swiftly_ingest_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familymemberrole", "to": "backend_app_schemas_init_py", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_familymemberrole", "to": "enum", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_denialreason", "to": "backend_app_schemas_init_py", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_denialreason", "to": "enum", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_neversuggestreason", "to": "backend_app_schemas_init_py", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_neversuggestreason", "to": "enum", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_neversuggestreason", "to": "never_suggest_coerce_reason", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familyprofile", "to": "base", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_familyprofile", "to": "test_approval_scenario", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familyprofile", "to": "test_never_suggest_api_seed_family", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familyprofile", "to": "test_planner_generate_test_generate_meal_plan_against_seeded_data", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familyprofile", "to": "test_meal_plan_generate_api_family_with_groceries", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familyprofile", "to": "test_orchestrator_family", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familyprofile", "to": "send_test_approval_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "base", "to": "init_familymember", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_ingredient", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_recipe", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_mealplan", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_mealplanitem", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_mealplanvote", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_approvaltoken", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_homepantry", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_feedback", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_neversuggest", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_groceryitem", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_scrapelog", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_emaillog", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_ingredientgrocerymatch", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base", "to": "init_weeklyrun", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_familymember", "to": "profile_add_member", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familymember", "to": "test_approval_scenario", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familymember", "to": "test_orchestrator_member", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_familymember", "to": "send_test_approval_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_ingredient", "to": "ingredients_create_ingredient", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_ingredient", "to": "scraper_service_scraperservice_save_grocery_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_ingredient", "to": "test_match_hook_test_run_match_job_persists_top_matches", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_recipe", "to": "recipes_create_recipe", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_recipe", "to": "test_approval_scenario", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_recipe", "to": "test_orchestrator_pending_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_recipe", "to": "test_orchestrator_approved_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_recipe", "to": "send_test_approval_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplan", "to": "meals_create_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplan", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplan", "to": "test_approval_scenario", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplan", "to": "test_orchestrator_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplan", "to": "send_test_approval_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanitem", "to": "meals_create_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanitem", "to": "meals_generate_single_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanitem", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanitem", "to": "test_approval_scenario", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanitem", "to": "test_orchestrator_pending_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanitem", "to": "test_orchestrator_approved_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanitem", "to": "send_test_approval_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanvote", "to": "meals_submit_vote", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanvote", "to": "test_approval_test_consume_token_single_use", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanvote", "to": "test_orchestrator_test_step_reminder_skips_voter", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_mealplanvote", "to": "test_orchestrator_test_step_reminder_no_sends_when_all_voted", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_homepantry", "to": "pantry_add_pantry_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_feedback", "to": "feedback_create_feedback", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_neversuggest", "to": "never_suggest_block", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_groceryitem", "to": "scraper_service_scraperservice_save_grocery_item", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_groceryitem", "to": "test_match_hook_test_run_match_job_persists_top_matches", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_groceryitem", "to": "test_ingredient_api_seed_grocery", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_groceryitem", "to": "test_planner_generate_test_generate_meal_plan_against_seeded_data", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_groceryitem", "to": "test_meal_plan_generate_api_family_with_groceries", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_scrapelog", "to": "scraper_service_enqueue_scrape", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_scrapelog", "to": "scraper_service_scraperservice_run_scrape", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_scrapelog", "to": "test_swiftly_api_test_background_runner_writes_failed_with_token_message", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_emaillog", "to": "admin_test_email", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_ingredientgrocerymatch", "to": "ingredients_pin_match", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_weeklyrun", "to": "runner_get_or_create_run", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_weeklyrun", "to": "test_orchestrator_weekly_run", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_weeklyrun", "to": "test_orchestrator_weekly_run_scraped", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_weeklyrun", "to": "test_orchestrator_weekly_run_generated", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_weeklyrun", "to": "test_orchestrator_weekly_run_emailed", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_weeklyrun", "to": "test_orchestrator_weekly_run_reminded", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_weeklyrun", "to": "test_orchestrator_weekly_run_deadline_passed", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_schemas_init_py", "to": "enum", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_ingredientbase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_ingredientresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_config", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_ingredientcreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_familymemberbase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_familymemberresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_familymembercreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_familyprofilebase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_familyprofileresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_familyprofilecreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_familyprofileupdate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_recipeingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_normalize", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_recipebase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_reciperesponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_recipecreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_mealplanitembase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_mealplanitemresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_mealplanitemcreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_mealplanbase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_mealplanresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_mealplancreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_voterequest", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_voteresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_homepantrybase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_homepantryresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_homepantrycreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_feedbackbase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_feedbackresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_feedbackcreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_shoppinglistitem", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_init_py", "to": "init_shoppinglistresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "enum", "to": "0001_initial_migration_upgrade", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "enum", "to": "0006_recipe_engine_thin_upgrade", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_ingredientbase", "to": "basemodel", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_ingredientbase", "to": "init_ingredientresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_ingredientbase", "to": "init_ingredientcreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_familymemberbase", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_familyprofilebase", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_familyprofileupdate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_recipeingredient", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_recipebase", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_mealplanitembase", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_mealplanbase", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_voterequest", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_voteresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_homepantrybase", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_feedbackbase", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_shoppinglistitem", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "init_shoppinglistresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "ingredient_ingredientbase", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "ingredient_ingredientupdate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "ingredient_ingredientgrocerymatchread", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "recipe_recipeingredientref", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "recipe_recipebase", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "recipe_recipeupdate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "recipe_resolveingredientrequest", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "recipe_resolveingredientcandidate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "recipe_resolveingredientresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "never_suggest_neversuggestcreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "never_suggest_neversuggestread", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "meal_plan_generation_generaterequest", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "meal_plan_generation_regeneraterequest", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "meal_plan_generation_generationitem", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "meal_plan_generation_generationdebug", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "meal_plan_generation_generationresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "auth_loginrequest", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "ingredients_pinmatchbody", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "basemodel", "to": "meals_votesubmission", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_familymemberbase", "to": "init_familymemberresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_familymemberbase", "to": "init_familymembercreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_familyprofilebase", "to": "init_familyprofileresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_familyprofilebase", "to": "init_familyprofilecreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_recipebase", "to": "init_reciperesponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_recipebase", "to": "init_recipecreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanitembase", "to": "init_mealplanitemresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanitembase", "to": "init_mealplanitemcreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanbase", "to": "init_mealplanresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_mealplanbase", "to": "init_mealplancreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_homepantrybase", "to": "init_homepantryresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_homepantrybase", "to": "init_homepantrycreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_feedbackbase", "to": "init_feedbackresponse", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_feedbackbase", "to": "init_feedbackcreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "init_shoppinglistitem", "to": "shopping_list_get_shopping_list", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "init_shoppinglistresponse", "to": "shopping_list_get_shopping_list", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_schemas_ingredient_py", "to": "ingredient_ingredientbase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_ingredient_py", "to": "ingredient_strip_and_drop_empty", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_ingredient_py", "to": "ingredient_ingredientcreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_ingredient_py", "to": "ingredient_ingredientupdate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_ingredient_py", "to": "ingredient_ingredientread", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_ingredient_py", "to": "ingredient_ingredientgrocerymatchread", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "ingredient_ingredientbase", "to": "ingredient_ingredientcreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "ingredient_ingredientbase", "to": "ingredient_ingredientread", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "ingredient_ingredientcreate", "to": "ingredients_pinmatchbody", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "ingredient_ingredientcreate", "to": "test_ingredient_schema_test_ingredient_create_normalizes_aliases", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "ingredient_ingredientupdate", "to": "ingredients_pinmatchbody", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "ingredient_ingredientread", "to": "ingredients_pinmatchbody", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "ingredient_ingredientgrocerymatchread", "to": "ingredients_pinmatchbody", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_schemas_recipe_py", "to": "recipe_recipeingredientref", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_recipe_py", "to": "recipe_recipebase", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_recipe_py", "to": "recipe_recipecreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_recipe_py", "to": "recipe_recipeupdate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_recipe_py", "to": "recipe_reciperead", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_recipe_py", "to": "recipe_resolveingredientrequest", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_recipe_py", "to": "recipe_resolveingredientcandidate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_recipe_py", "to": "recipe_resolveingredientresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipe_recipeingredientref", "to": "test_recipe_schema_test_recipe_create_requires_canonical_ingredient_ids", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "recipe_recipebase", "to": "recipe_recipecreate", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipe_recipebase", "to": "recipe_reciperead", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipe_recipecreate", "to": "test_recipe_schema_test_recipe_create_requires_canonical_ingredient_ids", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "recipe_recipecreate", "to": "test_recipe_schema_test_recipe_create_rejects_empty_ingredients", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "recipe_resolveingredientrequest", "to": "test_recipe_schema_test_resolve_ingredient_request_round_trip", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "recipe_resolveingredientcandidate", "to": "recipes_resolve_ingredient", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "recipe_resolveingredientresponse", "to": "recipes_resolve_ingredient", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_schemas_never_suggest_py", "to": "never_suggest_neversuggestcreate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_never_suggest_py", "to": "never_suggest_exactly_one_target", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_never_suggest_py", "to": "never_suggest_neversuggestread", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_meal_plan_generation_py", "to": "meal_plan_generation_generaterequest", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_meal_plan_generation_py", "to": "meal_plan_generation_regeneraterequest", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_meal_plan_generation_py", "to": "meal_plan_generation_generationitem", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_meal_plan_generation_py", "to": "meal_plan_generation_generationdebug", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_schemas_meal_plan_generation_py", "to": "meal_plan_generation_generationresponse", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_plan_generation_generationitem", "to": "meal_plans_to_response", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "meal_plan_generation_generationitem", "to": "meal_plans_get_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "meal_plan_generation_generationdebug", "to": "meal_plans_to_response", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "meal_plan_generation_generationdebug", "to": "meal_plans_get_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "meal_plan_generation_generationresponse", "to": "meal_plans_to_response", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "meal_plan_generation_generationresponse", "to": "meal_plans_get_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_api_profile_py", "to": "profile_get_profile", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_profile_py", "to": "profile_update_profile", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_profile_py", "to": "profile_get_members", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_profile_py", "to": "profile_add_member", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_profile_py", "to": "profile_delete_member", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_pantry_py", "to": "pantry_get_pantry_items", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_pantry_py", "to": "pantry_add_pantry_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_pantry_py", "to": "pantry_remove_pantry_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_pantry_py", "to": "pantry_update_pantry_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_auth_py", "to": "auth_loginrequest", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_auth_py", "to": "auth_login", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_auth_py", "to": "auth_logout", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_auth_py", "to": "auth_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_shopping_list_py", "to": "shopping_list_parse_uuid", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_shopping_list_py", "to": "shopping_list_get_shopping_list", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_shopping_list_py", "to": "shopping_list_print_shopping_list", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "shopping_list_parse_uuid", "to": "shopping_list_get_shopping_list", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_recipes_py", "to": "recipes_validate_ingredient_ids", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_recipes_py", "to": "recipes_serialize", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_recipes_py", "to": "recipes_list_recipes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_recipes_py", "to": "recipes_get_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_recipes_py", "to": "recipes_create_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_recipes_py", "to": "recipes_update_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_recipes_py", "to": "recipes_delete_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_recipes_py", "to": "recipes_parse_qty_unit", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_recipes_py", "to": "recipes_resolve_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipes_validate_ingredient_ids", "to": "recipes_create_recipe", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipes_validate_ingredient_ids", "to": "recipes_update_recipe", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipes_serialize", "to": "recipes_list_recipes", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipes_serialize", "to": "recipes_get_recipe", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipes_serialize", "to": "recipes_create_recipe", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipes_serialize", "to": "recipes_update_recipe", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "recipes_parse_qty_unit", "to": "recipes_resolve_ingredient", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_ingredients_py", "to": "ingredients_list_ingredients", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_ingredients_py", "to": "ingredients_get_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_ingredients_py", "to": "ingredients_create_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_ingredients_py", "to": "ingredients_update_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_ingredients_py", "to": "ingredients_delete_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_ingredients_py", "to": "ingredients_pinmatchbody", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_ingredients_py", "to": "ingredients_pin_match", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_ingredients_py", "to": "ingredients_unpin_match", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_never_suggest_py", "to": "never_suggest_coerce_reason", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_never_suggest_py", "to": "never_suggest_list_for_family", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_never_suggest_py", "to": "never_suggest_block", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_never_suggest_py", "to": "never_suggest_unblock", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "never_suggest_coerce_reason", "to": "never_suggest_block", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meal_plans_py", "to": "meal_plans_to_response", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meal_plans_py", "to": "meal_plans_generate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meal_plans_py", "to": "meal_plans_regenerate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meal_plans_py", "to": "meal_plans_get_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_plans_to_response", "to": "meal_plans_generate", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_plans_to_response", "to": "meal_plans_regenerate", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_plans_generate", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "meal_plans_regenerate", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_api_admin_py", "to": "admin_trigger_scrape", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_admin_py", "to": "admin_get_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_admin_py", "to": "admin_get_log", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_admin_py", "to": "admin_get_email_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_admin_py", "to": "admin_get_all_meal_plans", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_admin_py", "to": "admin_test_email", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_admin_py", "to": "admin_get_stats", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "admin_trigger_scrape", "to": "scraper_service_enqueue_scrape", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_test_email", "to": "email_get_email_backend", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_test_email", "to": "email_sendgridemailbackend_send", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_api_feedback_py", "to": "feedback_get_feedback", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_feedback_py", "to": "feedback_create_feedback", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "feedback_get_feedback", "to": "feedback_rationale_22", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "feedback_create_feedback", "to": "feedback_rationale_44", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_get_planned_meals", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_create_meal_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_get_meal_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_lock_meal_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_votesubmission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_get_vote_page", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_submit_vote", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_get_meal_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_swap_meal_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_approve_meal_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_deny_meal_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_generate_single_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_meals_py", "to": "meals_move_meal_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meals_votesubmission", "to": "meals_rationale_110", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meals_get_vote_page", "to": "meals_rationale_124", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meals_get_vote_page", "to": "approval_verify_token", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "meals_submit_vote", "to": "meals_rationale_257", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meals_submit_vote", "to": "approval_consume_token", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "meals_approve_meal_item", "to": "meals_rationale_343", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meals_deny_meal_item", "to": "meals_rationale_354", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meals_generate_single_item", "to": "meals_rationale_370", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meals_move_meal_item", "to": "meals_rationale_419", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_orchestrate_py", "to": "orchestrate_orchestrate_status", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_orchestrate_py", "to": "orchestrate_orchestrate_run_week", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_api_orchestrate_py", "to": "orchestrate_orchestrate_step", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_approval_py", "to": "approval_serializer", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_approval_py", "to": "approval_issue_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_approval_py", "to": "approval_verify_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_approval_py", "to": "approval_consume_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_approval_py", "to": "approval_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "approval_serializer", "to": "approval_issue_token", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "approval_serializer", "to": "approval_verify_token", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "approval_issue_token", "to": "steps_step_email", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_issue_token", "to": "steps_step_reminder", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_issue_token", "to": "test_approval_test_issue_and_verify_token_roundtrip", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_issue_token", "to": "test_approval_test_verify_rejects_tampered_token", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_issue_token", "to": "test_approval_test_verify_rejects_expired_token", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_issue_token", "to": "test_approval_test_consume_token_single_use", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_issue_token", "to": "test_approval_test_vote_get_renders_html", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_issue_token", "to": "test_approval_test_vote_post_records_and_decides", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_issue_token", "to": "send_test_approval_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_verify_token", "to": "approval_consume_token", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "approval_verify_token", "to": "test_approval_test_issue_and_verify_token_roundtrip", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_verify_token", "to": "test_approval_test_verify_rejects_tampered_token", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_verify_token", "to": "test_approval_test_verify_rejects_expired_token", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "approval_consume_token", "to": "approval_rationale_63", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "approval_consume_token", "to": "test_approval_test_consume_token_single_use", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_swiftly_auth_py", "to": "swiftly_auth_swiftlyauthminterror", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_swiftly_auth_py", "to": "swiftly_auth_reset_cache_for_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_swiftly_auth_py", "to": "swiftly_auth_decode_jwt_payload", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_swiftly_auth_py", "to": "swiftly_auth_fetch_firebase_api_key", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_swiftly_auth_py", "to": "swiftly_auth_mint_anonymous_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_swiftly_auth_py", "to": "swiftly_auth_get_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_swiftly_auth_py", "to": "swiftly_auth_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "exception", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "swiftly_auth_decode_jwt_payload", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "swiftly_auth_fetch_firebase_api_key", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "swiftly_auth_mint_anonymous_token", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "swiftly_auth_rationale_29", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_swiftlyautherror", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_luckycaliforniascraper", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_50", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_68", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_139", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_158", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_180", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_192", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_209", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_227", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_247", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_298", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "lucky_ca_scraper_rationale_318", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "test_swiftly_auth_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "test_swiftly_auth_rationale_72", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "test_swiftly_auth_rationale_100", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "test_swiftly_auth_rationale_119", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_swiftlyauthminterror", "to": "test_swiftly_auth_rationale_141", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "exception", "to": "lucky_ca_scraper_swiftlyautherror", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "exception", "to": "scraper_service_run_scrape_in_background", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "exception", "to": "alerts_send_admin_alert", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "exception", "to": "runner_run_step", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_reset_cache_for_tests", "to": "swiftly_auth_rationale_52", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_reset_cache_for_tests", "to": "test_swiftly_auth_clear_cache", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_decode_jwt_payload", "to": "swiftly_auth_mint_anonymous_token", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_fetch_firebase_api_key", "to": "swiftly_auth_mint_anonymous_token", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_mint_anonymous_token", "to": "swiftly_auth_get_token", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_mint_anonymous_token", "to": "swiftly_auth_rationale_106", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_get_token", "to": "swiftly_auth_rationale_161", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "swiftly_auth_get_token", "to": "test_swiftly_auth_test_get_token_mints_fresh_when_cache_empty", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_get_token", "to": "test_swiftly_auth_test_get_token_returns_cached_without_reminting", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_get_token", "to": "test_swiftly_auth_test_get_token_remints_when_cached_token_near_expiry", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "swiftly_auth_get_token", "to": "test_swiftly_auth_test_mint_raises_on_firebase_non_200", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_email_py", "to": "email_emailbackend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_email_py", "to": "email_consoleemailbackend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_email_py", "to": "email_sendgridemailbackend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_email_py", "to": "email_get_email_backend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_email_py", "to": "email_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "email_emailbackend", "to": "protocol", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "email_emailbackend", "to": "email_emailbackend_send", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "email_consoleemailbackend", "to": "email_consoleemailbackend_send", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "email_consoleemailbackend", "to": "email_get_email_backend", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "email_consoleemailbackend", "to": "email_rationale_41", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "email_sendgridemailbackend", "to": "email_sendgridemailbackend_init", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "email_sendgridemailbackend", "to": "email_sendgridemailbackend_send", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "email_sendgridemailbackend", "to": "email_get_email_backend", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "email_sendgridemailbackend", "to": "test_email_backend_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_sendgridemailbackend", "to": "test_email_backend_test_sendgrid_send_calls_api", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_sendgridemailbackend", "to": "test_email_backend_test_sendgrid_raises_on_4xx", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_sendgridemailbackend_send", "to": "alerts_send_admin_alert", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_sendgridemailbackend_send", "to": "steps_step_email", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_sendgridemailbackend_send", "to": "steps_step_finalize", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_sendgridemailbackend_send", "to": "steps_step_reminder", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_sendgridemailbackend_send", "to": "test_email_backend_test_sendgrid_send_calls_api", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_sendgridemailbackend_send", "to": "test_email_backend_test_sendgrid_raises_on_4xx", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_sendgridemailbackend_send", "to": "send_test_approval_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_get_email_backend", "to": "alerts_send_admin_alert", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_get_email_backend", "to": "steps_step_email", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_get_email_backend", "to": "steps_step_finalize", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_get_email_backend", "to": "steps_step_reminder", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "email_get_email_backend", "to": "send_test_approval_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_matcher_py", "to": "matcher_singularize", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_matcher_py", "to": "matcher_matchresult", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_matcher_py", "to": "matcher_sig_words", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_matcher_py", "to": "matcher_run_match_job", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_matcher_py", "to": "matcher_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "matcher_singularize", "to": "matcher_sig_words", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "matcher_singularize", "to": "matcher_rationale_43", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "matcher_sig_words", "to": "matcher_run_match_job", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "matcher_sig_words", "to": "matcher_rationale_94", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "matcher_sig_words", "to": "llm_matcher_get_candidates", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "matcher_run_match_job", "to": "matcher_rationale_109", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "matcher_run_match_job", "to": "scraper_service_run_scrape_in_background", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "matcher_run_match_job", "to": "test_match_hook_test_run_match_job_persists_top_matches", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "matcher_run_match_job", "to": "test_thin_phase4_smoke_test_match_job_runs_against_seeded_data", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "matcher_run_match_job", "to": "test_planner_generate_test_generate_meal_plan_against_seeded_data", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "matcher_run_match_job", "to": "test_meal_plan_generate_api_family_with_groceries", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_scraper_service_py", "to": "scraper_service_enqueue_scrape", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_scraper_service_py", "to": "scraper_service_run_scrape_in_background", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_scraper_service_py", "to": "scraper_service_scraperservice", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_scraper_service_py", "to": "scraper_service_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_enqueue_scrape", "to": "scraper_service_rationale_43", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_run_scrape_in_background", "to": "scraper_service_scraperservice", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_run_scrape_in_background", "to": "scraper_service_scraperservice_do_scrape", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_run_scrape_in_background", "to": "scraper_service_rationale_68", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_run_scrape_in_background", "to": "llm_matcher_run_llm_match_job", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "scraper_service_run_scrape_in_background", "to": "test_swiftly_api_test_background_runner_writes_failed_with_token_message", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "scraper_service_scraperservice", "to": "scraper_service_scraperservice_init", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_scraperservice", "to": "scraper_service_scraperservice_run_scrape", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_scraperservice", "to": "scraper_service_scraperservice_do_scrape", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_scraperservice", "to": "scraper_service_scraperservice_save_grocery_item", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_scraperservice", "to": "scraper_service_scraperservice_get_sale_items", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_scraperservice", "to": "steps_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "scraper_service_scraperservice", "to": "steps_step_scrape", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "scraper_service_scraperservice_run_scrape", "to": "scraper_service_scraperservice_do_scrape", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_scraperservice_run_scrape", "to": "scraper_service_rationale_130", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_scraperservice_run_scrape", "to": "steps_step_scrape", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "scraper_service_scraperservice_do_scrape", "to": "scraper_service_scraperservice_save_grocery_item", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_scraperservice_do_scrape", "to": "scraper_service_rationale_181", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scraper_service_scraperservice_do_scrape", "to": "lucky_ca_scraper_luckycaliforniascraper", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "scraper_service_scraperservice_do_scrape", "to": "lucky_ca_scraper_luckycaliforniascraper_fetch_all", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "scraper_service_scraperservice_do_scrape", "to": "lucky_ca_scraper_luckycaliforniascraper_cleanup", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_llm_matcher_py", "to": "llm_matcher_get_candidates", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_llm_matcher_py", "to": "llm_matcher_get_unmatched_ingredients", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_llm_matcher_py", "to": "llm_matcher_ask_ollama", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_llm_matcher_py", "to": "llm_matcher_run_llm_match_job", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_llm_matcher_py", "to": "llm_matcher_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "llm_matcher_get_candidates", "to": "llm_matcher_run_llm_match_job", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "llm_matcher_get_candidates", "to": "llm_matcher_rationale_42", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "llm_matcher_get_unmatched_ingredients", "to": "llm_matcher_run_llm_match_job", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "llm_matcher_get_unmatched_ingredients", "to": "llm_matcher_rationale_87", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "llm_matcher_ask_ollama", "to": "llm_matcher_run_llm_match_job", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "llm_matcher_ask_ollama", "to": "llm_matcher_rationale_98", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "llm_matcher_run_llm_match_job", "to": "llm_matcher_rationale_152", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_config_py", "to": "config_plannerconfig", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_config_py", "to": "config_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "config_plannerconfig", "to": "config_plannerconfig_validate", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "config_plannerconfig", "to": "filter_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "config_plannerconfig", "to": "score_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "config_plannerconfig", "to": "score_rationale_60", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "config_plannerconfig", "to": "select_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "config_plannerconfig", "to": "generate_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "config_plannerconfig", "to": "generate_rationale_33", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "config_plannerconfig", "to": "test_planner_select_rationale_50", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_planner_types_py", "to": "types_ingredientcost", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_types_py", "to": "types_recipecost", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_types_py", "to": "types_sale_coverage_pct", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_types_py", "to": "types_pantry_hit_pct", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_types_py", "to": "types_filterresult", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_types_py", "to": "types_scoredrecipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_types_py", "to": "types_generationresult", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_types_py", "to": "types_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "types_ingredientcost", "to": "cost_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_ingredientcost", "to": "cost_compute_recipe_cost", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_recipecost", "to": "cost_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_recipecost", "to": "filter_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_recipecost", "to": "score_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_recipecost", "to": "score_rationale_60", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_recipecost", "to": "test_planner_select_rationale_50", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_recipecost", "to": "cost_compute_recipe_cost", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_recipecost", "to": "test_planner_filter_cost", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_recipecost", "to": "test_planner_score_test_score_recipes_orders_by_combined_score", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_recipecost", "to": "test_planner_select_mk", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_filterresult", "to": "filter_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_filterresult", "to": "filter_filter_recipes", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_scoredrecipe", "to": "score_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_scoredrecipe", "to": "score_rationale_60", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_scoredrecipe", "to": "select_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_scoredrecipe", "to": "test_planner_select_rationale_50", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_scoredrecipe", "to": "score_score_recipes", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_scoredrecipe", "to": "test_planner_select_mk", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_generationresult", "to": "generate_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_generationresult", "to": "generate_rationale_33", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_generationresult", "to": "test_orchestrator_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_generationresult", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "types_generationresult", "to": "test_orchestrator_test_step_generate_creates_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_planner_cost_py", "to": "cost_decimal", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_cost_py", "to": "cost_scale", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_cost_py", "to": "cost_compute_recipe_cost", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_cost_py", "to": "cost_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "cost_decimal", "to": "cost_compute_recipe_cost", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "cost_scale", "to": "cost_compute_recipe_cost", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "cost_compute_recipe_cost", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "cost_compute_recipe_cost", "to": "test_planner_cost_test_compute_recipe_cost_sums_ingredient_costs", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "cost_compute_recipe_cost", "to": "test_planner_cost_test_unmatched_ingredient_zero_cost_and_savings", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "cost_compute_recipe_cost", "to": "test_planner_cost_test_pantry_hits_counted", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_planner_filter_py", "to": "filter_calorie_band", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_filter_py", "to": "filter_filter_recipes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_filter_py", "to": "filter_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "filter_calorie_band", "to": "filter_filter_recipes", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "filter_filter_recipes", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "filter_filter_recipes", "to": "test_planner_filter_test_filter_blocks_by_never_suggest_ingredient", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "filter_filter_recipes", "to": "test_planner_filter_test_filter_blocks_by_never_suggest_recipe", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "filter_filter_recipes", "to": "test_planner_filter_test_filter_blocks_by_recency", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "filter_filter_recipes", "to": "test_planner_filter_test_filter_blocks_by_calories", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "filter_filter_recipes", "to": "test_planner_filter_test_filter_blocks_by_time", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "filter_filter_recipes", "to": "test_planner_filter_test_filter_blocks_by_cost", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "filter_filter_recipes", "to": "test_planner_filter_test_filter_passes_when_calorie_target_is_none", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "filter_filter_recipes", "to": "test_planner_filter_test_filter_blocks_recipe_with_null_calories_when_target_set", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_planner_score_py", "to": "score_time_bonus", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_score_py", "to": "score_recency_bonus", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_score_py", "to": "score_normalize_savings", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_score_py", "to": "score_score_recipes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_score_py", "to": "score_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "score_time_bonus", "to": "score_score_recipes", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "score_time_bonus", "to": "test_planner_score_test_time_bonus_capped_at_ideal", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "score_time_bonus", "to": "test_planner_score_test_time_bonus_decays_to_zero_at_full", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "score_time_bonus", "to": "test_planner_score_test_time_bonus_linear_midpoint", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "score_recency_bonus", "to": "score_score_recipes", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "score_recency_bonus", "to": "test_planner_score_test_recency_bonus_full_when_long_ago", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "score_recency_bonus", "to": "test_planner_score_test_recency_bonus_zero_when_just_eligible", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "score_recency_bonus", "to": "test_planner_score_test_recency_bonus_full_when_never_cooked", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "score_normalize_savings", "to": "score_score_recipes", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "score_normalize_savings", "to": "test_planner_score_test_normalize_savings_minmax", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "score_normalize_savings", "to": "test_planner_score_test_normalize_savings_uniform_returns_zeros", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "score_score_recipes", "to": "score_rationale_60", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "score_score_recipes", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "score_score_recipes", "to": "test_planner_score_test_score_recipes_orders_by_combined_score", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_planner_select_py", "to": "select_set_diversity_penalty", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_select_py", "to": "select_set_score", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_select_py", "to": "select_select_set", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_select_py", "to": "select_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "select_set_diversity_penalty", "to": "select_set_score", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "select_set_diversity_penalty", "to": "test_planner_select_test_diversity_penalty_zero_when_all_unique", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "select_set_diversity_penalty", "to": "test_planner_select_test_diversity_penalty_three_chickens", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "select_set_score", "to": "select_select_set", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "select_select_set", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "select_select_set", "to": "test_planner_select_test_select_set_picks_diverse_over_homogeneous", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "select_select_set", "to": "test_planner_select_test_select_set_handles_too_few", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "select_select_set", "to": "test_planner_select_test_select_set_empty_input", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_planner_generate_py", "to": "generate_load_match_index", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_generate_py", "to": "generate_load_blocklists", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_generate_py", "to": "generate_load_pantry", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_generate_py", "to": "generate_load_last_cooked", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_generate_py", "to": "generate_generate_meal_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_planner_generate_py", "to": "generate_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "generate_load_match_index", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "generate_load_match_index", "to": "generate_rationale_33", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "generate_load_blocklists", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "generate_load_pantry", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "generate_load_last_cooked", "to": "generate_generate_meal_plan", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "generate_generate_meal_plan", "to": "steps_step_generate", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "generate_generate_meal_plan", "to": "test_planner_generate_test_generate_meal_plan_against_seeded_data", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_orchestrator_alerts_py", "to": "alerts_send_admin_alert", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "alerts_send_admin_alert", "to": "steps_step_scrape", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "alerts_send_admin_alert", "to": "steps_step_generate", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "alerts_send_admin_alert", "to": "test_orchestrator_test_send_admin_alert_noop_when_email_unset", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "alerts_send_admin_alert", "to": "test_orchestrator_test_send_admin_alert_calls_backend", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_orchestrator_runner_py", "to": "runner_current_week_start", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_runner_py", "to": "runner_get_or_create_run", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_runner_py", "to": "runner_run_step", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_runner_py", "to": "runner_run_week", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_runner_py", "to": "runner_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "runner_current_week_start", "to": "runner_run_step", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "runner_current_week_start", "to": "runner_run_week", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "runner_current_week_start", "to": "runner_rationale_21", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "runner_get_or_create_run", "to": "runner_run_step", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "runner_run_step", "to": "runner_run_week", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "runner_run_step", "to": "test_orchestrator_test_run_step_upserts_weekly_run", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "runner_run_step", "to": "test_orchestrator_test_run_step_invalid_raises", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "runner_run_week", "to": "test_orchestrator_test_run_week_calls_all_steps", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_services_orchestrator_steps_py", "to": "steps_step_scrape", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_steps_py", "to": "steps_step_generate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_steps_py", "to": "steps_step_email", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_steps_py", "to": "steps_step_deadline", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_steps_py", "to": "steps_step_finalize", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_steps_py", "to": "steps_step_reminder", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_services_orchestrator_steps_py", "to": "steps_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "steps_step_scrape", "to": "test_orchestrator_test_step_scrape_idempotent", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_scrape", "to": "test_orchestrator_test_step_scrape_success", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_scrape", "to": "test_orchestrator_test_step_scrape_both_fail_marks_stale", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_generate", "to": "test_orchestrator_test_step_generate_idempotent", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_generate", "to": "test_orchestrator_test_step_generate_creates_plan", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_generate", "to": "test_orchestrator_test_step_generate_records_error_on_failure", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_email", "to": "test_orchestrator_test_step_email_idempotent", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_email", "to": "test_orchestrator_test_step_email_sends_per_member", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_email", "to": "test_orchestrator_test_step_email_stale_banner", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_email", "to": "test_orchestrator_test_step_email_escapes_recipe_name", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_deadline", "to": "test_orchestrator_test_step_deadline_idempotent", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_deadline", "to": "test_orchestrator_test_step_deadline_resolves_pending_to_approved", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_deadline", "to": "test_orchestrator_test_step_deadline_resolves_pending_to_denied", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_finalize", "to": "test_orchestrator_test_step_finalize_idempotent", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_finalize", "to": "test_orchestrator_test_step_finalize_sends_shopping_list", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_finalize", "to": "test_orchestrator_test_step_finalize_no_approved_sends_empty_message", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_reminder", "to": "test_orchestrator_test_step_reminder_idempotent", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_reminder", "to": "test_orchestrator_test_step_reminder_skips_when_not_emailed", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_reminder", "to": "test_orchestrator_test_step_reminder_sends_to_non_voter", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_reminder", "to": "test_orchestrator_test_step_reminder_skips_voter", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "steps_step_reminder", "to": "test_orchestrator_test_step_reminder_no_sends_when_all_voted", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_scraper_base_py", "to": "abc", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_base_py", "to": "base_basescraper", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_base_py", "to": "base_scrape", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_base_py", "to": "base_seleniumscraper", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_base_py", "to": "backend_app_scraper_init_py", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper", "to": "abc", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper", "to": "base_basescraper_init", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper", "to": "base_basescraper_create_session", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper", "to": "base_basescraper_rate_limit", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper", "to": "base_basescraper_get", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper", "to": "base_basescraper_post", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper", "to": "base_basescraper_log_scrape", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper", "to": "base_seleniumscraper", "label": "inherits", "title": "inherits [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper_init", "to": "base_basescraper_create_session", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper_rate_limit", "to": "base_basescraper_get", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_basescraper_rate_limit", "to": "base_basescraper_post", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_seleniumscraper", "to": "base_seleniumscraper_init", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_seleniumscraper", "to": "base_seleniumscraper_init_playwright", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_seleniumscraper", "to": "base_seleniumscraper_get_playwright", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_seleniumscraper", "to": "base_seleniumscraper_get_browser_page", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_seleniumscraper", "to": "base_seleniumscraper_cleanup", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_seleniumscraper_init_playwright", "to": "base_seleniumscraper_get_playwright", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "base_seleniumscraper_get_playwright", "to": "base_seleniumscraper_get_browser_page", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_init_py", "to": "backend_app_scraper_lucky_ca_scraper_py", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_lucky_ca_scraper_py", "to": "lucky_ca_scraper_swiftlyautherror", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_lucky_ca_scraper_py", "to": "lucky_ca_scraper_luckycaliforniascraper", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_lucky_ca_scraper_py", "to": "lucky_ca_scraper_parse_categories_html", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_lucky_ca_scraper_py", "to": "lucky_ca_scraper_parse_category_response", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_lucky_ca_scraper_py", "to": "lucky_ca_scraper_map_product", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_lucky_ca_scraper_py", "to": "lucky_ca_scraper_parse_price", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_lucky_ca_scraper_py", "to": "lucky_ca_scraper_aisle_from_slug", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_app_scraper_lucky_ca_scraper_py", "to": "lucky_ca_scraper_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_swiftlyautherror", "to": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_swiftlyautherror", "to": "lucky_ca_scraper_rationale_50", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_swiftlyautherror", "to": "test_swiftly_api_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_swiftlyautherror", "to": "test_swiftly_api_rationale_41", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_swiftlyautherror", "to": "test_swiftly_api_rationale_58", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_swiftlyautherror", "to": "test_swiftly_api_rationale_108", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_swiftlyautherror", "to": "test_swiftly_api_rationale_136", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_swiftlyautherror", "to": "test_swiftly_api_rationale_172", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_swiftlyautherror", "to": "spike_swiftly_ingest_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "lucky_ca_scraper_luckycaliforniascraper_init", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "lucky_ca_scraper_luckycaliforniascraper_cleanup", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "lucky_ca_scraper_luckycaliforniascraper_scrape", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "lucky_ca_scraper_luckycaliforniascraper_fetch_all", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "lucky_ca_scraper_luckycaliforniascraper_discover_categories", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "lucky_ca_scraper_luckycaliforniascraper_rate_limit", "label": "method", "title": "method [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "lucky_ca_scraper_rationale_68", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "test_swiftly_api_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "test_swiftly_api_rationale_41", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "test_swiftly_api_rationale_58", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "test_swiftly_api_rationale_108", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "test_swiftly_api_rationale_136", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "test_swiftly_api_rationale_172", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "spike_lucky_scrape_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "spike_swiftly_ingest_rationale_1", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "test_swiftly_api_test_swiftly_auth_error_on_401_from_api", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "test_swiftly_api_test_fetch_category_mints_token_when_none_pinned", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "spike_lucky_scrape_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper", "to": "spike_swiftly_ingest_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_cleanup", "to": "spike_swiftly_ingest_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_scrape", "to": "lucky_ca_scraper_luckycaliforniascraper_fetch_all", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_scrape", "to": "lucky_ca_scraper_rationale_139", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_all", "to": "lucky_ca_scraper_luckycaliforniascraper_discover_categories", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_all", "to": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_all", "to": "lucky_ca_scraper_aisle_from_slug", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_all", "to": "lucky_ca_scraper_map_product", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_all", "to": "lucky_ca_scraper_rationale_158", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_discover_categories", "to": "lucky_ca_scraper_luckycaliforniascraper_rate_limit", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_discover_categories", "to": "lucky_ca_scraper_parse_categories_html", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_discover_categories", "to": "lucky_ca_scraper_rationale_180", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_discover_categories", "to": "spike_swiftly_ingest_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_parse_categories_html", "to": "test_swiftly_api_test_parse_categories_fixture", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "to": "lucky_ca_scraper_luckycaliforniascraper_rate_limit", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "to": "lucky_ca_scraper_parse_category_response", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "to": "lucky_ca_scraper_rationale_209", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "to": "test_swiftly_api_test_swiftly_auth_error_on_401_from_api", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "to": "test_swiftly_api_test_fetch_category_mints_token_when_none_pinned", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_luckycaliforniascraper_fetch_category", "to": "spike_swiftly_ingest_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_parse_category_response", "to": "test_swiftly_api_test_parse_category_response_fixture", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_map_product", "to": "lucky_ca_scraper_parse_price", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "lucky_ca_scraper_map_product", "to": "test_swiftly_api_test_parse_category_response_fixture", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_map_product", "to": "test_swiftly_api_test_map_product_returns_none_for_unparseable", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_map_product", "to": "spike_swiftly_ingest_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "lucky_ca_scraper_aisle_from_slug", "to": "spike_swiftly_ingest_main", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "backend_app_scheduler_main_py", "to": "main_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_env_py", "to": "env_run_migrations_offline", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_env_py", "to": "env_run_migrations_online", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0003_grocery_item_description_py", "to": "0003_grocery_item_description_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0003_grocery_item_description_py", "to": "0003_grocery_item_description_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0003_grocery_item_description_py", "to": "0003_grocery_item_description_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0002_seed_data_py", "to": "0002_seed_data_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0002_seed_data_py", "to": "0002_seed_data_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0002_seed_data_py", "to": "0002_seed_data_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0004_family_profile_calorie_target_py", "to": "0004_family_profile_calorie_target_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0004_family_profile_calorie_target_py", "to": "0004_family_profile_calorie_target_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0004_family_profile_calorie_target_py", "to": "0004_family_profile_calorie_target_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0001_initial_migration_py", "to": "0001_initial_migration_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0001_initial_migration_py", "to": "0001_initial_migration_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0001_initial_migration_py", "to": "0001_initial_migration_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0005_grocery_item_external_id_py", "to": "0005_grocery_item_external_id_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0005_grocery_item_external_id_py", "to": "0005_grocery_item_external_id_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0005_grocery_item_external_id_py", "to": "0005_grocery_item_external_id_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0006_recipe_engine_thin_py", "to": "0006_recipe_engine_thin_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0006_recipe_engine_thin_py", "to": "0006_recipe_engine_thin_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0006_recipe_engine_thin_py", "to": "0006_recipe_engine_thin_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0007_seed_recipes_py", "to": "0007_seed_recipes_upsert_ingredients", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0007_seed_recipes_py", "to": "0007_seed_recipes_insert_recipes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0007_seed_recipes_py", "to": "0007_seed_recipes_delete_recipes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0007_seed_recipes_py", "to": "0007_seed_recipes_delete_ingredients", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0007_seed_recipes_py", "to": "0007_seed_recipes_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0007_seed_recipes_py", "to": "0007_seed_recipes_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0007_seed_recipes_py", "to": "0007_seed_recipes_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "0007_seed_recipes_upsert_ingredients", "to": "0007_seed_recipes_upgrade", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "0007_seed_recipes_insert_recipes", "to": "0007_seed_recipes_upgrade", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "0007_seed_recipes_delete_recipes", "to": "0007_seed_recipes_downgrade", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "0007_seed_recipes_delete_ingredients", "to": "0007_seed_recipes_downgrade", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "0007_seed_recipes_delete_ingredients", "to": "0007_seed_recipes_rationale_833", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0008_phase5_orchestration_py", "to": "0008_phase5_orchestration_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0008_phase5_orchestration_py", "to": "0008_phase5_orchestration_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0008_phase5_orchestration_py", "to": "0008_phase5_orchestration_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0009_phase6_reminded_at_py", "to": "0009_phase6_reminded_at_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0009_phase6_reminded_at_py", "to": "0009_phase6_reminded_at_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0009_phase6_reminded_at_py", "to": "0009_phase6_reminded_at_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0010_auto_llm_source_py", "to": "0010_auto_llm_source_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0010_auto_llm_source_py", "to": "0010_auto_llm_source_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_alembic_versions_0010_auto_llm_source_py", "to": "0010_auto_llm_source_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_alembic_py", "to": "test_alembic_test_alembic_upgrade_head_roundtrip", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_alembic_py", "to": "test_alembic_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_smoke_py", "to": "test_smoke_test_app_imports", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_smoke_py", "to": "test_smoke_test_health", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_smoke_py", "to": "test_smoke_test_health_db", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_smoke_py", "to": "test_smoke_test_router_list_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_smoke_py", "to": "test_smoke_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_smoke_test_router_list_endpoints", "to": "test_smoke_rationale_50", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_auth_py", "to": "test_auth_reload_settings", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_auth_py", "to": "test_auth_test_admin_requires_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_auth_py", "to": "test_auth_test_admin_logs_requires_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_auth_py", "to": "test_auth_test_session_required_for_mutation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_auth_py", "to": "test_auth_test_session_open_for_reads", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_auth_py", "to": "test_auth_test_session_login_logout", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_auth_py", "to": "test_auth_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_auth_reload_settings", "to": "test_auth_rationale_26", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_auth_test_admin_requires_token", "to": "test_auth_rationale_42", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_auth_test_session_required_for_mutation", "to": "test_auth_rationale_70", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_auth_test_session_open_for_reads", "to": "test_auth_rationale_80", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_scrape_endpoint_py", "to": "test_scrape_endpoint_admin_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_scrape_endpoint_py", "to": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_scrape_endpoint_py", "to": "test_scrape_endpoint_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "to": "test_scrape_endpoint_rationale_27", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_approval_py", "to": "test_approval_test_issue_and_verify_token_roundtrip", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_approval_py", "to": "test_approval_test_verify_rejects_tampered_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_approval_py", "to": "test_approval_test_verify_rejects_expired_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_approval_py", "to": "test_approval_scenario", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_approval_py", "to": "test_approval_test_consume_token_single_use", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_approval_py", "to": "test_approval_test_vote_get_renders_html", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_approval_py", "to": "test_approval_test_vote_post_records_and_decides", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_approval_py", "to": "test_approval_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_approval_test_verify_rejects_expired_token", "to": "test_approval_rationale_43", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_approval_scenario", "to": "test_approval_rationale_75", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_approval_test_vote_post_records_and_decides", "to": "test_approval_rationale_208", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_config_py", "to": "test_config_test_database_url_required", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_config_py", "to": "test_config_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_config_test_database_url_required", "to": "test_config_rationale_13", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_schema_py", "to": "test_ingredient_schema_test_ingredient_create_normalizes_aliases", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_schema_py", "to": "test_ingredient_schema_test_ingredient_match_read_round_trip", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_recipe_schema_py", "to": "test_recipe_schema_test_recipe_create_requires_canonical_ingredient_ids", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_recipe_schema_py", "to": "test_recipe_schema_test_recipe_create_rejects_empty_ingredients", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_recipe_schema_py", "to": "test_recipe_schema_test_resolve_ingredient_request_round_trip", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_recipe_api_py", "to": "test_recipe_api_admin_headers", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_recipe_api_py", "to": "test_recipe_api_new_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_recipe_api_py", "to": "test_recipe_api_test_create_recipe_with_canonical_ingredients", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_recipe_api_py", "to": "test_recipe_api_test_create_recipe_rejects_unknown_ingredient_id", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_recipe_api_py", "to": "test_recipe_api_test_list_recipes_returns_seeded_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_recipe_api_admin_headers", "to": "test_recipe_api_new_ingredient", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_recipe_api_admin_headers", "to": "test_recipe_api_test_create_recipe_with_canonical_ingredients", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_recipe_api_admin_headers", "to": "test_recipe_api_test_create_recipe_rejects_unknown_ingredient_id", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_recipe_api_admin_headers", "to": "test_recipe_api_test_list_recipes_returns_seeded_data", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_recipe_api_new_ingredient", "to": "test_recipe_api_test_create_recipe_with_canonical_ingredients", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_recipe_api_new_ingredient", "to": "test_recipe_api_test_list_recipes_returns_seeded_data", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_resolve_ingredient_py", "to": "test_resolve_ingredient_admin", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_resolve_ingredient_py", "to": "test_resolve_ingredient_seed_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_resolve_ingredient_py", "to": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_resolve_ingredient_py", "to": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_resolve_ingredient_admin", "to": "test_resolve_ingredient_seed_ingredient", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_resolve_ingredient_admin", "to": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_resolve_ingredient_admin", "to": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_resolve_ingredient_seed_ingredient", "to": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_resolve_ingredient_seed_ingredient", "to": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_matcher_py", "to": "test_matcher_test_build_match_pool_includes_aliases", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_matcher_py", "to": "test_matcher_test_rank_candidates_top_n_with_threshold", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_matcher_py", "to": "test_matcher_test_rank_candidates_drops_below_threshold", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_match_hook_py", "to": "test_match_hook_test_run_match_job_persists_top_matches", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_match_hook_test_run_match_job_persists_top_matches", "to": "test_match_hook_rationale_7", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_resolve_test_dsn", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_postgres_reachable", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_pytest_collection_modifyitems", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_pytest_configure", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_schema", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_engine", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_db", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_db_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_client", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_client_no_db", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_conftest_py", "to": "conftest_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "conftest_pytest_collection_modifyitems", "to": "conftest_rationale_73", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "conftest_db", "to": "conftest_rationale_143", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "conftest_db_session", "to": "conftest_rationale_160", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "conftest_client", "to": "conftest_rationale_173", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "conftest_client_no_db", "to": "conftest_rationale_194", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_admin_headers", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_test_create_ingredient_returns_201_with_id", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_test_create_ingredient_rejects_duplicate_name", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_test_list_ingredients_supports_search", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_test_create_ingredient_requires_admin_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_test_update_ingredient_replaces_aliases", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_seed_grocery", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_test_pin_manual_match", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_test_unpin_manual_match", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_ingredient_api_py", "to": "test_ingredient_api_test_delete_ingredient_removes_row", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_ingredient_api_admin_headers", "to": "test_ingredient_api_test_create_ingredient_returns_201_with_id", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_ingredient_api_admin_headers", "to": "test_ingredient_api_test_create_ingredient_rejects_duplicate_name", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_ingredient_api_admin_headers", "to": "test_ingredient_api_test_list_ingredients_supports_search", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_ingredient_api_admin_headers", "to": "test_ingredient_api_test_update_ingredient_replaces_aliases", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_ingredient_api_admin_headers", "to": "test_ingredient_api_test_pin_manual_match", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_ingredient_api_admin_headers", "to": "test_ingredient_api_test_unpin_manual_match", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_ingredient_api_admin_headers", "to": "test_ingredient_api_test_delete_ingredient_removes_row", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_ingredient_api_seed_grocery", "to": "test_ingredient_api_test_pin_manual_match", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_ingredient_api_seed_grocery", "to": "test_ingredient_api_test_unpin_manual_match", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_never_suggest_api_py", "to": "test_never_suggest_api_admin", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_never_suggest_api_py", "to": "test_never_suggest_api_seed_family", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_never_suggest_api_py", "to": "test_never_suggest_api_test_block_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_never_suggest_api_py", "to": "test_never_suggest_api_test_list_never_suggest_for_family", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_never_suggest_api_py", "to": "test_never_suggest_api_test_unblock_removes_row", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_never_suggest_api_admin", "to": "test_never_suggest_api_test_block_ingredient", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_never_suggest_api_admin", "to": "test_never_suggest_api_test_list_never_suggest_for_family", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_never_suggest_api_admin", "to": "test_never_suggest_api_test_unblock_removes_row", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_never_suggest_api_seed_family", "to": "test_never_suggest_api_test_block_ingredient", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_never_suggest_api_seed_family", "to": "test_never_suggest_api_test_list_never_suggest_for_family", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_never_suggest_api_seed_family", "to": "test_never_suggest_api_test_unblock_removes_row", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_thin_phase4_smoke_py", "to": "test_thin_phase4_smoke_admin", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_thin_phase4_smoke_py", "to": "test_thin_phase4_smoke_test_seed_data_present_and_resolvable", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_thin_phase4_smoke_py", "to": "test_thin_phase4_smoke_test_resolve_against_seeded_ingredients", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_thin_phase4_smoke_py", "to": "test_thin_phase4_smoke_test_match_job_runs_against_seeded_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_thin_phase4_smoke_py", "to": "test_thin_phase4_smoke_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_thin_phase4_smoke_admin", "to": "test_thin_phase4_smoke_test_resolve_against_seeded_ingredients", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_cost_py", "to": "test_planner_cost_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_cost_py", "to": "test_planner_cost_match", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_cost_py", "to": "test_planner_cost_test_compute_recipe_cost_sums_ingredient_costs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_cost_py", "to": "test_planner_cost_test_unmatched_ingredient_zero_cost_and_savings", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_cost_py", "to": "test_planner_cost_test_pantry_hits_counted", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_cost_ingredient", "to": "test_planner_cost_test_compute_recipe_cost_sums_ingredient_costs", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_cost_ingredient", "to": "test_planner_cost_test_unmatched_ingredient_zero_cost_and_savings", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_cost_ingredient", "to": "test_planner_cost_test_pantry_hits_counted", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_cost_match", "to": "test_planner_cost_test_compute_recipe_cost_sums_ingredient_costs", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_cost_match", "to": "test_planner_cost_test_pantry_hits_counted", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_cost", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_test_filter_blocks_by_never_suggest_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_test_filter_blocks_by_never_suggest_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_test_filter_blocks_by_recency", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_test_filter_blocks_by_calories", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_test_filter_blocks_by_time", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_test_filter_blocks_by_cost", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_test_filter_passes_when_calorie_target_is_none", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_filter_py", "to": "test_planner_filter_test_filter_blocks_recipe_with_null_calories_when_target_set", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_recipe", "to": "test_planner_filter_test_filter_blocks_by_never_suggest_ingredient", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_recipe", "to": "test_planner_filter_test_filter_blocks_by_never_suggest_recipe", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_recipe", "to": "test_planner_filter_test_filter_blocks_by_recency", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_recipe", "to": "test_planner_filter_test_filter_blocks_by_calories", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_recipe", "to": "test_planner_filter_test_filter_blocks_by_time", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_recipe", "to": "test_planner_filter_test_filter_blocks_by_cost", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_recipe", "to": "test_planner_filter_test_filter_passes_when_calorie_target_is_none", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_recipe", "to": "test_planner_filter_test_filter_blocks_recipe_with_null_calories_when_target_set", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_cost", "to": "test_planner_filter_test_filter_blocks_by_never_suggest_ingredient", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_cost", "to": "test_planner_filter_test_filter_blocks_by_never_suggest_recipe", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_cost", "to": "test_planner_filter_test_filter_blocks_by_recency", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_cost", "to": "test_planner_filter_test_filter_blocks_by_calories", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_cost", "to": "test_planner_filter_test_filter_blocks_by_time", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_cost", "to": "test_planner_filter_test_filter_blocks_by_cost", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_cost", "to": "test_planner_filter_test_filter_passes_when_calorie_target_is_none", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_filter_cost", "to": "test_planner_filter_test_filter_blocks_recipe_with_null_calories_when_target_set", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_score_py", "to": "test_planner_score_test_time_bonus_capped_at_ideal", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_score_py", "to": "test_planner_score_test_time_bonus_decays_to_zero_at_full", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_score_py", "to": "test_planner_score_test_time_bonus_linear_midpoint", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_score_py", "to": "test_planner_score_test_recency_bonus_full_when_long_ago", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_score_py", "to": "test_planner_score_test_recency_bonus_zero_when_just_eligible", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_score_py", "to": "test_planner_score_test_recency_bonus_full_when_never_cooked", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_score_py", "to": "test_planner_score_test_normalize_savings_minmax", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_score_py", "to": "test_planner_score_test_normalize_savings_uniform_returns_zeros", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_score_py", "to": "test_planner_score_test_score_recipes_orders_by_combined_score", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_select_py", "to": "test_planner_select_mk", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_select_py", "to": "test_planner_select_test_diversity_penalty_zero_when_all_unique", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_select_py", "to": "test_planner_select_test_diversity_penalty_three_chickens", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_select_py", "to": "test_planner_select_test_select_set_picks_diverse_over_homogeneous", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_select_py", "to": "test_planner_select_test_select_set_handles_too_few", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_select_py", "to": "test_planner_select_test_select_set_empty_input", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_select_mk", "to": "test_planner_select_test_diversity_penalty_zero_when_all_unique", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_select_mk", "to": "test_planner_select_test_diversity_penalty_three_chickens", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_select_mk", "to": "test_planner_select_test_select_set_picks_diverse_over_homogeneous", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_select_mk", "to": "test_planner_select_test_select_set_handles_too_few", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_select_test_select_set_picks_diverse_over_homogeneous", "to": "test_planner_select_rationale_50", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_planner_generate_py", "to": "test_planner_generate_test_generate_meal_plan_against_seeded_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_planner_generate_test_generate_meal_plan_against_seeded_data", "to": "test_planner_generate_rationale_11", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_meal_plan_generate_api_py", "to": "test_meal_plan_generate_api_admin", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_meal_plan_generate_api_py", "to": "test_meal_plan_generate_api_family_with_groceries", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_meal_plan_generate_api_py", "to": "test_meal_plan_generate_api_test_generate_endpoint_returns_meal_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_meal_plan_generate_api_py", "to": "test_meal_plan_generate_api_test_generate_endpoint_requires_admin_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_meal_plan_generate_api_py", "to": "test_meal_plan_generate_api_test_generate_endpoint_returns_404_for_unknown_family", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_meal_plan_generate_api_admin", "to": "test_meal_plan_generate_api_test_generate_endpoint_returns_meal_plan", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_meal_plan_generate_api_admin", "to": "test_meal_plan_generate_api_test_generate_endpoint_returns_404_for_unknown_family", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_clear_cache", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_b64url", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_make_jwt", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_config_response", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_signup_response", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_test_get_token_mints_fresh_when_cache_empty", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_test_get_token_returns_cached_without_reminting", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_test_get_token_remints_when_cached_token_near_expiry", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_test_mint_raises_on_firebase_non_200", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_auth_py", "to": "test_swiftly_auth_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_b64url", "to": "test_swiftly_auth_make_jwt", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_make_jwt", "to": "test_swiftly_auth_test_get_token_mints_fresh_when_cache_empty", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_make_jwt", "to": "test_swiftly_auth_test_get_token_returns_cached_without_reminting", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_make_jwt", "to": "test_swiftly_auth_test_get_token_remints_when_cached_token_near_expiry", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_config_response", "to": "test_swiftly_auth_test_get_token_mints_fresh_when_cache_empty", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_config_response", "to": "test_swiftly_auth_test_get_token_returns_cached_without_reminting", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_config_response", "to": "test_swiftly_auth_test_mint_raises_on_firebase_non_200", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_signup_response", "to": "test_swiftly_auth_test_get_token_mints_fresh_when_cache_empty", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_signup_response", "to": "test_swiftly_auth_test_get_token_returns_cached_without_reminting", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_signup_response", "to": "test_swiftly_auth_test_get_token_remints_when_cached_token_near_expiry", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_signup_response", "to": "test_swiftly_auth_test_mint_raises_on_firebase_non_200", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_test_get_token_mints_fresh_when_cache_empty", "to": "test_swiftly_auth_rationale_72", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_test_get_token_returns_cached_without_reminting", "to": "test_swiftly_auth_rationale_100", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_test_get_token_remints_when_cached_token_near_expiry", "to": "test_swiftly_auth_rationale_119", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_auth_test_mint_raises_on_firebase_non_200", "to": "test_swiftly_auth_rationale_141", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_api_py", "to": "test_swiftly_api_test_parse_categories_fixture", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_api_py", "to": "test_swiftly_api_test_parse_category_response_fixture", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_api_py", "to": "test_swiftly_api_test_map_product_returns_none_for_unparseable", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_api_py", "to": "test_swiftly_api_mock_response", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_api_py", "to": "test_swiftly_api_test_swiftly_auth_error_on_401_from_api", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_api_py", "to": "test_swiftly_api_test_fetch_category_mints_token_when_none_pinned", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_api_py", "to": "test_swiftly_api_test_background_runner_writes_failed_with_token_message", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_swiftly_api_py", "to": "test_swiftly_api_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_api_test_parse_categories_fixture", "to": "test_swiftly_api_rationale_41", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_api_test_parse_category_response_fixture", "to": "test_swiftly_api_rationale_58", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_api_test_map_product_returns_none_for_unparseable", "to": "test_swiftly_api_rationale_108", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_api_mock_response", "to": "test_swiftly_api_test_swiftly_auth_error_on_401_from_api", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_api_mock_response", "to": "test_swiftly_api_test_fetch_category_mints_token_when_none_pinned", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_api_test_swiftly_auth_error_on_401_from_api", "to": "test_swiftly_api_rationale_136", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_api_test_fetch_category_mints_token_when_none_pinned", "to": "test_swiftly_api_rationale_147", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "test_swiftly_api_test_background_runner_writes_failed_with_token_message", "to": "test_swiftly_api_rationale_172", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_email_backend_py", "to": "test_email_backend_test_sendgrid_send_calls_api", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_email_backend_py", "to": "test_email_backend_test_sendgrid_raises_on_4xx", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_email_backend_py", "to": "test_email_backend_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_family", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_member", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_weekly_run", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_weekly_run_scraped", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_weekly_run_generated", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_meal_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_pending_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_weekly_run_emailed", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_weekly_run_reminded", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_send_admin_alert_noop_when_email_unset", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_send_admin_alert_calls_backend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_scrape_idempotent", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_scrape_success", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_scrape_both_fail_marks_stale", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_generate_idempotent", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_generate_creates_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_generate_records_error_on_failure", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_email_idempotent", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_email_sends_per_member", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_email_stale_banner", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_email_escapes_recipe_name", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_reminder_idempotent", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_reminder_skips_when_not_emailed", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_reminder_sends_to_non_voter", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_reminder_skips_voter", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_reminder_no_sends_when_all_voted", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_deadline_idempotent", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_deadline_resolves_pending_to_approved", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_deadline_resolves_pending_to_denied", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_weekly_run_deadline_passed", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_approved_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_finalize_idempotent", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_finalize_sends_shopping_list", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_step_finalize_no_approved_sends_empty_message", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_run_step_upserts_weekly_run", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_run_step_invalid_raises", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_run_week_calls_all_steps", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_admin_client", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_orchestrate_status_returns_list", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_orchestrate_step_invalid_returns_400", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_test_orchestrate_run_week_returns_202", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_test_orchestrator_py", "to": "test_orchestrator_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_app_tsx", "to": "app_isactive", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_app_tsx", "to": "app_linkclass", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_isactive", "to": "app_linkclass", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_errorboundary_tsx", "to": "errorboundary_getderivedstatefromerror", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_errorboundary_tsx", "to": "errorboundary_componentdidcatch", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_ui_button_tsx", "to": "button_button", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_ui_badge_tsx", "to": "badge_badge", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_ui_card_tsx", "to": "card_card", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_ui_card_tsx", "to": "card_cardheader", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_ui_card_tsx", "to": "card_cardbody", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_ui_card_tsx", "to": "card_cardfooter", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_ui_input_tsx", "to": "input_cn", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_ui_loadingspinner_tsx", "to": "loadingspinner_loadingspinner", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_components_ui_textarea_tsx", "to": "textarea_cn", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_pages_dashboard_tsx", "to": "dashboard_handlesend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_pages_pantry_tsx", "to": "pantry_handleadd", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_pages_shoppinglist_tsx", "to": "shoppinglist_shoppinglistskeleton", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_pages_shoppinglist_tsx", "to": "shoppinglist_skeletoncard", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_pages_shoppinglist_tsx", "to": "shoppinglist_storagekey", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_pages_shoppinglist_tsx", "to": "shoppinglist_toggle", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_pages_shoppinglist_tsx", "to": "shoppinglist_clearall", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_pages_login_tsx", "to": "login_login", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "frontend_src_lib_utils_ts", "to": "utils_cn", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scripts_spike_lucky_scrape_py", "to": "spike_lucky_scrape_main", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scripts_spike_lucky_scrape_py", "to": "spike_lucky_scrape_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scripts_send_test_approval_py", "to": "send_test_approval_main", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scripts_spike_swiftly_ingest_py", "to": "spike_swiftly_ingest_main", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scripts_spike_swiftly_ingest_py", "to": "spike_swiftly_ingest_rationale_1", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scripts_enrich_recipes_spoonacular_py", "to": "enrich_recipes_spoonacular_strip_html", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scripts_enrich_recipes_spoonacular_py", "to": "enrich_recipes_spoonacular_search_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "scripts_enrich_recipes_spoonacular_py", "to": "enrich_recipes_spoonacular_main", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "enrich_recipes_spoonacular_strip_html", "to": "enrich_recipes_spoonacular_main", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "enrich_recipes_spoonacular_search_recipe", "to": "enrich_recipes_spoonacular_main", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_meal_planner_system", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_goal", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_architecture", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_tech_stack", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_project_structure", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_tasks", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_phase_1_foundation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_phase_2_scraping", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_phase_3_recipe_meal_engine", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_phase_4_notifications_approval", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_phase_5_shopping_list_ui", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_phase_6_polish", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "meal_planner_plan_md", "to": "meal_planner_plan_md_done_when", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_meal_planner", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_background", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_features", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_architecture", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_documentation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_quick_start", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_clone_and_start", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_view_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_stop", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_family_profile", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_approval_workflow", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "readme_md_tech_stack", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "docs_spec_md", "label": "references", "title": "references [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "docs_architecture_md", "label": "references", "title": "references [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "docs_database_schema_md", "label": "references", "title": "references [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "docs_implementation_plan_md", "label": "references", "title": "references [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "readme_md", "to": "docs_running_md", "label": "references", "title": "references [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_context_mode_mandatory_routing_rules", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_blocked_commands_do_not_attempt_these", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_curl_wget_blocked", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_inline_http_blocked", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_webfetch_blocked", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_redirected_tools_use_sandbox_equivalents", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_bash_20_lines_output", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_read_for_analysis", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_grep_large_results", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_tool_selection_hierarchy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_subagent_routing", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_output_constraints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "claude_md", "to": "claude_md_ctx_commands", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_meal_planner_project_specification", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_1_overview", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_2_problem_statement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_3_goals", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_primary_goals", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_secondary_goals", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_4_non_goals_out_of_scope", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_5_user_stories", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_as_a_family_member_i_can", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_as_the_system_administrator_i_can", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_6_family_profile", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_household", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_family_members", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_dietary_constraints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_preference_signals", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_7_approval_workflow", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_weekly_flow", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_approval_token_security", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_8_technical_constraints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_self_hosting_requirements", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_authentication_authorization", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_lucky_california_integration", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_email", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_external_dependencies", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_9_accessibility_wcag_2_1_aa", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_web_ui", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_10_data_retention", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_stored_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_retention_period", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_11_success_metrics", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_spec_md", "to": "docs_spec_md_12_future_considerations", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_meal_planner_architecture", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_1_system_overview", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_2_component_descriptions", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_2_1_scraper_service", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_2_2_recipe_engine", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_2_3_meal_planner_service", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_2_4_notification_service", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_2_5_feedback_service", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_2_6_web_ui_react_tailwind", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_3_data_architecture", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_3_1_postgresql_schema_overview", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_3_2_key_relationships", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_4_api_design", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_4_1_core_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_4_2_email_approval_links", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_5_deployment_architecture", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_5_1_docker_compose_services", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_5_2_reverse_proxy_nginx", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_5_3_remote_access_security", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_6_image_strategy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_6_1_primary_scraped_images", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_6_2_fallback_ai_generation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_6_3_email_image_handling", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_7_error_handling_strategy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_7_1_scraper_failures", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_7_2_email_failures", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_7_3_database_failures", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_8_logging_monitoring", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_8_1_log_categories", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_8_2_log_storage", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_architecture_md", "to": "docs_architecture_md_8_3_monitoring_future", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_meal_planner_database_schema", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_1_schema_overview", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_2_enums", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_tables", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_1_family_profile", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_2_family_member", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_3_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_4_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_5_meal_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_6_meal_plan_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_7_meal_plan_vote", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_8_approval_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_9_home_pantry", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_10_feedback", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_11_never_suggest", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_12_grocery_item", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_13_scrape_log", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_3_14_email_log", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_4_indexes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_4_1_primary_indexes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_4_2_foreign_key_indexes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_4_3_full_text_search_indexes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_5_day_of_week_convention", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_6_data_migration_strategy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_6_1_initial_schema", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_6_2_migration_policy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_6_3_seed_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_7_data_retention", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_database_schema_md", "to": "docs_database_schema_md_8_row_level_security_future", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_meal_planner_implementation_plan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_overview", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_1_infrastructure_foundation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_1_1_project_setup", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_1_2_backend_skeleton", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_1_3_frontend_skeleton", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_1_4_reverse_proxy_nginx", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_2_database_models", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_2_1_sqlalchemy_models", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_2_2_pydantic_schemas", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_2_3_database_migrations", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_3_api_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_3_1_core_crud_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_3_2_meal_plan_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_3_3_shopping_list_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_3_4_feedback_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_3_5_admin_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_4_lucky_california_scraper", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_4_1_scraper_infrastructure", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_4_2_weekly_ad_scraper", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_4_3_product_catalog_scraper_future", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_4_4_scrape_scheduling", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_4_5_error_handling", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_5_recipe_engine", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_5_1_recipe_database", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_5_2_recipe_importing", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_5_3_ingredient_mapping", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_6_meal_planner_engine", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_6_1_plan_generation_algorithm", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_6_2_substitution_logic", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_6_3_cost_calculation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_6_4_plan_persistence", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_7_sendgrid_email_integration", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_7_1_sendgrid_setup", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_7_2_meal_proposal_email", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_7_3_reminder_email", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_7_4_confirmation_email", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_8_web_ui_core_features", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_8_1_dashboard", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_8_2_meal_detail_page", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_8_3_approval_center", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_8_4_pantry_manager", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_9_web_ui_feedback_learning", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_9_1_feedback_portal", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_9_2_learning_integration", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_9_3_recipe_discovery", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_10_shopping_list_print", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_10_1_shopping_list_generation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_10_2_printable_shopping_list", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_10_3_web_ui_shopping_list_view", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_11_image_strategy_implementation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_11_1_scraped_images", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_11_2_ai_image_generation_fallback", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_11_3_email_image_handling", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_phase_12_polish_future_features", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_12_1_variety_analysis", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_12_2_budget_tracking", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_12_3_whatsapp_integration_future", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_12_4_recipe_scraping_future", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_verification_commands", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_backend_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_health_check", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_api_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_frontend_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_build_test", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_dev_server", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_full_stack_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_start_all_services", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_check_all_services_running", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_view_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_stop_all_services", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_file_structure", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_dependencies", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_backend_python_3_11", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_frontend_node_18", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_environment_variables", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_backend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_frontend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_docker", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_implementation_plan_md", "to": "docs_implementation_plan_md_notes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_running_the_meal_planner", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_prerequisites", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_environment_setup", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_1_clone_repository", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_2_create_environment_file", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_database", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_sendgrid", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_family_emails", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_lucky_california_for_scraping", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_ai_images_optional", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_3_create_ssl_certificates_for_remote_acc", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_option_1_let_s_encrypt_with_certbot", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_option_2_self_signed_for_local_testing", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_starting_services", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_local_development", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_start_all_services", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_view_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_stop_all_services", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_production_deployment", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_start_with_production_settings", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_service_status", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_view_resource_usage", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_accessing_the_application", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_local_access", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_remote_access_with_reverse_proxy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_database_management", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_initial_migration", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_run_migrations", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_current_migration", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_create_new_migration_after_model_changes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_backup_database", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_backup_to_file", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_restore_from_backup", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_reset_database", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_danger_drops_and_recreates_all_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_scraping", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_manual_scrape_trigger", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_scrape_lucky_california_weekly_ad", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_scrape_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_view_recent_scrape_operations", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_scheduling", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_email_testing", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_test_email_send", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_send_test_email", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_view_email_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_troubleshooting", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_backend_won_t_start", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_common_issues", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_database_not_ready_wait_for_db_to_be_hea", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_port_conflict_check_if_port_8000_is_in_u", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_missing_env_vars_verify_env_file_exists_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_frontend_build_fails", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_for_node_version_issues", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_clear_cache_and_rebuild", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_database_connection_errors", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_verify_database_is_running", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_test_connection_from_backend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_credentials", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_scraping_failures", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_lucky_california_is_accessible", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_verify_playwright_browser_installed", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_manual_retry", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_email_not_sending", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_verify_sendgrid_api_key", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_sendgrid_dashboard_for_failures", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_ensure_sender_email_is_verified_in_sendg", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_development", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_backend_development", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_enter_backend_container", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_run_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_run_with_hot_reload", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_frontend_development", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_enter_frontend_container", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_run_dev_server_with_hot_reload", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_database_migrations", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_create_migration", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_upgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_downgrade", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_show_migration_history", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_health_checks", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_backend_health", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_database_connectivity", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_check_all_services", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_view_all_logs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_view_specific_service", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_configure_log_level", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_security_notes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_updating", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_pull_latest_code", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_rebuild_images", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_restart_services", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_running_md", "to": "docs_running_md_stopping_completely", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_meal_planner_orientation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_what_this_project_is", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_architecture_current", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_phase_status_2026_05_08", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_auth_model_r1_b_d_locked_in", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_database_schema_highlights", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_environment_variables_verified", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_database", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_auth", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_email", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_phase_5_orchestration", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_lucky_swiftly", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_no_bearer_token_env_var_minted_on_demand", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_other", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_verification_commands", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_full_local_stack_include_scheduler_for_p", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_verify_scheduler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_expected_6_lines_scrape_generate_email_r", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_manual_step_trigger_useful_for_testing_w", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_frontend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_ci_github_workflows_ci_yml_runs_both_job", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_conventions", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_orientation_md", "to": "docs_orientation_md_where_to_look", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_mealplanner_agent_handoff", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_tl_dr", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_infrastructure_read_this_first", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_access", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_stack_up", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_applying_python_code_changes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_db_connection", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_admin_api_auth", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_key_env_vars_env_test", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_family_data_live_seeded", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_what_changed_in_this_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_mvp_login_auth_gating_committed_in_featu", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_nginx_committed_in_59a15a2", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_vote_email_enrichment_aeed2a4", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_shopping_list_email_improvements_aeed2a4", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_ingredient_matcher_full_rewrite_ac2b575_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_scraper_fix_save_priceless_produce_23738", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_what_is_real_verified", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_lucky_ca_api_swiftly_full_catalog_access", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_matcher_runs_automatically", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_what_is_stubbed_or_missing", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_recipe_images_phase_10_approved_not_star", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_recipe_descriptions", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_olive_oil_corn_tortillas_lucky_catalog_g", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_phase_8_feedback_ui_done", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_known_caveats_and_traps", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_admin_api_reference", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_trigger_individual_steps", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_valid_steps_scrape_generate_email_remind", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_full_week_cycle_background", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_scrape_status", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_weekly_run_status", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_trigger_fresh_scrape_auto_match", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_suggested_next_moves", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_1_spoonacular_recipe_enrichment_images_d", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_2_ollama_llm_matcher_olive_oil_corn_tort", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_3_natural_friday_cycle", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_file_map_additions_from_this_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_handoff_md", "to": "docs_handoff_md_final_words", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_meal_planner_algorithm_design_spec", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_1_goal", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_2_algorithm_shape", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_2_1_hard_constraints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_2_2_scoring_signals", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_2_3_set_selection_diversity", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_ingredient_grocery_item_matching_layer", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_1_schema", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_2_match_job", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_3_manual_override", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_3_4_recipe_create_assist", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_4_thin_phase_4_surface", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_4_1_in_scope", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_4_2_recipe_model_fields_additions_to_exi", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_4_3_out_of_scope_deferred", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_5_phase_9_api_surface", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_6_recipe_source_comparison_deferred_deci", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_7_open_questions_deferred", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_8_implementation_order", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_specs_2026_05_05_meal_planner_algorithm_design_md", "to": "docs_specs_2026_05_05_meal_planner_algorithm_design_md_9_out_of_scope_for_this_spec", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_thin_phase_4_recipe_engine_matching_laye", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_file_structure", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_1_add_rapidfuzz_dependency", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_2_migration_0006_schema_changes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_3_update_sqlalchemy_models", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_4_pydantic_schemas_ingredient", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_5_pydantic_schemas_recipe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_6_ingredient_crud_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_7_recipe_crud_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_8_resolve_ingredient_assist_endpoin", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_9_matcher_service_rapidfuzz_top_3", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_10_wire_matcher_into_scrape_success", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_11_manual_match_override_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_re_import_basemodel_near_the_top_of_the_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_12_neversuggest_crud_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_13_migration_0007_seed_canonical_in", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_stable_uuids_so_re_running_upgrade_after", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_14_migration_0007_populate_30_start", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_task_15_end_to_end_smoke_test_docs_refre", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_verification_gate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md", "to": "docs_superpowers_plans_2026_05_05_thin_phase_4_recipe_engine_md_out_of_scope_phase_9_plan_written_separa", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_phase_9_meal_planner_algorithm_implement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_file_structure", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_1_planner_config_types", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_2_cost_savings_estimator", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_3_hard_constraint_filter", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_4_individual_scoring", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_5_top_k_set_selection_with_diversit", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_6_generation_orchestrator", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_7_generate_api_endpoint", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_task_8_final_regression_sweep_docs_refre", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_verification_gate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_open_items_deferred_tracked_here", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md", "to": "docs_superpowers_plans_2026_05_05_phase_9_planner_algorithm_md_out_of_scope_other_phases", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_phase_5_weekly_orchestration_implementat", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_file_map", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_1_alembic_migration_0008", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_backend_alembic_versions_0008_phase5_orc", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_2_weeklyrun_model_familyprofile_upd", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_column_after_calorie_target_line", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_relationship_after_the_existing_relation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_3_settings_admin_email_app_base_url", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_4_alerts_py", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_fixtures", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_alerts_py_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_5_step_scrape", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_scrape_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_6_step_generate", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_generate_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_7_step_email", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_email_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_8_step_deadline", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_deadline_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_9_step_finalize", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_step_finalize_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_10_runner_py_orchestrator_init_py", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_runner_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_backend_app_services_orchestrator_init_p", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_11_admin_orchestrate_endpoints", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_admin_endpoint_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_12_scheduler_entry_point", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_task_13_docker_compose_scheduler_service", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_final_verification", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_seed_a_family_profile_row_first_if_db_is", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md", "to": "docs_superpowers_plans_2026_05_07_phase5_orchestration_md_environment_variables_added", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_phase_6_sendgrid_email_integration_imple", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_file_map", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_1_migration_0009_add_reminded_at_to", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_context", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_expected_info_alembic_runtime_migration_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_expected_running_upgrade_0008_0009_again", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_2_wire_sendgridemailbackend", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_3_step_reminder_tests", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_step_reminder", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_4_wire_reminder_into_runner_admin_a", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_task_5_html_escape_p5_a_and_getattr_clea", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md", "to": "docs_superpowers_plans_2026_05_07_phase6_sendgrid_md_final_verification", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_mvp_login_family_seed_implementation_pla", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_file_map", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_task_1_login_page_401_interceptor_nav_lo", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_1_create_frontend_src_pages_login_t", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_2_modify_frontend_src_app_tsx", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_3_add_401_interceptor_to_frontend_s", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_4_build_and_verify", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_expected_no_typescript_errors_build_succ", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_5_commit", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_task_2_family_profile_seed_script", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_edit_these_before_running", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_step_commit", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_post_merge_steps_run_by_operator_after_m", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_1_add_app_base_url_to_env_test", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_2_rebuild_frontend_container_and_restart", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_3_run_the_seed_script", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_edit_scripts_seed_family_py_to_fill_in_r", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_plans_2026_05_09_mvp_login_md", "to": "docs_superpowers_plans_2026_05_09_mvp_login_md_4_verify_login_works", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_phase_6_sendgrid_email_integration_desig", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_goal", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_scope", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_architecture", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_components", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_services_email_py_modify", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_config_py_modify", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_services_orchestrator_steps_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_alembic_versions_0009_phase6_rem", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_models_init_py_modify", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_services_orchestrator_runner", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_api_admin_py_modify", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_backend_app_scheduler_main_py_modify", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_requirements_txt_verify_add", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_data_flow", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_error_handling", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_testing", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_environment_variables", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_required_for_email_backend_sendgrid", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md", "to": "docs_superpowers_specs_2026_05_07_phase6_sendgrid_design_md_files_touched", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_requirements_dev_txt", "to": "backend_requirements_dev_txt_dev_test_only_dependencies_production_de", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_fixtures_lucky_ca_meta_md", "to": "backend_tests_fixtures_lucky_ca_meta_md_lucky_california_weekly_ad_spike_r2_a", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_fixtures_lucky_ca_meta_md", "to": "backend_tests_fixtures_lucky_ca_meta_md_selectors_used_verified_against_this_fix", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_fixtures_lucky_ca_meta_md", "to": "backend_tests_fixtures_lucky_ca_meta_md_first_parsed_item_sample", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "backend_tests_fixtures_lucky_ca_meta_md", "to": "backend_tests_fixtures_lucky_ca_meta_md_notes", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_adversarial_documentation_review", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_verdict", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_blocking_findings", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_1_phase_status_docs_contradict_current_i", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_2_database_schema_is_internally_inconsis", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_3_api_endpoint_definitions_conflict_acro", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_4_security_model_is_missing_for_external", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_5_migration_strategy_conflicts_with_runt", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_6_current_code_appears_incompatible_with", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_high_risk_gaps", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_7_scraping_feasibility_is_under_specifie", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_8_meal_planning_algorithm_lacks_determin", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_9_shopping_list_math_is_not_implementabl", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_10_deployment_docs_promise_production_fe", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_11_environment_variable_docs_are_inconsi", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_medium_risk_issues", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_12_documentation_contains_stale_and_miss", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_13_tech_stack_docs_are_already_version_s", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_14_operational_docs_assume_endpoints_tha", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_15_data_retention_lacks_implementation_m", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_16_accessibility_is_barely_addressed_des", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_17_observability_requirements_are_aspira", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_suggested_gate_before_implementation", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_gpt5_5_md", "to": "review_docs_gpt5_5_md_implementation_readiness_rating", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_repository_analysis", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_executive_summary", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_current_repo_shape", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_blocking_findings", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_1_backend_likely_fails_during_import_bec", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_2_sqlalchemy_relationships_contain_at_le", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_3_frontend_build_is_blocked_by_a_missing", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_4_frontend_docker_build_is_blocked_by_mi", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_5_vite_app_is_missing_required_html_entr", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_6_alembic_is_documented_and_installed_bu", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_important_findings", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_7_api_routes_are_placeholders_with_no_sc", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_8_admin_endpoints_are_unauthenticated", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_9_email_approval_security_is_not_impleme", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_10_secret_key_has_an_unsafe_default", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_11_sqlalchemy_2_health_query_may_fail", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_12_docker_compose_exposes_backend_and_fr", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_13_nginx_ssl_and_rate_limiting_are_not_i", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_maintainability_findings", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_14_model_file_is_too_large_for_early_ite", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_15_schema_constraints_are_only_partially", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_16_api_prefix_behavior_may_produce_trail", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_17_no_repository_level_quality_gates_exi", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_documentation_alignment", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_recommended_remediation_order", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_phase_0_make_skeleton_start_and_build", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_phase_1_establish_schema_migration_basel", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_phase_2_establish_api_and_security_basel", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_phase_3_implement_first_vertical_slice", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_verification_matrix_to_add", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_repo_gpt5_5_md", "to": "review_repo_gpt5_5_md_final_assessment", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_adversarial_documentation_review_claude", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_verdict", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_blocking", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_b1_family_profile_is_internally_inconsis", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_b2_there_is_no_family_member_or_user_tab", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_b3_recipe_ingredient_relationship_is_doc", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_b4_there_is_no_authentication_anywhere_i", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_b5_approval_by_email_is_fragile_and_prob", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_b6_self_hosted_no_external_cloud_service", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_major", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m1_scraping_legality_tos_unaddressed", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m2_phase_ordering_buries_the_hard_proble", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m3_apscheduler_multiple_workers_will_mis", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m4_schema_has_avoidable_defects", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m5_migration_story_is_muddled", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m6_if_both_approve_or_no_response_meal_c", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m7_calorie_target_appears_in_the_schema_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m8_image_strategy_contradicts_itself", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_minor", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m1_doc_hygiene", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m2_operational_gaps_not_in_any_doc", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m3_docker_compose_exposure", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m4_success_metrics_aren_t_measurable", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m5_future_features_are_mixed_into_the_im", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_m6_secret_key_ghost_variable", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_cross_doc_contradictions_summarized", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_docs_claude_md", "to": "review_docs_claude_md_suggested_order_of_operations_before_any", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_review_synthesis_three_reviewers_compare", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_1_strong_consensus_all_reviewers_blockin", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_2_partial_agreement_2_of_3", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_3_unique_findings_only_one_reviewer", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_claude_only", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_gpt_5_5_docs_only", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_gpt_5_5_repo_only_claude_could_not_have_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_4_where_reviewers_conflict", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_5_combined_blocker_list_deduplicated_ran", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_6_additional_investigation_needed", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_synthesis_md", "to": "review_synthesis_md_7_net_assessment", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_review_consensus_feedback_for_originatin", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_headline", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_1_consensus_blockers_must_resolve_before", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_1_1_recipe_ingredient_relationship_is_mo", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_1_2_no_authentication_exists_anywhere_in", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_1_3_email_approval_flow_is_unsafe_and_pr", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_1_4_no_family_member_table_despite_per_p", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_1_5_phase_status_is_contradictory_and_th", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_1_6_schema_has_avoidable_correctness_def", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_1_7_docker_compose_exposes_backend_8000_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_1_8_production_deployment_claims_exceed_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_2_high_risk_gaps_agreed_by_2_of_3_review", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_2_1_migration_tooling_is_muddled", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_2_2_api_endpoint_contract_conflicts_acro", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_2_3_scraping_is_under_specified_and_risk", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_2_4_phase_ordering_hides_risk_behind_plu", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_2_5_shopping_list_math_is_not_implementa", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_2_6_environment_variables_inconsistent_a", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_2_7_accessibility_absent_despite_family_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_2_8_health_check_will_fail_under_sqlalch", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_3_single_reviewer_findings_worth_keeping", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_from_claude", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_from_gpt_5_5_docs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_from_gpt_5_5_repo", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_4_where_reviewers_disagreed", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_5_combined_remediation_order", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_6_verification_matrix_currently_failing_", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_7_additional_investigation_still_needed", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "review_reviewconcensus_md", "to": "review_reviewconcensus_md_8_suggested_response_format_from_origina", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}];
|
|
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "MealPlanItem", "count": 127}, {"cid": 1, "color": "#F28E2B", "label": "Accessing the Application", "count": 95}, {"cid": 2, "color": "#E15759", "label": "_PinMatchBody", "count": 87}, {"cid": 3, "color": "#76B7B2", "label": "API tests", "count": 81}, {"cid": 4, "color": "#59A14F", "label": "SwiftlyAuthMintError", "count": 80}, {"cid": 5, "color": "#EDC948", "label": "step_reminder", "count": 73}, {"cid": 6, "color": "#B07AA1", "label": "generate_meal_plan", "count": 65}, {"cid": 7, "color": "#FF9DA7", "label": "Meal Planner - Database", "count": 43}, {"cid": 8, "color": "#9C755F", "label": "APScheduler entry point for", "count": 42}, {"cid": 9, "color": "#BAB0AC", "label": "Access", "count": 40}, {"cid": 10, "color": "#4E79A7", "label": "issue_token", "count": 35}, {"cid": 11, "color": "#F28E2B", "label": "Admin endpoint tests", "count": 33}, {"cid": 12, "color": "#E15759", "label": "Approval Token Security", "count": 32}, {"cid": 13, "color": "#76B7B2", "label": "Meal Planner - Architecture", "count": 32}, {"cid": 14, "color": "#59A14F", "label": "Blocking Findings", "count": 32}, {"cid": 15, "color": "#EDC948", "label": "From Claude", "count": 30}, {"cid": 16, "color": "#B07AA1", "label": "Adversarial Documentation Review \u2014", "count": 28}, {"cid": 17, "color": "#FF9DA7", "label": "Adversarial Documentation Review", "count": 25}, {"cid": 18, "color": "#9C755F", "label": "Architecture (current)", "count": 24}, {"cid": 19, "color": "#BAB0AC", "label": "Out of scope (Phase", "count": 22}, {"cid": 20, "color": "#4E79A7", "label": "_reload_settings", "count": 21}, {"cid": 21, "color": "#F28E2B", "label": "Meal Planner Algorithm \u2014", "count": 21}, {"cid": 22, "color": "#E15759", "label": "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)", "count": 21}, {"cid": 23, "color": "#76B7B2", "label": "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "count": 20}, {"cid": 24, "color": "#59A14F", "label": "run_llm_match_job", "count": 17}, {"cid": 25, "color": "#EDC948", "label": "BaseScraper", "count": 17}, {"cid": 26, "color": "#B07AA1", "label": "client", "count": 17}, {"cid": 27, "color": "#FF9DA7", "label": "require_session", "count": 16}, {"cid": 28, "color": "#9C755F", "label": "Done When", "count": 14}, {"cid": 29, "color": "#BAB0AC", "label": "Bash (>20 lines output)", "count": 14}, {"cid": 30, "color": "#4E79A7", "label": "Open items (deferred, tracked", "count": 14}, {"cid": 31, "color": "#F28E2B", "label": "Expected: INFO [alembic.runtime.migration] Running", "count": 13}, {"cid": 32, "color": "#E15759", "label": "compute_recipe_cost", "count": 12}, {"cid": 33, "color": "#76B7B2", "label": "Claude only", "count": 12}, {"cid": 34, "color": "#59A14F", "label": "_admin_headers", "count": 11}, {"cid": 35, "color": "#EDC948", "label": "_delete_ingredients", "count": 9}, {"cid": 36, "color": "#B07AA1", "label": "test_router_list_endpoints", "count": 7}, {"cid": 37, "color": "#FF9DA7", "label": "_admin_headers (37)", "count": 6}, {"cid": 38, "color": "#9C755F", "label": "_admin", "count": 6}, {"cid": 39, "color": "#BAB0AC", "label": "ShoppingList.tsx", "count": 6}, {"cid": 40, "color": "#4E79A7", "label": "test_scrape_returns_202_and_log_id", "count": 5}, {"cid": 41, "color": "#F28E2B", "label": "_admin (41)", "count": 5}, {"cid": 42, "color": "#E15759", "label": "Card.tsx", "count": 5}, {"cid": 43, "color": "#76B7B2", "label": "First parsed item (sample)", "count": 5}, {"cid": 44, "color": "#59A14F", "label": "Add nullable description column", "count": 4}, {"cid": 45, "color": "#EDC948", "label": "Seed initial data Revision", "count": 4}, {"cid": 46, "color": "#B07AA1", "label": "Add calorie_target to family_profile", "count": 4}, {"cid": 47, "color": "#FF9DA7", "label": "Add nullable indexed external_id", "count": 4}, {"cid": 48, "color": "#9C755F", "label": "Phase 5 orchestration: weekly_run", "count": 4}, {"cid": 49, "color": "#BAB0AC", "label": "Phase 6: add reminded_at", "count": 4}, {"cid": 50, "color": "#4E79A7", "label": "Add auto_llm to ingredient_match_source_enum", "count": 4}, {"cid": 51, "color": "#F28E2B", "label": "test_matcher.py", "count": 4}, {"cid": 52, "color": "#E15759", "label": "main", "count": 4}, {"cid": 53, "color": "#76B7B2", "label": "env.py", "count": 3}, {"cid": 54, "color": "#59A14F", "label": "isActive", "count": 3}, {"cid": 55, "color": "#EDC948", "label": "ErrorBoundary.tsx", "count": 3}];
|
|
|
|
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
|
|
function esc(s) {
|
|
return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,''');
|
|
}
|
|
|
|
// Build vis datasets
|
|
const nodesDS = new vis.DataSet(RAW_NODES.map(n => ({
|
|
id: n.id, label: n.label, color: n.color, size: n.size,
|
|
font: n.font, title: n.title,
|
|
_community: n.community, _community_name: n.community_name,
|
|
_source_file: n.source_file, _file_type: n.file_type, _degree: n.degree,
|
|
})));
|
|
|
|
const edgesDS = new vis.DataSet(RAW_EDGES.map((e, i) => ({
|
|
id: i, from: e.from, to: e.to,
|
|
label: '',
|
|
title: e.title,
|
|
dashes: e.dashes,
|
|
width: e.width,
|
|
color: e.color,
|
|
arrows: { to: { enabled: true, scaleFactor: 0.5 } },
|
|
})));
|
|
|
|
const container = document.getElementById('graph');
|
|
const network = new vis.Network(container, { nodes: nodesDS, edges: edgesDS }, {
|
|
physics: {
|
|
enabled: true,
|
|
solver: 'forceAtlas2Based',
|
|
forceAtlas2Based: {
|
|
gravitationalConstant: -60,
|
|
centralGravity: 0.005,
|
|
springLength: 120,
|
|
springConstant: 0.08,
|
|
damping: 0.4,
|
|
avoidOverlap: 0.8,
|
|
},
|
|
stabilization: { iterations: 200, fit: true },
|
|
},
|
|
interaction: {
|
|
hover: true,
|
|
tooltipDelay: 100,
|
|
hideEdgesOnDrag: true,
|
|
navigationButtons: false,
|
|
keyboard: false,
|
|
},
|
|
nodes: { shape: 'dot', borderWidth: 1.5 },
|
|
edges: { smooth: { type: 'continuous', roundness: 0.2 }, selectionWidth: 3 },
|
|
});
|
|
|
|
network.once('stabilizationIterationsDone', () => {
|
|
network.setOptions({ physics: { enabled: false } });
|
|
});
|
|
|
|
function showInfo(nodeId) {
|
|
const n = nodesDS.get(nodeId);
|
|
if (!n) return;
|
|
const neighborIds = network.getConnectedNodes(nodeId);
|
|
const neighborItems = neighborIds.map(nid => {
|
|
const nb = nodesDS.get(nid);
|
|
const color = nb ? nb.color.background : '#555';
|
|
return `<span class="neighbor-link" style="border-left-color:${esc(color)}" onclick="focusNode(${JSON.stringify(nid)})">${esc(nb ? nb.label : nid)}</span>`;
|
|
}).join('');
|
|
document.getElementById('info-content').innerHTML = `
|
|
<div class="field"><b>${esc(n.label)}</b></div>
|
|
<div class="field">Type: ${esc(n._file_type || 'unknown')}</div>
|
|
<div class="field">Community: ${esc(n._community_name)}</div>
|
|
<div class="field">Source: ${esc(n._source_file || '-')}</div>
|
|
<div class="field">Degree: ${n._degree}</div>
|
|
${neighborIds.length ? `<div class="field" style="margin-top:8px;color:#aaa;font-size:11px">Neighbors (${neighborIds.length})</div><div id="neighbors-list">${neighborItems}</div>` : ''}
|
|
`;
|
|
}
|
|
|
|
function focusNode(nodeId) {
|
|
network.focus(nodeId, { scale: 1.4, animation: true });
|
|
network.selectNodes([nodeId]);
|
|
showInfo(nodeId);
|
|
}
|
|
|
|
// Track hovered node — hover detection is more reliable than click params
|
|
let hoveredNodeId = null;
|
|
network.on('hoverNode', params => {
|
|
hoveredNodeId = params.node;
|
|
container.style.cursor = 'pointer';
|
|
});
|
|
network.on('blurNode', () => {
|
|
hoveredNodeId = null;
|
|
container.style.cursor = 'default';
|
|
});
|
|
container.addEventListener('click', () => {
|
|
if (hoveredNodeId !== null) {
|
|
showInfo(hoveredNodeId);
|
|
network.selectNodes([hoveredNodeId]);
|
|
}
|
|
});
|
|
network.on('click', params => {
|
|
if (params.nodes.length > 0) {
|
|
showInfo(params.nodes[0]);
|
|
} else if (hoveredNodeId === null) {
|
|
document.getElementById('info-content').innerHTML = '<span class="empty">Click a node to inspect it</span>';
|
|
}
|
|
});
|
|
|
|
const searchInput = document.getElementById('search');
|
|
const searchResults = document.getElementById('search-results');
|
|
searchInput.addEventListener('input', () => {
|
|
const q = searchInput.value.toLowerCase().trim();
|
|
searchResults.innerHTML = '';
|
|
if (!q) { searchResults.style.display = 'none'; return; }
|
|
const matches = RAW_NODES.filter(n => n.label.toLowerCase().includes(q)).slice(0, 20);
|
|
if (!matches.length) { searchResults.style.display = 'none'; return; }
|
|
searchResults.style.display = 'block';
|
|
matches.forEach(n => {
|
|
const el = document.createElement('div');
|
|
el.className = 'search-item';
|
|
el.textContent = n.label;
|
|
el.style.borderLeft = `3px solid ${n.color.background}`;
|
|
el.style.paddingLeft = '8px';
|
|
el.onclick = () => {
|
|
network.focus(n.id, { scale: 1.5, animation: true });
|
|
network.selectNodes([n.id]);
|
|
showInfo(n.id);
|
|
searchResults.style.display = 'none';
|
|
searchInput.value = '';
|
|
};
|
|
searchResults.appendChild(el);
|
|
});
|
|
});
|
|
document.addEventListener('click', e => {
|
|
if (!searchResults.contains(e.target) && e.target !== searchInput)
|
|
searchResults.style.display = 'none';
|
|
});
|
|
|
|
const hiddenCommunities = new Set();
|
|
const legendEl = document.getElementById('legend');
|
|
LEGEND.forEach(c => {
|
|
const item = document.createElement('div');
|
|
item.className = 'legend-item';
|
|
item.innerHTML = `<div class="legend-dot" style="background:${c.color}"></div>
|
|
<span class="legend-label">${c.label}</span>
|
|
<span class="legend-count">${c.count}</span>`;
|
|
item.onclick = () => {
|
|
if (hiddenCommunities.has(c.cid)) {
|
|
hiddenCommunities.delete(c.cid);
|
|
item.classList.remove('dimmed');
|
|
} else {
|
|
hiddenCommunities.add(c.cid);
|
|
item.classList.add('dimmed');
|
|
}
|
|
const updates = RAW_NODES
|
|
.filter(n => n.community === c.cid)
|
|
.map(n => ({ id: n.id, hidden: hiddenCommunities.has(c.cid) }));
|
|
nodesDS.update(updates);
|
|
};
|
|
legendEl.appendChild(item);
|
|
});
|
|
</script>
|
|
<script>
|
|
// Render hyperedges as shaded regions
|
|
const hyperedges = [];
|
|
// afterDrawing passes ctx already transformed to network coordinate space.
|
|
// Draw node positions raw — no manual pan/zoom/DPR math needed.
|
|
network.on('afterDrawing', function(ctx) {
|
|
hyperedges.forEach(h => {
|
|
const positions = h.nodes
|
|
.map(nid => network.getPositions([nid])[nid])
|
|
.filter(p => p !== undefined);
|
|
if (positions.length < 2) return;
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.12;
|
|
ctx.fillStyle = '#6366f1';
|
|
ctx.strokeStyle = '#6366f1';
|
|
ctx.lineWidth = 2;
|
|
ctx.beginPath();
|
|
// Centroid and expanded hull in network coordinates
|
|
const cx = positions.reduce((s, p) => s + p.x, 0) / positions.length;
|
|
const cy = positions.reduce((s, p) => s + p.y, 0) / positions.length;
|
|
const expanded = positions.map(p => ({
|
|
x: cx + (p.x - cx) * 1.15,
|
|
y: cy + (p.y - cy) * 1.15
|
|
}));
|
|
ctx.moveTo(expanded[0].x, expanded[0].y);
|
|
expanded.slice(1).forEach(p => ctx.lineTo(p.x, p.y));
|
|
ctx.closePath();
|
|
ctx.fill();
|
|
ctx.globalAlpha = 0.4;
|
|
ctx.stroke();
|
|
// Label
|
|
ctx.globalAlpha = 0.8;
|
|
ctx.fillStyle = '#4f46e5';
|
|
ctx.font = 'bold 11px sans-serif';
|
|
ctx.textAlign = 'center';
|
|
ctx.fillText(h.label, cx, cy - 5);
|
|
ctx.restore();
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |