Skill: drewsadik-ctrl/kitchen-compass (version 1.0.1)

--- name: kitchen-compass description: Build and operate a portable Kitchen Compass meal-planning workspace. Use when setting up a Kitchen Compass household data root, converting recipes into the Kitchen Compass markdown contract, building/querying the dinner-and-side catalog, generating weekly dinner plans, or recording meal history without mixing the reusable engine with household-specific data. --- # Kitchen Compass Use this skill to keep the reusable Kitchen Compass engine separate from household data. ## Operating rules - Keep the skill directory portable. Do not store a user's real recipes, inventory, or history inside the skill. - Treat the user-data root as the authored source of truth. Generated files are rebuildable. - Inventory changes must be explicit; never silently subtract or fabricate real-time stock state. - Treat the installed skill directory as the canonical source for portable engine logic, templates, and contract docs. If a separate live or development copy exists, sync changes deliberately instead of editing both copies independently. - Preserve the frozen recipe contract. Exact recipe labels, section order, enum sets, and composition semantics live in `references/recipe-schema.md`. - Preserve runtime assumptions and history shape from `references/runtime-contract.md`. - If machine-used contract constants must change, update `scripts/contract.py` deliberately and then keep the reference docs aligned. - Stay conservative: this v1 engine only guarantees dinner + side query/planner support. ## Decide what to read first - For setup or folder creation, read `references/setup-flow.md`. - For recipe editing, migration, validation, or exact field values, read `references/recipe-schema.md`. - For history editing or runtime expectations, read `references/runtime-contract.md`. - For optional weekly deal brief setup or output shape, read `references/weekly-deal-brief.md`. - For portability questions or boundary rules, read `references/user-data-layout.md` and `references/live-vs-portable-boundary.md`. ## Use the bundled scripts Assume the shell is currently in the installed `kitchen-compass` skill directory: ```bash cd /path/to/kitchen-compass ``` Then run scripts from `scripts/` against a household data root. ### Initialize a new household data root ```bash python3 scripts/setup_household.py --data-root /path/to/kitchen-compass-data ``` This creates the canonical user-data layout and copies the bundled sample recipes under `assets/sample-household/` plus `_recipe-template.md`. The legacy `FOOD_BRAIN_DATA_ROOT` env var still works but is deprecated — prefer `KITCHEN_COMPASS_DATA_ROOT`. ### Build the query catalog ```bash python3 scripts/build_recipe_query_index.py --data-root /path/to/kitchen-compass-data ``` The index builder validates every recipe against the frozen contract before writing the catalog and exits nonzero on any failure. Pass `--skip-validation` to bypass in a pinch; normal usage should leave it on. ### Query recipes ```bash python3 scripts/query_recipes.py --data-root /path/to/kitchen-compass-data --meal-type dinner --wants-side ``` ### Add or update remembered inventory ```bash python3 scripts/manage_inventory.py --data-root /path/to/kitchen-compass-data add --label "Ground beef" --location freezer --kind protein --amount 3 --unit lb python3 scripts/manage_inventory.py --data-root /path/to/kitchen-compass-data use --item freezer-ground-beef --amount 1 --unit lb --confirmed ``` ### Build a weekly plan ```bash python3 scripts/build_weekly_plan.py --data-root /path/to/kitchen-compass-data --preset balanced ``` ### Manage optional weekly deal sources ```bash python3 scripts/manage_deal_sources.py --data-root /path/to/kitchen-compass-data show python3 scripts/manage_deal_sources.py --data-root /path/to/kitchen-compass-data add-store --label "Giant - Boot Rd" --retailer giant --source-type circular-url --source-url "https://example.com/circular" --retrieval-step "Resolve saved store before trusting the flyer" --default python3 scripts/manage_deal_sources.py --data-root /path/to/kitchen-compass-data set-scan-schedule --day-of-week friday --time-local 12:00 --timezone America/New_York ``` ### Prepare the weekly deal scan and combine store outputs ```bash python3 scripts/prepare_weekly_deal_scan.py --data-root /path/to/kitchen-compass-data --week-of 2026-04-21 python3 scripts/render_combined_weekly_deal_sheet.py --data-root /path/to/kitchen-compass-data ``` ### Render a manual single-store weekly deal brief ```bash python3 scripts/render_weekly_deal_brief.py --data-root /path/to/kitchen-compass-data ``` ### Record history ```bash python3 scripts/record_meal_history.py --data-root /path/to/kitchen-compass-data --event-type made --recipe burger-bowls ``` Duplicate events — same `(date, recipe, meal_slot, event_type)` — are skipped by default with a warning. Pass `--allow-duplicate` to write anyway, or `--replace` to substitute the existing event in place. ### Quiet / verbose flags Every script supports `--verbose` to print the resolved data root to stderr; alternatively set `KITCHEN_COMPASS_VERBOSE=1`. Mutation scripts (`manage_inventory`, `manage_deal_sources`, `record_meal_history`, `prepare_weekly_deal_scan`) support `--quiet` for a one-line confirmation and `--silent` for no stdout output. ## Workflow 1. Initialize or inspect the user-data root. 2. Add or normalize recipe markdown files using the frozen template. 3. Validate recipes against the frozen contract. 4. Rebuild the query catalog after recipe changes. 5. Query or plan from generated outputs. 6. Optionally add or confirm inventory state. 7. Optionally configure manual weekly deal brief store/source setup and preferred scan schedule. 8. Prepare the weekly deal scan packet, curate per-store briefs, and render the combined weekly deal sheet. 9. Record meal history so planning can use recency. ## Assets - `assets/recipe-template.md` is the reusable authored template. - `assets/sample-household/` is seed content only. It ships with nine sample recipes spanning four protein families, both `dinner` and `side` meal types, and a mix of statuses so presets and pairing intel have real data to work with. Replace or expand the set with real household data as needed.

