| name | confirm |
| description | Graduate a fully-locked option board into the week's confirmed menu, per-store shopping list, and receipt forecast. Refuses if any slot is still unlocked. Use when the user runs /meal-planner:confirm, explicitly locks in an option ("go with Option A", "lock Option B for the week"), or is ready to shop. Also owns the actuals retro that closes out the prior week. |
meal-planner: confirm
Turn a locked option into the real menu. Nothing is the menu until the user
explicitly confirms and it is written to disk. Runs in the current working
directory (the data home). Wrapper:
${CLAUDE_PLUGIN_ROOT}/scripts/meal_deals.py.
Confirm a menu
-
Require explicit confirmation. "Looks good" / "sounds fine" are not
confirmation. Proceed only on an explicit lock-in ("go with Option A",
"lock Option A for the week").
-
Graduate the locked option:
uv run "${CLAUDE_PLUGIN_ROOT}/scripts/meal_deals.py" confirm A --data-home .
confirm_menu refuses (non-zero, ValueError) if any slot in the option is
still unlocked — surface the refusal and the slot addresses, don't force it.
On success it writes menus/<wednesday>.md with:
## Dinners — the locked meals (hermes shape, canonical names + sides)
## Shopping — sale items grouped by store, cheaper store chosen per
ingredient, pulled from this week's ranked board
## Forecast — projected total and savings from the Deal price fields
-
Report the menu path, dinner count, and the forecast line, and tell the
user the list is ready to shop.
confirm_menu and the retro auto-record the week's ## Outcome (confirmed
option, then cooks + receipt) into docs/knowledge/almanac/<week>.md — no extra
step needed, so next week's drafting can see what was actually chosen and cooked.
Actuals retro (closes the prior week)
At the start of a new week's planning, before drafting, close last week out
if its menu has no ## Actuals section (this is the retro step
/meal-planner:week step 0 calls into):
- Default inference: every confirmed dinner was cooked.
- Ask exactly one override question — "Anything you didn't end up cooking?"
Pass the exceptions as
skipped=[...]. Don't interrogate.
- Call
meal_deals.record_actuals(".", "<last-week-wednesday>", skipped=[...], receipt_total=<optional>). It appends ## Actuals to the menu and advances
each cooked dinner's card (last_cooked, times_cooked) — skipped cards are
left untouched, and it no-ops if the week is already closed.
- The receipt total is skippable; when given it records the delta vs the
forecast.
- If a variation was tried, call
meal_deals.record_variation_verdict(".", parent, variation, liked=<bool>) — a liked variation promotes to its own
card with provenance; a variation rejected twice gets a back-off flag so it
stops being suggested.
kw routing (optional, runtime-detected)
Standalone is the default codepath. Detect whether the compound-knowledge
kw skills are available this session; route through them only if present. kw
runs with the data home as cwd.
- Before confirming: invoke
kw-review's data-accuracy reviewer, giving it
the raw deals/<week>.json, to verify the forecast's BOGO/sale claims against
the cached Deal data. Surface anything it flags before writing the menu.
- After the retro: invoke
kw-compound on the week's actuals so the
learnings are saved to docs/knowledge/ for future weeks.
If kw is absent, skip both and proceed standalone. See the README's kw table for
the full contract.