Public Access
docs: Sprint 15 round 2 — +18 recipes, library at 67 total, LLM 21/21
Sprint 15 round 2 (commit 97b84a7) added seed_recipes_round2.py
which seeded 18 more Spoonacular recipes today. Library went
49 -> 67 total. LLM test (Sprint 13 endpoint, week 2026-07-20):
{picked_count: 0, filled_count: 21, failed_count: 0}
The library now covers all 21 slots of a week (was 19/21 + 2
failed in round 1).
This commit updates the 6 running docs:
- .agent/plan.md — Sprint 15 Round 2 section (S15R2.1-S15R2.4
+ Done when + Out of scope) added after the round 1 sections.
50-query list documented by category.
- .agent/context.md — Round 2 decisions (D7-D10) added: list
focuses on cuisines round 1 didn't cover, round 2 is a
separate script, library at 67 with 21/21 LLM coverage.
- Review/sprint15-verification.md — Round 2 section appended
with: 50-query list, 18-imported result, 12 no-hits, 1 402,
updated DB state (37 Spoonacular + 30 manual = 67), LLM
test result, round 3 follow-up ticket.
- Review/ui-nielsen-audit.md — Round 2 paragraph added to the
Sprint 15 status block.
- fix-ui-audit.md — T8.6 added to the Sprint 15 section.
- Review/handoff-ui-audit.md — TL;DR and Sprint 15 section
updated with round 2.
- docs/HANDOFF.md — Round 2 paragraph added to the Sprint 15
section, Last-updated footer updated.
All 6 docs now reflect Sprint 15 round 2. Library has 67 unique
recipes — 1.25x rotation across 4 weeks of planning. Round 3
can add 30+ more by re-running scripts/seed_recipes.py on the
next day (its query list has round 1 cap-blocked American +
Mediterranean cuisines still to import).
This commit is contained in:
@@ -34,6 +34,7 @@ If you are a new agent continuing this work, do this **in order**:
|
||||
- The §Future backlog is now empty: F1 (onboarding) shipped as Sprint 9; the dead "Generate Meal Plan" CTA shipped as Sprint 11; F8 (Spoonacular) shipped as Sprint 12; F9-lite shipped as Sprint 13. All four are deployment-pending. F9-full (local Ollama model pull) is the only remaining §Future item — opt-in based on cloud-billing feedback.
|
||||
- **Sprint 14 (Vitest for `useOnboarding`, Q4) code complete on 2026-06-05.** 7/7 tests green in ~25 ms, `npm run build` green, no runtime dep change. Awaiting commit + push. Closes the open Q4 from Sprint 9.
|
||||
- **Sprint 15 (Seed 50 family-friendly recipes + Sprint 12 latent-bug fix) code complete on 2026-06-06.** 18 Spoonacular recipes imported (free-tier 50-pt cap hit; remaining 32 to be seeded on later days). DB went 31 → 49 total recipes. LLM test for week 2026-07-06: `picked_count=0 / filled_count=19 / failed_count=2` (library fill covered 19/21 slots). Sprint 12 latent-bug fix: `main.py` mount order. Awaiting commit + push.
|
||||
- **Sprint 15 Round 2 (2026-06-07):** +18 recipes via `scripts/seed_recipes_round2.py`. Library at 67 total. LLM test for week 2026-07-20: `picked_count=0 / filled_count=21 / failed_count=0` (library now covers all 21 slots of a week). Awaiting commit + push.
|
||||
- Pre-existing repo issues: 1 failing test (`test_filter_blocks_by_cost` — verified pre-Sprint 8), `.gitignore` `lib/` bug, no CI. Documented.
|
||||
|
||||
---
|
||||
@@ -163,7 +164,9 @@ If you are a new agent continuing this work, do this **in order**:
|
||||
|
||||
**No pre-existing WIP files touched.** Only `main.py` was reordered (one-line + comment); `recipes.py`, `schemas/recipe.py`, `nginx.conf` are unchanged.
|
||||
|
||||
**Tracking docs:** `Review/sprint15-verification.md` (full 18-imported breakdown by cuisine + free-tier math + LLM test + 6-risk table + deploy + 2 follow-up tickets), `Review/ui-nielsen-audit.md` Sprint 15 status block (T8.1-T8.3), `fix-ui-audit.md` Sprint 15 section (T8.1-T8.5), this file, `docs/HANDOFF.md` Sprint 15 section.
|
||||
**Tracking docs:** `Review/sprint15-verification.md` (full 18-imported breakdown by cuisine + free-tier math + LLM test + 6-risk table + deploy + 2 follow-up tickets + Round 2 follow-up section), `Review/ui-nielsen-audit.md` Sprint 15 status block (T8.1-T8.3 + Round 2 paragraph), `fix-ui-audit.md` Sprint 15 section (T8.1-T8.6), this file, `docs/HANDOFF.md` Sprint 15 section.
|
||||
|
||||
**Sprint 15 Round 2 (2026-06-07):** +18 recipes via `scripts/seed_recipes_round2.py` (NEW). Library at 67 total. LLM test for week 2026-07-20: `picked_count=0 / filled_count=21 / failed_count=0` (library now covers all 21 slots of a week). Tracking: appended to `Review/sprint15-verification.md`.
|
||||
|
||||
### Sprint 7 — Fix webui "empty meal plan" (date-semantics mismatch)
|
||||
|
||||
|
||||
@@ -120,3 +120,44 @@ Sprint 15 does not require a migration or new runtime deps. The 18 newly-importe
|
||||
## Open question for follow-up
|
||||
|
||||
**Q1 — Re-run `scripts/seed_recipes.py` on a later day to seed the remaining 32 recipes?** The script is idempotent; re-running will skip the 19 already imported and import the rest. The user can do this from the host with one command.
|
||||
|
||||
---
|
||||
|
||||
## Sprint 15 — Round 2 (2026-06-07): +18 recipes, library at 67 total
|
||||
|
||||
**User direction (2026-06-07):** "please add more meals to the potential list" / "Pull in more recipes so we have a larger sample to generate from."
|
||||
|
||||
### What changed
|
||||
|
||||
- **`scripts/seed_recipes_round2.py` (NEW, ~120 lines)** — second-round seed script. Same idempotent behavior as round 1 (409 on duplicate). Different query list focused on cuisines and meal types the round 1 list didn't cover: Indian (8) + Thai (6) + Chinese regional (6) + Soups & stews (6) + Salads (6) + Sandwiches/wraps (5) + Breakfast (5) + German/European (4) + French (4) = 50 queries.
|
||||
- **Result:** 18 recipes imported (queries 1, 2, 3, 5, 6, 7, 8, 10, 17, 19, 21, 22, 23, 24, 25, 27, 28, 29). 12 queries returned no hits (Spoonacular's free-tier index doesn't include all titles, e.g. "chana masala", "thai basil chicken", "dan dan noodles"). Query 30 ("wedge salad") hit 402 mid-import, ending the run.
|
||||
|
||||
### Updated DB state
|
||||
|
||||
```
|
||||
spoonacular | total
|
||||
------------+-------
|
||||
37 | 67
|
||||
```
|
||||
|
||||
- 19 from round 1 + 18 from round 2 = 37 Spoonacular recipes.
|
||||
- 30 manual recipes from before.
|
||||
- **67 unique recipes total.** 4 weeks × 21 meals = 84 picks needed; 67 unique = 1.25× coverage (some rotation, but no full uniqueness across 4 weeks — some meals will repeat).
|
||||
|
||||
### LLM test (Sprint 13 endpoint, week 2026-07-20, prompt: "variety, mix of cuisines, family-friendly, no repeats")
|
||||
|
||||
```json
|
||||
{"plan_id": "04fe4860-...", "picked_count": 0, "filled_count": 21, "failed_count": 0, "reasoning": null}
|
||||
```
|
||||
|
||||
- **21/21 slots filled, 0 failed.** Round 1 returned 19/21 + 2 failed; round 2's expanded library now covers all 21 slots. The LLM still returned 0 picks (Sprint 13 tolerance took over).
|
||||
- The library fill uses the Sprint 6+ `fillEmptySlots` pattern: prefers un-used recipes, falls back to any. With 67 unique recipes, a 21-slot week has plenty of un-used options.
|
||||
|
||||
### Round 2 follow-up
|
||||
|
||||
- **Q2 — Run a third round?** Quota resets every 24h. The next day, the user can re-run `scripts/seed_recipes.py` (round 1, will pick up where round 2 left off) or design a round 3 with even more variety. The 67 → 80-100 trajectory is realistic.
|
||||
- **Q3 — Lower `_DAILY_LIMIT=140` to 45** to match the real 50-pt free-tier cap. Doesn't block; surface in the next sprint that touches the recipe_search.py file.
|
||||
|
||||
### Cost (corrected, both rounds)
|
||||
|
||||
Free tier is 50 pts/day. Each query = 1.10 (search) + 1 (information) = 2.10 pts. 50 queries = 105 pts ≈ 2 days. Round 1 imported 18, round 2 imported 18 = 36 new recipes from ~60 queries. Round 3 could add 30 more.
|
||||
|
||||
@@ -153,6 +153,8 @@ The app looks polished on the surface (Tailwind palette, clean cards, working to
|
||||
> - **Verification log:** `Review/sprint15-verification.md` (full breakdown of 18 imported, free-tier math, LLM test, risk table).
|
||||
> - **No new runtime dependencies. No schema changes. No UI changes. Deploy is `git pull` + `docker compose up -d --build backend frontend` (backend picks up the main.py fix; the 18 new recipes are already in the DB).**
|
||||
>
|
||||
> **Sprint 15 Round 2 (2026-06-07):** +18 recipes, library at 67 total. `scripts/seed_recipes_round2.py` (NEW, ~120 lines) — 50-query list focused on cuisines the round 1 list didn't cover: Indian (8) + Thai (6) + Chinese regional (6) + Soups & stews (6) + Salads (6) + Sandwiches/wraps (5) + Breakfast (5) + German/European (4) + French (4). Same idempotent behavior (409 on duplicate). 18 imported; 12 queries returned no hits from Spoonacular's free-tier index; 30th query hit 402. LLM test (Sprint 13, week 2026-07-20, prompt "variety, mix of cuisines, family-friendly, no repeats"): `picked_count=0 / filled_count=21 / failed_count=0`. **Library now covers all 21 slots of a week.** Tracking: appended to `Review/sprint15-verification.md`.
|
||||
>
|
||||
>
|
||||
> **Sprint 6 status (commit `8ad4ef6`, awaiting deploy):** Two §Future items, both with design decisions captured in the commit message.
|
||||
> - **F3** Bulk 'add checked to pantry' on ShoppingList. Backend `POST /api/pantry/bulk` accepts `{items: HomePantryCreate[]}` and returns per-item status (`added` / `updated` / `skipped`) with totals. Per-item failure model: unknown ingredient → `skipped` with reason, not a 4xx. Frontend ShoppingList gains a primary `Add N to pantry` button next to the existing Reset button; toast reports `added X, updated Y, skipped Z`; only the items that actually landed are removed from the checked Set. **Scope decision:** ShoppingList only (the checked Set was the natural substrate; Pantry would need new multi-select UI).
|
||||
|
||||
Reference in New Issue
Block a user