path: pyproject.toml
content: [build-system]
requires = ["setuptools>=61"]
build-backend = "setuptools.build_meta"

[project]
name = "kitchen-compass"
version = "0.1.0"
description = "Portable household meal-planning skill: recipe catalog, weekly planner, inventory, and weekly deal briefs."
readme = "README.md"
license = { file = "LICENSE" }
requires-python = ">=3.10"
authors = [{ name = "Drew Sadik" }]

[project.optional-dependencies]
dev = ["pytest>=7"]

[project.urls]
Repository = "https://github.com/drewsadik-ctrl/kitchen-compass"

[tool.setuptools]
py-modules = []


path: README.md
content: # Kitchen Compass

A OpenClaw / Claude skill for planning the week's dinners — conversationally.

You have 20-ish dinners you actually cook. The problem isn't that you need more recipes. It's that every Sunday you have to pick which four or five to do this week, and somehow you end up with chicken three nights in a row and ordering Chipotle on Thursday.

Home cooking is less satisfying when it takes Operation Desert Storm level planning and logistics to pull off. 

Kitchen Compass turns it into a conversation with an agent:

> **You:** Plan me an easy week. We had burger bowls last night.
>
> **Agent:** *(records the history event, runs the planner against your recipes)* Here's an easy week built off what you just cooked — Slow Cooker Garlic Parmesan Chicken Tuesday, Baked Pork Chops with garlic mashed potatoes Wednesday, Sheet-Pan Shrimp Fajitas Thursday. Different protein each night, nothing that needs much effort, and it keeps you away from burger bowls since you just had them.
>
> **You:** Swap the shrimp for something my kids will eat.
>
> **Agent:** *(re-queries the planner with a family-table constraint)* Swapped to Slow Cooker Short Ribs — better family-table fit and still low friction on a weeknight.

And when it's time to cook, the recipe comes back in the same conversation:

> **You:** Need to start the garlic parm chicken for tonight, can you send me the recipe?
>
> **Agent:** Yep — here you go.
>
> **Slow Cooker Garlic Parmesan Chicken**
>
> - Serves: about 4, maybe 5 with extra sides
> - Prep: 15–20 min
> - Cook: 6–7 hrs low or 3–4 hrs high
>
> **Ingredients**
>
> - 8 bone-in, skin-on chicken thighs
> - 2 tsp garlic salt
> - 2 tsp paprika
> - 2 tsp pepper
> - 6 cloves garlic, minced
> - 6 tbsp extra virgin olive oil, divided
> - 2 lb baby potatoes, halved or quartered
> - 2 cups shredded Parmesan
> - Parsley, optional
>
> **Instructions**
>
> 1. Mix garlic salt, paprika, and pepper in a small bowl.
> 2. ...

Gone are the days of digging through a drawer for the index card, or scrolling past fourteen pop-up ads and a blogger's Tuscany honeymoon story to find out how long to sear the chicken. Your recipes live in your data root; the agent surfaces them on request.

Under the hood there's a deterministic planning engine — weighted scoring, hard constraints, history-aware, composition-aware — but you don't drive it. The agent drives it. You talk.

