cauldron/cauldron/templates
Kayos 07dab10c4b plan UI: numeric daily macro targets + allergen exclusions
The next-tier of structured planning constraints, building on the
free-form preference textarea. Now the household can set hard rules
like '2200 cal/day, 150g protein, no dairy or shellfish' and the
planner enforces them.

Schema (migrations 026 + 027):
- daily_targets_json on cauldron_meal_plans: {calories?, protein_g?,
  carbs_g?, fat_g?} per-day budget. Sonnet sums per-recipe macros
  across the 7-day plan and aims for ±15% of the weekly total.
- exclusions_json on cauldron_meal_plans: list of contains.* keys
  (subset of {dairy, gluten, nuts, peanuts, eggs, shellfish, fish,
  soy, sesame, pork}). Hard filter on AI-chosen slots; picks still
  apply but get flagged with the conflict in their reason field.

DB:
- set_plan_targets_and_exclusions normalizes inputs (drops zeros,
  validates against allowed enum values, lowercases).
- The plan_view path decodes the JSON columns server-side and adds
  display labels (`targets_label`, `exclusions_label`) and the parsed
  dict/list (`targets_dict`, `exclusions_list`) for the template.

Forge:
- generate_plan accepts daily_targets dict + exclusions list.
- New DAILY MACRO TARGETS prompt block — instructs Sonnet to sum
  per-serving macros across all 7 slots and land within ±15% of
  weekly totals; tradeoff slots when needed.
- New STRICT EXCLUSIONS prompt block — recipes whose has: list
  intersects exclusions are forbidden in AI-chosen slots. Picks that
  conflict still appear (explicit user choice) but get flagged in
  the slot reason ("contains dairy — household pick").

Server:
- /api/plan/generate accepts {preference, targets, exclusions}.
  Persists all three before kicking off Sonnet so re-rolls reuse them.
- /api/plan/regenerate same — empty body reuses persisted constraints.

UI (/plan):
- New <details> section "numeric targets + allergen exclusions
  (optional)" tucked under the existing vibe textarea + presets.
- 4 numeric inputs (cal/protein/carbs/fat per day) with quick-set
  preset chips: balanced 2200 / protein lean 2400 / carb load 2600 /
  cut 1800 / clear.
- 10 allergen checkbox chips with red-pill styling when checked
  (uses CSS :has(input:checked) — modern browsers).
- Hydration: persisted targets pre-fill the inputs, persisted
  exclusions pre-check the boxes.
- After generation, three readouts above the action buttons show
  active vibe / macros / exclusions.

Cobb's exact ask "2200 cal/day, protein and carb balanced, no dairy"
now maps to: targets={calories: 2200, protein_g: 150, carbs_g: 250}
+ exclusions=[dairy] + free-form preference (optional). All persist.
Re-rolls iterate within those constraints automatically.
2026-04-30 20:31:28 -07:00
..
_base.html fix: build mealie permalink as /g/<group>/r/<slug>, not /recipe/<slug> 2026-04-28 21:33:10 -07:00
_recipe_card.html v0.2 — meal picks, infinite scroll, search, mushroom vibes, mobile polish 2026-04-28 20:53:07 -07:00
auth_retry.html auth: retry guard on transient OIDC; admin-bearer alt for bulk-start 2026-04-30 10:30:49 -07:00
connect.html ui: extract templates + add /recipes browse + sulkta-meets-gothic palette 2026-04-28 20:38:54 -07:00
consolidate.html Step 3: foods consolidator — cluster + merge dupes via Mealie's API 2026-04-30 12:00:20 -07:00
dedupe_recipes.html recipe dedupe: cluster + Sonnet decide + DELETE via Mealie 2026-04-30 18:16:56 -07:00
enrich_recipes.html recipe enrichment: per-recipe Sonnet meta for smarter planning 2026-04-30 20:08:20 -07:00
list.html v0.3 step 3+4: AI plan generator + /list shopping aggregation 2026-04-29 06:26:54 -07:00
me.html recipe enrichment: per-recipe Sonnet meta for smarter planning 2026-04-30 20:08:20 -07:00
picks.html v0.2: household-shared picks pool + /plan with lock button + scoreboard + streak 2026-04-28 21:11:11 -07:00
plan.html plan UI: numeric daily macro targets + allergen exclusions 2026-04-30 20:31:28 -07:00
recipe_detail.html fix: build mealie permalink as /g/<group>/r/<slug>, not /recipe/<slug> 2026-04-28 21:33:10 -07:00
recipes.html fix /plan 500 + bigger touch targets + sort/category chips + sticky search 2026-04-28 21:26:22 -07:00
sterilize.html sterilize: fan-out compound lines + filter identity rows in diff UI 2026-04-30 11:07:20 -07:00
stub.html ui: extract templates + add /recipes browse + sulkta-meets-gothic palette 2026-04-28 20:38:54 -07:00