Public Access
57 lines
2.5 KiB
Markdown
57 lines
2.5 KiB
Markdown
# Approved Plan — Feedback-Driven Recipe Discovery
|
|
|
|
Approved: 2026-05-23
|
|
User decisions: (1) dashboard badge only for review, (2) 4-week lookback, (3) skip manual review — auto-add on discovery.
|
|
|
|
## Phase A — Feedback Analyzer
|
|
|
|
- [x] Design complete (see docs/proposals/2026-05-23-feedback-driven-recipe-discovery.md)
|
|
- [x] Implement `app/services/feedback_analyzer.py`
|
|
- Reads feedback from past 4 weeks
|
|
- Aggregates positive signals (preferred cuisines, proteins, high ratings)
|
|
- Aggregates negative signals (avoided tags, ingredients, denial reasons)
|
|
- Generates discovery_queries for external APIs
|
|
- Outputs structured `FeedbackAnalysis` dataclass
|
|
- [x] Add `feedback_analysis` JSONB column to `weekly_run` table
|
|
- [x] Unit tests for analyzer logic
|
|
- [x] Hook into orchestrator `step_finalize`
|
|
|
|
## Phase B — Recipe Discovery + Ingestion
|
|
|
|
- [x] Implement `app/services/recipe_discovery.py`
|
|
- Spoonacular client with quota tracking
|
|
- TheMealDB fallback
|
|
- Query builder from `FeedbackAnalysis`
|
|
- [x] Implement `app/services/recipe_ingestion.py`
|
|
- Normalize external recipe → our schema
|
|
- Ingredient name mapping (fuzzy + canonical seed data)
|
|
- Duplicate detection via external_source+external_id and fuzzy name match
|
|
- Auto-add to `recipe` table (no review queue per user)
|
|
- [x] Add `external_source`, `external_id`, `discovery_reason` to `recipe` table
|
|
- [x] Admin endpoint: `POST /api/admin/trigger-discovery` (manual trigger)
|
|
- [x] Rate-limiting and quota exhaustion handling
|
|
|
|
## Phase C — Orchestrator Integration
|
|
|
|
- [x] Weekly finalize step: run analyzer → if queries found and quota available → run discovery → ingest → log
|
|
- [x] Configuration env vars:
|
|
- `SPOONACULAR_API_KEY` (existing)
|
|
- `AUTO_DISCOVERY_ENABLED=true`
|
|
- `AUTO_DISCOVERY_MAX_RECIPES_PER_RUN=5`
|
|
- [x] Dashboard endpoints: `/api/meals/dashboard/discovered-count` and `/api/meals/dashboard/discovery-insights`
|
|
|
|
## Phase D — Verification
|
|
|
|
- [x] End-to-end tests: analyzer, discovery, ingestion, duplicate prevention
|
|
- [x] Test quota exhaustion graceful degradation
|
|
- [x] Update docs and README
|
|
|
|
## Halt conditions
|
|
- Spoonacular API returns unexpected schema → stop, document, fix mapper
|
|
- Ingredient mapping consistently wrong → add LLM-assisted mapping or tighten threshold
|
|
- Duplicate recipes slipping through → improve detection logic
|
|
|
|
## Context links
|
|
- Proposal: docs/proposals/2026-05-23-feedback-driven-recipe-discovery.md
|
|
- HANDOFF: docs/HANDOFF.md (updated with session notes)
|