## What you need

Kitchen Compass is a **skill**, not a standalone app. It needs an agent host with filesystem access to be useful.

**Primary host: Openclaw.** This is the host it was built against and the one to install on first. Openclaw is model-agnostic (run it against Claude, or whatever else you prefer) and it runs the agent against your local filesystem, which means your recipes, history, and inventory all live on your machine and persist between conversations.

**Should also work, but untested:** Claude Code and Claude Cowork. Both can read and write the local filesystem and invoke scripts, so the skill should operate normally in either environment. File an issue if you try one and it misbehaves.

**Not a fit:** a chat interface with no connected filesystem. The skill needs to persist recipes, history, and inventory between turns.

## What you can say to it

Once installed, the agent handles all of these conversationally:

### Planning

- "Plan me a cheap week."
- "Build a balanced plan for hosting on Saturday."
- "Give me four easy dinners — nothing fussy."
- "Why did you pick the short ribs?" (the agent reads you the per-pick reasons)
- "Swap Wednesday for something low-carb."

### Recording what you cooked

- "We had burger bowls tonight."
- "Made the short ribs for Sunday dinner."
- "Planned pasta for Thursday but we ended up doing takeout."

History shapes next week's plan automatically. Dinners you actually made count more than dinners you only planned.

### Pulling up a recipe when it's time to cook

- "What's in burger bowls again?"
- "Pull up the short ribs recipe."
- "Read me the steps for the pork chops."
- "What sides go with the baked chicken?"

The full recipe — ingredients, steps, your house notes — comes back in chat. No searching, no ads, no hunting.

### Adding a new recipe

The recommended path is to hand the agent a link. "Add this recipe to my catalog: *https://some-food-blog.example.com/fantastic-salmon*" and the agent will read the page, pull the actual recipe out, and write it to your catalog in the right schema. A photo or a copy-paste works the same way.

You can layer house changes on top in plain language:

- "Drop the cilantro."
- "We use half a cup of olive oil instead of the full cup it calls for."
- "Add 'finish under the broiler for two minutes' at the end — I like the skin crispy."

The agent tracks both the original and your house version, so you always know what the source recipe said and what you changed.

### Leaving notes on existing recipes

Plain-language comments become structured recipe updates.

- "The garlic parmesan chicken takes longer than the recipe says because I broil it at the end. Update the recipe."
- "The roasted broccoli is better at 425 than 400. Save that."
- "We always double the garlic in the mashed potatoes."

### Inventory

- "Put two pounds of ground beef in the freezer."
- "Used the last of the pork chops."
- "What's in the freezer right now?"

Inventory nudges the planner toward dinners you already have ingredients for.

### Querying the catalog

- "What beef recipes do I have?"
- "Show me self-contained dinners that don't need a side."
- "What can I make with what's in the freezer?"

### Weekly deals

- "Scan this week's Aldi flyer." (the agent walks the saved retrieval recipe)
- "Here are the key deals — which ones should I build this week's plan around?"

After reviewing the deals, you decide which to incorporate. The agent replans with those proteins or ingredients in mind. Deals never enter planner scoring automatically — that's deliberate, so you don't end up eating what's on sale instead of what fits the week.

### Shopping lists

- "Build me a shopping list for this week's plan. Leave out spices and pantry staples we already have."

The agent reads the plan, consolidates ingredients across recipes, and subtracts anything you've told it is already in the pantry or freezer.

## Not a recipe discovery tool — the right home for the ones you do discover

Kitchen Compass won't recommend dinners you've never heard of. What it *will* do is give you the exact right place to store that great recipe you came across on Instagram, or the one your sister-in-law mentioned at Thanksgiving, or the one you pulled off a blog last year and swore you'd make again.

Hand it to the agent, tell it about your house changes, and it's in rotation the next time you plan a week. The recipes you discover stop evaporating.

## Quick verification (optional)

If you want to prove the engine works before wiring it up to an agent, the scripts run standalone:

```bash
git clone https://github.com/drewsadik-ctrl/kitchen-compass.git
cd kitchen-compass
python3 scripts/setup_household.py --data-root ~/kitchen-compass-data
python3 scripts/build_recipe_query_index.py --data-root ~/kitchen-compass-data
python3 scripts/build_weekly_plan.py --data-root ~/kitchen-compass-data --preset balanced
```

You'll get a rendered weekly plan against the shipped sample household. Once you've seen that work, point Openclaw (or your other agent host) at the skill directory and a data root, and stop running the scripts by hand.

## What a plan looks like

