tests: fix suite-wide collection and failures

- 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.
This commit is contained in:
2026-05-18 17:43:30 -07:00
parent e92cc3a074
commit 019f9020ad
126 changed files with 34699 additions and 77 deletions
+340
View File
@@ -0,0 +1,340 @@
# Graph Report - /home/peter/Projects/MealPlanner (2026-05-17)
## Corpus Check
- 140 files · ~108,271 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 1365 nodes · 1777 edges · 56 communities detected
- Extraction: 82% EXTRACTED · 18% INFERRED · 0% AMBIGUOUS · INFERRED: 323 edges (avg confidence: 0.74)
- Token cost: 0 input · 0 output
## Community Hubs (Navigation)
- [[_COMMUNITY_MealPlanItem|MealPlanItem]]
- [[_COMMUNITY_Accessing the Application|Accessing the Application]]
- [[_COMMUNITY__PinMatchBody|_PinMatchBody]]
- [[_COMMUNITY_API tests|API tests]]
- [[_COMMUNITY_SwiftlyAuthMintError|SwiftlyAuthMintError]]
- [[_COMMUNITY_step_reminder|step_reminder]]
- [[_COMMUNITY_generate_meal_plan|generate_meal_plan]]
- [[_COMMUNITY_Meal Planner - Database|Meal Planner - Database]]
- [[_COMMUNITY_APScheduler entry point for|APScheduler entry point for]]
- [[_COMMUNITY_Access|Access]]
- [[_COMMUNITY_issue_token|issue_token]]
- [[_COMMUNITY_Admin endpoint tests|Admin endpoint tests]]
- [[_COMMUNITY_Approval Token Security|Approval Token Security]]
- [[_COMMUNITY_Meal Planner - Architecture|Meal Planner - Architecture]]
- [[_COMMUNITY_Blocking Findings|Blocking Findings]]
- [[_COMMUNITY_From Claude|From Claude]]
- [[_COMMUNITY_Adversarial Documentation Review —|Adversarial Documentation Review —]]
- [[_COMMUNITY_Adversarial Documentation Review|Adversarial Documentation Review]]
- [[_COMMUNITY_Architecture (current)|Architecture (current)]]
- [[_COMMUNITY_Out of scope (Phase|Out of scope (Phase]]
- [[_COMMUNITY__reload_settings|_reload_settings]]
- [[_COMMUNITY_Meal Planner Algorithm —|Meal Planner Algorithm —]]
- [[_COMMUNITY_`backendalembicversions0009_phase6_reminded_at.py` (create)|`backend/alembic/versions/0009_phase6_reminded_at.py` (create)]]
- [[_COMMUNITY_─────────────────────────────────────────────────────────────────────────────|─────────────────────────────────────────────────────────────────────────────]]
- [[_COMMUNITY_run_llm_match_job|run_llm_match_job]]
- [[_COMMUNITY_BaseScraper|BaseScraper]]
- [[_COMMUNITY_client|client]]
- [[_COMMUNITY_require_session|require_session]]
- [[_COMMUNITY_Done When|Done When]]
- [[_COMMUNITY_Bash (20 lines output)|Bash (>20 lines output)]]
- [[_COMMUNITY_Open items (deferred, tracked|Open items (deferred, tracked]]
- [[_COMMUNITY_Expected INFO alembic.runtime.migration Running|Expected: INFO [alembic.runtime.migration] Running]]
- [[_COMMUNITY_compute_recipe_cost|compute_recipe_cost]]
- [[_COMMUNITY_Claude only|Claude only]]
- [[_COMMUNITY__admin_headers|_admin_headers]]
- [[_COMMUNITY__delete_ingredients|_delete_ingredients]]
- [[_COMMUNITY_test_router_list_endpoints|test_router_list_endpoints]]
- [[_COMMUNITY__admin_headers (37)|_admin_headers (37)]]
- [[_COMMUNITY__admin|_admin]]
- [[_COMMUNITY_ShoppingList.tsx|ShoppingList.tsx]]
- [[_COMMUNITY_test_scrape_returns_202_and_log_id|test_scrape_returns_202_and_log_id]]
- [[_COMMUNITY__admin (41)|_admin (41)]]
- [[_COMMUNITY_Card.tsx|Card.tsx]]
- [[_COMMUNITY_First parsed item (sample)|First parsed item (sample)]]
- [[_COMMUNITY_Add nullable description column|Add nullable description column]]
- [[_COMMUNITY_Seed initial data Revision|Seed initial data Revision]]
- [[_COMMUNITY_Add calorie_target to family_profile|Add calorie_target to family_profile]]
- [[_COMMUNITY_Add nullable indexed external_id|Add nullable indexed external_id]]
- [[_COMMUNITY_Phase 5 orchestration weekly_run|Phase 5 orchestration: weekly_run]]
- [[_COMMUNITY_Phase 6 add reminded_at|Phase 6: add reminded_at]]
- [[_COMMUNITY_Add auto_llm to ingredient_match_source_enum|Add auto_llm to ingredient_match_source_enum]]
- [[_COMMUNITY_test_matcher.py|test_matcher.py]]
- [[_COMMUNITY_main|main]]
- [[_COMMUNITY_env.py|env.py]]
- [[_COMMUNITY_isActive|isActive]]
- [[_COMMUNITY_ErrorBoundary.tsx|ErrorBoundary.tsx]]
## God Nodes (most connected - your core abstractions)
1. `SwiftlyAuthMintError` - 25 edges
2. `LuckyCaliforniaScraper` - 23 edges
3. `generate_meal_plan()` - 16 edges
4. `issue_token()` - 12 edges
5. `filter_recipes()` - 12 edges
6. `SwiftlyAuthError` - 12 edges
7. `_cost()` - 11 edges
8. `RecipeCost` - 10 edges
9. `step_reminder()` - 10 edges
10. `MealPlanItem` - 9 edges
## Surprising Connections (you probably didn't know these)
- `main()` --calls--> `issue_token()` [INFERRED]
scripts/send_test_approval.py → backend/app/services/approval.py
- `main()` --calls--> `get_email_backend()` [INFERRED]
scripts/send_test_approval.py → backend/app/services/email.py
- `R2-A live-scrape spike for Lucky California weekly ad. Performs ONE live fetch` --uses--> `LuckyCaliforniaScraper` [INFERRED]
scripts/spike_lucky_scrape.py → backend/app/scraper/lucky_ca_scraper.py
- `main()` --calls--> `FamilyProfile` [INFERRED]
scripts/send_test_approval.py → backend/app/models/__init__.py
- `main()` --calls--> `FamilyMember` [INFERRED]
scripts/send_test_approval.py → backend/app/models/__init__.py
## Communities
### Community 0 - "MealPlanItem"
Cohesion: 0.02
Nodes (86): Initial migration Revision ID: 0001 Revises: Create Date: 2026-05-04, upgrade(), thin phase 4: ingredient.aliases, recipe.calories_per_serving, ingredient_grocer, upgrade(), get_all_meal_plans(), get_email_logs(), get_log(), get_logs() (+78 more)
### Community 1 - "Accessing the Application"
Cohesion: 0.02
Nodes (94): 1. Clone Repository, 2. Create Environment File, 3. Create SSL Certificates (for remote access), Accessing the Application, AI Images (optional), Backend Development, Backend Won't Start, Backup Database (+86 more)
### Community 2 - "_PinMatchBody"
Cohesion: 0.04
Nodes (71): BaseModel, IngredientBase, IngredientCreate, IngredientGroceryMatchRead, IngredientRead, IngredientUpdate, _PinMatchBody, Config (+63 more)
### Community 3 - "API tests"
Cohesion: 0.02
Nodes (80): 10.1 Shopping List Generation, 10.2 Printable Shopping List, 10.3 Web UI Shopping List View, 11.1 Scraped Images, 11.2 AI Image Generation (Fallback), 11.3 Email Image Handling, 12.1 Variety Analysis, 12.2 Budget Tracking (+72 more)
### Community 4 - "SwiftlyAuthMintError"
Cohesion: 0.05
Nodes (65): Exception, _aisle_from_slug(), LuckyCaliforniaScraper, map_product(), parse_categories_html(), parse_category_response(), _parse_price(), Lucky California / Swiftly product API client. Replaces the prior Playwright + (+57 more)
### Community 5 - "step_reminder"
Cohesion: 0.05
Nodes (59): send_admin_alert(), ConsoleEmailBackend, EmailBackend, get_email_backend(), Email backends. R2-B spike: only ConsoleEmailBackend is functional. SendGrid is, Dev/spike backend. Prints to stdout AND appends a JSON line to backend/var/e, SendGridEmailBackend, MealPlanVote (+51 more)
### Community 6 - "generate_meal_plan"
Cohesion: 0.07
Nodes (53): PlannerConfig, Planner constants. Tune here without touching algorithm code., _calorie_band(), filter_recipes(), Hard-constraint filter (constraints #1-#6 from the spec)., generate_meal_plan(), _load_blocklists(), _load_last_cooked() (+45 more)
### Community 7 - "Meal Planner - Database"
Cohesion: 0.05
Nodes (41): 1. Schema Overview, 2. Enums, 3.10 `feedback`, 3.11 `never_suggest`, 3.12 `grocery_item`, 3.13 `scrape_log`, 3.14 `email_log`, 3.1 `family_profile` (+33 more)
### Community 8 - "APScheduler entry point for"
Cohesion: 0.01
Nodes (2): APScheduler entry point for the scheduler container. Run: python -m app.schedul, Dev / test-only dependencies. Production deps live in requirements.txt.
### Community 9 - "Access"
Cohesion: 0.05
Nodes (39): 1. Spoonacular recipe enrichment (images + descriptions), 2. Ollama LLM matcher (Olive Oil, Corn Tortillas, etc.), 3. Natural Friday cycle, Access, Admin API auth, Admin API reference, Applying Python code changes, DB connection (+31 more)
### Community 10 - "issue_token"
Cohesion: 0.08
Nodes (28): consume_token(), issue_token(), Per-voter approval tokens. Stateless signed tokens (itsdangerous) keyed on sett, Verify + match URL + enforce single-use. Returns the voter on success. Sing, _serializer(), verify_token(), approve_meal_item(), deny_meal_item() (+20 more)
### Community 11 - "Admin endpoint tests"
Cohesion: 0.06
Nodes (32): ---------------------------------------------------------------------------, Admin endpoint tests, alerts.py tests, backend/alembic/versions/0008_phase5_orchestration.py, backend/app/services/orchestrator/__init__.py, column (after calorie_target line):, Environment variables added, File Map (+24 more)
### Community 12 - "Approval Token Security"
Cohesion: 0.06
Nodes (31): 10. Data Retention, 11. Success Metrics, 12. Future Considerations, 1. Overview, 2. Problem Statement, 3. Goals, 4. Non-Goals (Out of Scope), 5. User Stories (+23 more)
### Community 13 - "Meal Planner - Architecture"
Cohesion: 0.06
Nodes (31): 1. System Overview, 2.1 Scraper Service, 2.2 Recipe Engine, 2.3 Meal Planner Service, 2.4 Notification Service, 2.5 Feedback Service, 2.6 Web UI (React + Tailwind), 2. Component Descriptions (+23 more)
### Community 14 - "Blocking Findings"
Cohesion: 0.06
Nodes (31): 10. `SECRET_KEY` has an unsafe default, 11. SQLAlchemy 2 health query may fail, 12. Docker Compose exposes backend and frontend directly plus nginx, 13. Nginx SSL and rate limiting are not implemented, 14. Model file is too large for early iteration and hides domain decisions, 15. Schema constraints are only partially represented, 16. API prefix behavior may produce trailing-slash-only endpoints, 17. No repository-level quality gates exist (+23 more)
### Community 15 - "From Claude"
Cohesion: 0.07
Nodes (29): 1.1 Recipe ↔ Ingredient relationship is modeled two contradictory ways, 1.2 No authentication exists anywhere in the system, 1.3 Email approval flow is unsafe and probably exploitable, 1.4 No `family_member` table despite per-person spec, 1.5 Phase status is contradictory and the skeleton does not work, 1.6 Schema has avoidable correctness defects, 1.7 Docker compose exposes backend (8000) and frontend (3000) directly, 1.8 Production deployment claims exceed implementation (+21 more)
### Community 16 - "Adversarial Documentation Review —"
Cohesion: 0.07
Nodes (27): Adversarial Documentation Review — Claude, B1. Family profile is internally inconsistent — the math doesn't close, B2. There is no `family_member` (or `user`) table — but the spec is per-person, B3. Recipe↔ingredient relationship is documented two contradictory ways, B4. There is no authentication anywhere in the system, B5. Approval-by-email is fragile and probably exploitable, B6. "Self-hosted, no external cloud services *except SendGrid*" is undermined, Blocking (+19 more)
### Community 17 - "Adversarial Documentation Review"
Cohesion: 0.08
Nodes (24): 10. Deployment docs promise production features that compose file does not provide, 11. Environment-variable docs are inconsistent and include unsafe examples, 12. Documentation contains stale and misspelled file paths, 13. Tech-stack docs are already version stale, 14. Operational docs assume endpoints that are not proven to exist, 15. Data retention lacks implementation mechanics, 16. Accessibility is barely addressed despite family-facing UI, 17. Observability requirements are aspirational (+16 more)
### Community 18 - "Architecture (current)"
Cohesion: 0.08
Nodes (23): Architecture (current), Auth, Auth model (R1-B+D, locked in), CI: .github/workflows/ci.yml runs both jobs on push/PR., Conventions, Database, Database schema highlights, Email (+15 more)
### Community 19 - "Out of scope (Phase"
Cohesion: 0.09
Nodes (21): File Structure, Out of scope (Phase 9 plan, written separately), Re-import BaseModel near the top of the file if not already present., Stable UUIDs so re-running upgrade after a downgrade is idempotent on FK refs., Task 10: Wire matcher into scrape success path, Task 11: Manual match override endpoints, Task 12: NeverSuggest CRUD endpoints, Task 13: Migration 0007 — seed canonical ingredients (+13 more)
### Community 20 - "_reload_settings"
Cohesion: 0.1
Nodes (15): BaseSettings, Config, Settings, Auth gate tests for R1-B+D. Covers: - /api/admin/* requires bearer token (401 w, Force ``settings`` to re-read env (test isolation)., No bearer → 401. Valid bearer → not 401 (handler runs)., POST /api/profile/members without cookie → 401., GET /api/profile is NOT auth-gated (reads stay open). (+7 more)
### Community 21 - "Meal Planner Algorithm —"
Cohesion: 0.1
Nodes (20): 1. Goal, 2.1 Hard constraints, 2.2 Scoring signals, 2.3 Set-selection diversity, 2. Algorithm shape, 3.1 Schema, 3.2 Match job, 3.3 Manual override (+12 more)
### Community 22 - "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)"
Cohesion: 0.1
Nodes (20): Architecture, `backend/alembic/versions/0009_phase6_reminded_at.py` (create), `backend/app/api/admin.py` (modify), `backend/app/config.py` (modify), `backend/app/models/__init__.py` (modify), `backend/app/scheduler/__main__.py` (modify), `backend/app/services/email.py` (modify), `backend/app/services/orchestrator/runner.py` (modify) (+12 more)
### Community 23 - "─────────────────────────────────────────────────────────────────────────────"
Cohesion: 0.1
Nodes (19): ─────────────────────────────────────────────────────────────────────────────, 1. Add APP_BASE_URL to `.env.test`, 2. Rebuild frontend container and restart, 3. Run the seed script, 4. Verify login works, Edit scripts/seed_family.py to fill in real names/emails first, then:, ── Edit these before running ────────────────────────────────────────────────, Expected: no TypeScript errors, build succeeds (+11 more)
### Community 24 - "run_llm_match_job"
Cohesion: 0.15
Nodes (15): _ask_ollama(), _get_candidates(), _get_unmatched_ingredients(), LLM-powered second-pass ingredient→grocery matcher. After the deterministic AUT, LLM second pass: match remaining unmatched ingredients. For each ingredient, Return up to ``_CANDIDATE_LIMIT`` grocery items ranked by fuzzy×precision., Ingredients with no existing match in ingredient_grocery_match., Ask the LLM to pick the best grocery item for the ingredient. Returns the 0 (+7 more)
### Community 25 - "BaseScraper"
Cohesion: 0.17
Nodes (3): ABC, BaseScraper, SeleniumScraper
### Community 26 - "client"
Cohesion: 0.12
Nodes (12): client(), client_no_db(), db(), db_session(), pytest_collection_modifyitems(), Pytest fixtures for MealPlanner backend. DB strategy ----------- - If env ``TES, Per-test transactional session that rolls back at teardown., Plain SessionLocal for tests that need to seed data outside the transactiona (+4 more)
### Community 27 - "require_session"
Cohesion: 0.14
Nodes (12): login(), LoginRequest, Family-shared session login. POST /api/auth/login — body ``{"password": "..."}`, get_db(), issue_session(), Auth dependencies for the MealPlanner backend. Two flavors: - ``require_admin``, Enforce a shared bearer token. 401 on bad/missing token, 503 if unset., Sign the family_profile_id and return the cookie value. (+4 more)
### Community 28 - "Done When"
Cohesion: 0.14
Nodes (13): Architecture, Done When, Goal, Meal Planner System, Phase 1: Foundation, Phase 2: Scraping, Phase 3: Recipe & Meal Engine, Phase 4: Notifications & Approval (+5 more)
### Community 29 - "Bash (>20 lines output)"
Cohesion: 0.14
Nodes (13): Bash (>20 lines output), BLOCKED commands — do NOT attempt these, context-mode — MANDATORY routing rules, ctx commands, curl / wget — BLOCKED, Grep (large results), Inline HTTP — BLOCKED, Output constraints (+5 more)
### Community 30 - "Open items (deferred, tracked"
Cohesion: 0.14
Nodes (13): File Structure, Open items (deferred, tracked here), Out of scope (other phases), Phase 9 — Meal-Planner Algorithm Implementation Plan, Task 1: Planner config + types, Task 2: Cost + savings estimator, Task 3: Hard-constraint filter, Task 4: Individual scoring (+5 more)
### Community 31 - "Expected: INFO [alembic.runtime.migration] Running"
Cohesion: 0.15
Nodes (12): Context, Expected: INFO [alembic.runtime.migration] Running upgrade 0008 -> 0009 ..., Expected: Running upgrade 0008 -> 0009 again, clean, File map, Final verification, Phase 6 — SendGrid Email Integration Implementation Plan, ── step_reminder ──────────────────────────────────────────────────────────, Task 1: Migration 0009 — add `reminded_at` to `weekly_run` (+4 more)
### Community 32 - "compute_recipe_cost"
Cohesion: 0.32
Nodes (10): compute_recipe_cost(), _decimal(), Compute per-recipe cost and savings against ingredient_grocery_match. Inputs:, _scale(), _ingredient(), _match(), test_compute_recipe_cost_sums_ingredient_costs(), test_pantry_hits_counted() (+2 more)
### Community 33 - "Claude only"
Cohesion: 0.17
Nodes (11): 1. Strong Consensus (all reviewers, blocking), 2. Partial Agreement (2 of 3), 3. Unique Findings (only one reviewer), 4. Where Reviewers Conflict, 5. Combined Blocker List (deduplicated, ranked), 6. Additional Investigation Needed, 7. Net Assessment, Claude only (+3 more)
### Community 34 - "_admin_headers"
Cohesion: 0.35
Nodes (9): _admin_headers(), _seed_grocery(), test_create_ingredient_rejects_duplicate_name(), test_create_ingredient_returns_201_with_id(), test_delete_ingredient_removes_row(), test_list_ingredients_supports_search(), test_pin_manual_match(), test_unpin_manual_match() (+1 more)
### Community 35 - "_delete_ingredients"
Cohesion: 0.33
Nodes (8): _delete_ingredients(), _delete_recipes(), downgrade(), _insert_recipes(), seed canonical ingredients (and 30 starter recipes in P4-14) Revision ID: 0007, Best-effort: only remove rows whose name_lower matches one of our seeds. Pre, upgrade(), _upsert_ingredients()
### Community 36 - "test_router_list_endpoints"
Cohesion: 0.29
Nodes (3): Smoke tests: app boots, routers wire up, no import-time crashes. The router-lis, Each canonical GET must respond. 200 (handled), 401 (admin-gated), 404 (hand, test_router_list_endpoints()
### Community 37 - "_admin_headers (37)"
Cohesion: 0.73
Nodes (5): _admin_headers(), _new_ingredient(), test_create_recipe_rejects_unknown_ingredient_id(), test_create_recipe_with_canonical_ingredients(), test_list_recipes_returns_seeded_data()
### Community 38 - "_admin"
Cohesion: 0.4
Nodes (4): _admin(), End-to-end: ingredient + recipe + match all wired together., test_match_job_runs_against_seeded_data(), test_resolve_against_seeded_ingredients()
### Community 39 - "ShoppingList.tsx"
Cohesion: 0.33
Nodes (0):
### Community 40 - "test_scrape_returns_202_and_log_id"
Cohesion: 0.4
Nodes (3): Async scrape endpoint contract. Verifies that ``POST /api/admin/scrape``: - r, Endpoint enqueues the scrape and returns 202 + scrape_log_id. We replace th, test_scrape_returns_202_and_log_id()
### Community 41 - "_admin (41)"
Cohesion: 0.9
Nodes (4): _admin(), _seed_ingredient(), test_resolve_ingredient_handles_no_unit(), test_resolve_ingredient_returns_top_three_candidates()
### Community 42 - "Card.tsx"
Cohesion: 0.4
Nodes (0):
### Community 43 - "First parsed item (sample)"
Cohesion: 0.4
Nodes (4): First parsed item (sample), Lucky California weekly-ad spike (R2-A), Notes, Selectors used (verified against this fixture)
### Community 44 - "Add nullable description column"
Cohesion: 0.5
Nodes (1): Add nullable description column to grocery_item. The Lucky California parser pr
### Community 45 - "Seed initial data Revision"
Cohesion: 0.5
Nodes (1): Seed initial data Revision ID: 0002 Revises: 0001 Create Date: 2026-05-04
### Community 46 - "Add calorie_target to family_profile"
Cohesion: 0.5
Nodes (1): Add calorie_target to family_profile Revision ID: 0004 Revises: 0003 Create Dat
### Community 47 - "Add nullable indexed external_id"
Cohesion: 0.5
Nodes (1): Add nullable indexed external_id and source columns to grocery_item. The Swiftl
### Community 48 - "Phase 5 orchestration: weekly_run"
Cohesion: 0.5
Nodes (1): Phase 5 orchestration: weekly_run table + pending_approval_policy Revision ID:
### Community 49 - "Phase 6: add reminded_at"
Cohesion: 0.5
Nodes (1): Phase 6: add reminded_at to weekly_run Revision ID: 0009 Revises: 0008 Create D
### Community 50 - "Add auto_llm to ingredient_match_source_enum"
Cohesion: 0.5
Nodes (1): Add auto_llm to ingredient_match_source_enum Revision ID: 0010 Revises: 0009 Cr
### Community 51 - "test_matcher.py"
Cohesion: 0.5
Nodes (0):
### Community 52 - "main"
Cohesion: 0.83
Nodes (3): main(), search_recipe(), strip_html()
### Community 53 - "env.py"
Cohesion: 0.67
Nodes (0):
### Community 54 - "isActive"
Cohesion: 1.0
Nodes (2): isActive(), linkClass()
### Community 55 - "ErrorBoundary.tsx"
Cohesion: 0.67
Nodes (0):
## Knowledge Gaps
- **720 isolated node(s):** `Auth dependencies for the MealPlanner backend. Two flavors: - ``require_admin```, `Enforce a shared bearer token. 401 on bad/missing token, 503 if unset.`, `Sign the family_profile_id and return the cookie value.`, `Auto-authenticate: return the first family_profile_id from the DB. No cooki`, `Config` (+715 more)
These have ≤1 connection - possible missing edges or undocumented components.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `map_product()` connect `SwiftlyAuthMintError` to `MealPlanItem`?**
_High betweenness centrality (0.014) - this node is a cross-community bridge._
- **Why does `_cost()` connect `generate_meal_plan` to `MealPlanItem`?**
_High betweenness centrality (0.012) - this node is a cross-community bridge._
- **Are the 47 inferred relationships involving `str` (e.g. with `require_session()` and `health_check_db()`) actually correct?**
_`str` has 47 INFERRED edges - model-reasoned connections that need verification._
- **Are the 19 inferred relationships involving `SwiftlyAuthMintError` (e.g. with `SwiftlyAuthError` and `LuckyCaliforniaScraper`) actually correct?**
_`SwiftlyAuthMintError` has 19 INFERRED edges - model-reasoned connections that need verification._
- **Are the 14 inferred relationships involving `LuckyCaliforniaScraper` (e.g. with `SwiftlyAuthMintError` and `._do_scrape()`) actually correct?**
_`LuckyCaliforniaScraper` has 14 INFERRED edges - model-reasoned connections that need verification._
- **What connects `Auth dependencies for the MealPlanner backend. Two flavors: - ``require_admin```, `Enforce a shared bearer token. 401 on bad/missing token, 503 if unset.`, `Sign the family_profile_id and return the cookie value.` to the rest of the system?**
_720 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `MealPlanItem` be split into smaller, more focused modules?**
_Cohesion score 0.02 - nodes in this community are weakly interconnected._