Real output from the sample household on the balanced preset. This is what the agent is reading (and paraphrasing) when it tells you about your week:

```
# Balanced week

Default practical week: mostly trusted, low-friction dinners with one slot
for something slightly more interesting.

- Target dinners: 3
- Picked dinners: 3
- Protein variety: {"beef": 1, "chicken": 1, "pork": 1}
- Effort mix: {"easy": 3}
- Friction mix: {"low": 3}

## Dinner 1 — Burger Bowls
- Why it made the cut: easy to cook; low ingredient friction; trusted house
  recipe; good family-table fit; self-contained dinner
- Composition: self-contained dinner this week; no extra side is required.

## Dinner 2 — Slow Cooker Garlic Parmesan Chicken
- Why it made the cut: easy to cook; low ingredient friction; trusted house
  recipe; good family-table fit; self-contained dinner
- Composition: self-contained dinner this week; no extra side is required.

## Dinner 3 — Baked Pork Chops
- Why it made the cut: easy to cook; low ingredient friction; trusted house
  recipe; good family-table fit; needs side support
- Composition: treat this as a main that wants a side: Garlic Mashed Potatoes.
- Suggested side: Garlic Mashed Potatoes — dinner explicitly asks for
  garlic mashed potatoes.
```

The per-pick reason strings are the planner's main debugging surface. The agent surfaces them when you ask.

## What it does not

- **Scrape retailer circulars autonomously.** Deal retrieval is manual or guided. The per-store retrieval notes capture what worked last time, so it gets easier with repetition.
- **Plan breakfast, lunch, snacks, or desserts.** v1 is dinner plus side.
- **Track real-time stock.** Inventory is remembered approximate state, not a live count.
- **Wash your car.**

## Design principles

**Explainability over cleverness.** Every pick comes with reason strings. The LLM isn't making the picks — it's running a deterministic engine and explaining what came out. That separation is what keeps the planner trustworthy even when the conversation feels magical.

**Hard constraints and soft signals stay separated.** Whether a recipe is *allowed* in the week is a different question from how it *ranks*. Preserving that boundary is what keeps a high-scoring week from being a miserable one.

**Your recipes, not somebody else's.** Kitchen Compass is not a recipe discovery tool. It operates on the dinners you already know how to make — and gives you a durable home for the new ones you find.

**Portable engine, separate user data.** The skill ships no real household data. The engine points at a `--data-root` you own. Move it, back it up, or version it independently.

**Authored vs. generated is enforced.** Recipes, household config, inventory state, history, and deal inputs are things you author (or that the agent writes on your behalf). Everything under `generated/` is rebuildable. Nothing under `generated/` is ever read back in as input.

## How the planner works

When the agent asks for a week, the planner runs a strict five-level signal hierarchy:

1. **Hard constraints.** Preset-level caps on involved meals, expensive meals, friction-heavy meals, aspirational or testing meals, and side-dependent dinners. These eliminate candidates regardless of how well they would otherwise score.
2. **Core scoring signals.** Weighted preferences over effort, friction, cost, trustedness, serving profile, composition, and context.
3. **Week-balance shaping.** Penalties for repeating a protein family, stacking side-dependent dinners, stacking moderate-or-involved meals.
4. **History-aware shaping.** Recent-repeat penalties, long-gap bonuses, recent protein and role concentration penalties. Dinners you actually made count more than dinners you only planned.
5. **Optional signals.** Remembered inventory contributes a small capped bonus that can nudge tie-breakers but cannot repair a bad week.

Weekly deal briefs sit **outside** that stack. They can inform a human decision to pivot the week, but they never enter planner scoring automatically.

Presets (`balanced`, `easy`, `cheap`, `low-carb`, `hosting-friendly`) change both hard caps and scoring weights. Full explanation in `references/planning-logic.md`. Exact numbers live in `scripts/planner/presets.py`.

## Repository layout

- `SKILL.md` — instructions for the agent operating Kitchen Compass
- `scripts/` — CLI entrypoints the agent invokes, plus the `planner/` package (candidates, scoring, history, render)
- `scripts/contract.py` — single source of truth for schema constants and enums
- `references/` — recipe schema, runtime contract, planning logic, inventory logic, setup flow, deal brief contract, portability boundary
- `assets/sample-household/` — seeded sample recipes and household config
- `assets/recipe-template.md` — authoring template for new recipes
- `tests/` — pytest suite: contract alignment, validation, planner scoring, history, end-to-end golden path
- `Makefile` — `test`, `smoke`, `plan`

## Key scripts

The agent invokes these on your behalf. You don't need to memorize them. They're documented here for contributors and for debugging.

Each takes `--data-root <path>` or reads `KITCHEN_COMPASS_DATA_ROOT`. The legacy `FOOD_BRAIN_DATA_ROOT` still works but is deprecated.

- `setup_household.py` — bootstrap a fresh data root from the sample household
- `validate_recipes.py` — enforce the recipe schema
- `build_recipe_query_index.py` — rebuild the query catalog from validated recipes
- `build_weekly_plan.py` — render a weekly plan against a preset
- `query_recipes.py` — filter recipes by meal type, composition, diet, etc.
- `manage_inventory.py` — explicit inventory updates
- `record_meal_history.py` — append history events
- `manage_deal_sources.py` — saved stores, retrieval recipes, scan schedule
- `prepare_weekly_deal_scan.py` — weekly scan packet and per-store stubs
- `render_weekly_deal_brief.py` — single-store weekly brief
- `render_combined_weekly_deal_sheet.py` — combined weekly sheet grouped by category

## Developing

```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

make test    # pytest: contract alignment, validation, planner scoring, history, golden path
make smoke   # full CLI golden path against a throwaway data root
make plan    # bootstrap a sample root and render one plan
```

Both `make test` and `make smoke` should pass before opening a PR. See [CONTRIBUTING.md](CONTRIBUTING.md) for the invariants — especially the frozen recipe schema and the rule against casually tuning planner weights.

## Status

v1. Built and daily-driven against Openclaw. Claude Code and Cowork should work but haven't been validated yet. The active planner guarantees dinner plus side. The deal workflow is manual or guided by design. Inventory is approximate household memory, not real-time stock. Everything documented here is honest about its seams.

## License

[MIT](LICENSE)


path: CONTRIBUTING.md
content: # Contributing to Kitchen Compass

Thanks for opening a contribution. This project is small and opinionated; the rules below exist because prior changes have bitten us.

## Ground rules

1. **The recipe schema is frozen.** Do not add, remove, or rename fields in `scripts/contract.py` or `references/recipe-schema.md`. If a change seems to require a schema change, open an issue before sending a patch.
2. **`scripts/contract.py` and `references/recipe-schema.md` must stay aligned.** Any change to one requires a matching change to the other in the same commit. `tests/test_contract_alignment.py` enforces this.
3. **Planner scoring is not to be changed casually.** Presets, weights, hard constraints, and history/inventory math in `scripts/build_weekly_plan.py` (and the `scripts/planner/` package) are intentional. Restructuring is fine; changing behavior is not. Capture a scoring decision in a commit message *before* adjusting it.
4. **Preserve the authored-vs-generated boundary.** Nothing under `generated/` is an input. Every file there must be rebuildable from authored sources.
5. **Do not ship real household data inside the skill.** Sample content under `assets/sample-household/` uses placeholder values only.

## Dev setup

```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
```

## Pre-PR check

```bash
make test   # pytest
make smoke  # full CLI smoke test
```

Both must pass before opening a PR.

## Commit style

- One task per commit.
- Commit message explains *why*, not what.
- Co-authored commits from tooling are fine; keep the trailer format.


path: assets/recipe-template.md
content: # Recipe Name

## Snapshot
- **Source:**
- **Status:** trusted | testing | aspirational
- **Meal Type:** dinner | side | breakfast-brunch | snack | appetizer-party | dessert | component
- **Structural Role:** full-meal | base | component | pairing | filler-meal
- **Core Protein / Main Ingredient:**
- **Serves:**
- **Time:**
- **Cooking Effort:** easy | moderate | involved
- **Ingredient Friction:** low | medium | high
- **Cost:** cheap | medium | expensive
- **Serving Profile:** small-table | family-table | crowd-friendly
- **Diet Modes:**
- **Context / Occasion:**
- **Flexibility:** rigid | some-flex | forgiving
- **Pair With:**
- **Tags:**

## Ingredients
-

## Instructions
1.

## House Tweaks / Change Log
- Ingredients and instructions above should already reflect the current house version.
- Log what changed from the original source recipe here.

## Planning Notes
- **Serving assumptions:**
- **Scaling notes:**
- **Composition:** self-contained | wants-side | needs-protein-pairing | flexible
- **Pairing notes:**
- **Deal / sale notes:**
- **Visual reference:**

## Notes
-


path: assets/sample-household/household/stores.json
content: {
  "preferred_stores": [],
  "notes": [
    "Store details here remain optional household context in v1.",
    "Weekly deal briefs are manual setup only: save the exact store/source you want to use instead of pretending ZIP-only discovery is reliable.",
    "If a store retrieval works once, save the store-specific retrieval recipe here so the next run can reuse what actually worked.",
    "The planner/query scripts do not read store-specific behavior or deal data as scoring input."
  ],
  "item_preferences": {},
  "weekly_deal_brief": {
    "enabled": false,
    "default_store_ids": [],
    "scan_schedule": {
      "day_of_week": "friday",
      "time_local": "12:00",
      "timezone": "America/New_York"
    },
    "stores": []
  }
}


path: assets/sample-household/household/preferences.json
content: {
  "planning": {
    "default_preset": "balanced",
    "default_dinners_per_week": 3,
    "prioritize_inventory": false
  },
  "notes": [
    "The v1 planner reads planning.default_preset, planning.default_dinners_per_week, and planning.prioritize_inventory.",
    "prioritize_inventory only matters for households actively using structured inventory; empty/default setups still get no inventory effect.",
    "Use history/events.jsonl for meal history and recency, not a toggle in this file."
  ]
}


path: assets/sample-household/household/profile.json
content: {
  "household_id": "sample-household",
  "display_name": "Sample household",
  "members": {
    "adults": 2,
    "children": 0
  },
  "notes": [
    "Replace these values with the real household shape.",
    "Recipe-level serving notes remain the authoritative source for individual meal behavior."
  ]
}


path: assets/sample-household/inventory/items.json
content: {
  "version": 1,
  "updated_at": null,
  "items": []
}


path: assets/sample-household/inventory/freezer.md
content: # Freezer Notes

Use `inventory/items.json` for machine-readable remembered inventory.

Keep this markdown file only for human notes like:
- priority cuts to use soon
- packaging reminders
- context that does not belong in the structured JSON state


path: assets/sample-household/recipes/slow-cooker-garlic-parmesan-chicken.md
content: # Slow Cooker Garlic Parmesan Chicken

## Snapshot
- **Source:** https://www.persnicketyplates.com/slow-cooker-garlic-parmesan-chicken/
- **Status:** trusted
- **Meal Type:** dinner
- **Structural Role:** full-meal
- **Core Protein / Main Ingredient:** chicken
- **Serves:** about 4 people, maybe 5 with other sides
- **Time:** 15-20 minutes prep, then 6-7 hours on low or 3-4 hours on high
- **Cooking Effort:** easy
- **Ingredient Friction:** low
- **Cost:** medium
- **Serving Profile:** family-table
- **Diet Modes:**
- **Context / Occasion:** weeknight
- **Flexibility:** some-flex
- **Pair With:** side: simple vegetable side, side: salad, side: bread
- **Tags:** chicken, slow-cooker

## Ingredients
- 8 bone-in, skin-on chicken thighs
- 2 teaspoons garlic salt
- 2 teaspoons paprika
- 2 teaspoons pepper
- 6 cloves garlic, minced
- 6 tablespoons extra virgin olive oil, divided
- 2 pounds baby potatoes, halved or quartered depending on size
- 2 cups shredded Parmesan
- parsley, for garnish (optional)

## Instructions
1. In a small bowl, mix the garlic salt, paprika, and pepper together.
2. Sprinkle half of the seasoning mixture on the chicken thighs.
3. In a medium skillet over medium-high heat, add 1 tablespoon of olive oil. Place the chicken thighs skin-side down and sear for about 2 minutes, or until golden.
4. Combine the remaining seasoning mixture with the minced garlic and remaining olive oil.
5. Halve or quarter the baby potatoes depending on size.
6. Toss the potatoes with the garlic-seasoning-oil mixture and place them in the bottom of the slow cooker.
7. Add the chicken on top of the potatoes.
8. Cook on low for 6-7 hours or on high for 3-4 hours.
9. Remove the chicken thighs and place them under the broiler for a few minutes until the skin gets crispy again.
10. Right before serving, sprinkle with the Parmesan cheese.
11. Top with parsley if using.
12. Serve.

## House Tweaks / Change Log
- Ingredients and instructions above reflect the current house version.
- House default uses the 2x version of the original recipe: 8 chicken thighs instead of 4.
- After slow cooking, remove the thighs and broil them at the end so the skin crisps back up before serving.
- Can also be made in a large roasting pan if serving more than 4 people.

## Planning Notes
- **Serving assumptions:** The current house batch serves about 4 people comfortably, maybe 5 if there are extra sides.
- **Scaling notes:** The doubled house version is already the default; beyond that, a larger pan / roasting-pan setup is the cleaner move than overpacking the slow cooker.
- **Composition:** self-contained
- **Pairing notes:** Potatoes are built in, so this already lands as a full meal; extra sides are optional rather than required.
- **Deal / sale notes:** Good standard rotation meal when chicken thighs and baby potatoes are easy to buy.
- **Visual reference:** None stored yet.

## Notes
-


path: assets/sample-household/recipes/slow-cooker-short-ribs.md
content: # Slow Cooker Short Ribs

## Snapshot
- **Source:** house
- **Status:** aspirational
- **Meal Type:** dinner
- **Structural Role:** full-meal
- **Core Protein / Main Ingredient:** beef
- **Serves:** 4
- **Time:** about 20 minutes prep, 8 hours slow cook
- **Cooking Effort:** moderate
- **Ingredient Friction:** medium
- **Cost:** expensive
- **Serving Profile:** small-table
- **Diet Modes:** low-carb
- **Context / Occasion:** hosting, weekend
- **Flexibility:** some-flex
- **Pair With:** side: garlic mashed potatoes, side: roasted broccoli, support: red wine jus
- **Tags:** beef, slow-cooker, hosting

## Ingredients
- 4 lb bone-in beef short ribs
- 2 tablespoons olive oil
- 1 yellow onion, chopped
- 4 cloves garlic, smashed
- 2 tablespoons tomato paste
- 1 cup dry red wine
- 2 cups beef stock
- 2 sprigs rosemary
- salt and pepper

## Instructions
1. Season ribs with salt and pepper; sear in olive oil on all sides, about 2 minutes per side.
2. Transfer ribs to the slow cooker.
3. Sauté onions in the same pan until soft; add garlic and tomato paste, cook 1 minute.
4. Deglaze with wine, scrape the fond, simmer 3 minutes.
5. Pour pan mixture, stock, and rosemary into the slow cooker.
6. Cook on low 8 hours until ribs are fork-tender.
7. Skim fat and serve over mashed potatoes with pan sauce.

## House Tweaks / Change Log
- Aspirational — we haven't tested this at home yet; source is a composite from two restaurant meals.

## Planning Notes
- **Composition:** wants-side
- **Pairing notes:** Needs a starch and a vegetable to anchor the plate.

## Notes
-


path: assets/sample-household/recipes/baked-pork-chops.md
content: # Baked Pork Chops

## Snapshot
- **Source:** https://downshiftology.com/recipes/baked-pork-chops/#recipe
- **Status:** trusted
- **Meal Type:** dinner
- **Structural Role:** full-meal
- **Core Protein / Main Ingredient:** pork
- **Serves:** about 4 with sides; likely needs a slight bump if used in carnivore mode without sides
- **Time:** about 25 minutes
- **Cooking Effort:** easy
- **Ingredient Friction:** low
- **Cost:** medium
- **Serving Profile:** family-table
- **Diet Modes:** low-carb, carnivore-mode
- **Context / Occasion:** weeknight
- **Flexibility:** some-flex
- **Pair With:** side: garlic mashed potatoes, side: ultra crispy smashed potatoes, side: garlic-parmesan roasted cauliflower, side: applesauce
- **Tags:** pork, baked

## Ingredients
- 4 pork chops, bone-in or boneless, at least 1-inch thick
- 2 tablespoons extra virgin olive oil
- 1 tablespoon paprika
- 1 tablespoon coconut sugar (or brown sugar)
- 2 teaspoons garlic powder
- 2 teaspoons onion powder
- 1 1/2 teaspoons dried oregano
- 1 teaspoon kosher salt
- 1/4 teaspoon ground black pepper

## Instructions
1. Preheat the oven to 400°F.
2. In a small bowl, stir together the paprika, coconut sugar, garlic powder, onion powder, dried oregano, salt, and pepper.
3. Place the pork chops in a baking dish or on a rimmed baking sheet.
4. Drizzle the olive oil on both sides.
5. Sprinkle the seasoning on both sides and rub it in.
6. Bake uncovered for 15-20 minutes, until an instant-read thermometer reads 145°F.
7. Let the pork chops rest for 5 minutes.
8. Serve with pan juices spooned on top.

## House Tweaks / Change Log
- Ingredients and instructions above reflect the current house version.
- No house tweaks logged yet.

## Planning Notes
- **Serving assumptions:** About 4 people with sides; if this is functioning as a carnivore-style dinner without filler sides, plan a little more pork.
- **Scaling notes:** Easy to scale by adding more chops; this naturally tops out around a family-table meal unless multiple pans are used.
- **Composition:** wants-side
- **Pairing notes:** Normal pairing is potatoes and/or a vegetable, plus applesauce.
- **Deal / sale notes:** Worth surfacing when pork chops are on sale because the recipe itself is otherwise low-friction.
- **Visual reference:** None stored yet.

## Notes
-


path: assets/sample-household/recipes/roasted-broccoli.md
content: # Roasted Broccoli

## Snapshot
- **Source:** house
- **Status:** trusted
- **Meal Type:** side
- **Structural Role:** pairing
- **Core Protein / Main Ingredient:** broccoli
- **Serves:** 4
- **Time:** about 20 minutes
- **Cooking Effort:** easy
- **Ingredient Friction:** low
- **Cost:** cheap
- **Serving Profile:** family-table
- **Diet Modes:** low-carb, vegetarian
- **Context / Occasion:** weeknight
- **Flexibility:** forgiving
- **Pair With:** protein: chicken, protein: pork, protein: beef, protein: shrimp
- **Tags:** veg, side, simple

## Ingredients
- 2 heads broccoli, cut into florets
- 3 tablespoons olive oil
- 1 teaspoon kosher salt
- black pepper
- optional: lemon wedges for serving

## Instructions
1. Preheat oven to 425°F.
2. Toss broccoli with olive oil, salt, and pepper on a rimmed sheet pan.
3. Roast 15-18 minutes until edges are browned.
4. Serve with lemon if using.

## House Tweaks / Change Log
- No changes.

## Planning Notes
- **Composition:** self-contained
- **Pairing notes:** Default low-carb vegetable side; pairs with any simple protein.

## Notes
-


path: assets/sample-household/recipes/crispy-baked-chicken-thighs.md
content: # Crispy Baked Chicken Thighs

## Snapshot
- **Source:** https://thesaltymarshmallow.com/crispy-baked-chicken-thighs/
- **Status:** trusted
- **Meal Type:** dinner
- **Structural Role:** full-meal
- **Core Protein / Main Ingredient:** chicken
- **Serves:** about 4 with sides; likely needs more chicken if used as a carnivore-style dinner without sides
- **Time:** about 45-50 minutes
- **Cooking Effort:** easy
- **Ingredient Friction:** low
- **Cost:** cheap
- **Serving Profile:** family-table
- **Diet Modes:** low-carb, carnivore-mode
- **Context / Occasion:** weeknight, sale-trigger
- **Flexibility:** some-flex
- **Pair With:** side: garlic-parmesan roasted cauliflower, side: loaded cauliflower casserole, side: ultra crispy smashed potatoes, side: simple salad
- **Tags:** chicken, baked, crispy

## Ingredients
- 3 pounds chicken thighs, about 6-8
- 2 tablespoons olive oil
- 2 teaspoons salt
- 2 teaspoons garlic powder
- 2 teaspoons onion powder
- 2 teaspoons Italian seasoning
- 1 teaspoon black pepper
- 1 teaspoon paprika
- 2 teaspoons baking powder

## Instructions
1. Preheat the oven to 400°F. Line a large baking sheet with foil for easier cleanup.
2. Remove the chicken thighs from the packaging and pat them very dry with paper towels.
3. Arrange the chicken thighs on the baking sheet and drizzle with the olive oil, rubbing to coat.
4. In a small bowl, mix together the salt, garlic powder, onion powder, Italian seasoning, black pepper, paprika, and baking powder.
5. Sprinkle the seasoning mixture evenly over the chicken.
6. Bake for 35-45 minutes, until the skin is crispy and the chicken reaches 165°F internally.

## House Tweaks / Change Log
- Ingredients and instructions above already reflect the current house version.
- House version adds 2 teaspoons baking powder to the rub to help the skin crisp up better.

## Planning Notes
- **Serving assumptions:** About 4 people with sides; in carnivore / animal-based mode, plan more chicken because there are no filler sides.
- **Scaling notes:** Easy to scale up by adding more thighs, though sheet-pan space becomes the limiting factor.
- **Composition:** wants-side
- **Pairing notes:** Usually needs to be paired with sides unless the meal is intentionally carnivore-style.
- **Deal / sale notes:** Strong one to surface when chicken thighs are cheap.
- **Visual reference:** None stored yet.

## Notes
-


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)