---
reliability: 3.8 # 5 − house-style refs .3 − 12-dish batch .3 − GBP cover .3 − social/carousel frames .3; menu PDF is LLM/deterministic; 5 stages, no length penalty; cap ceiling: cross-dish consistency — the critic catches plating drift, but expect 1–2 targeted re-shoots per 12-dish batch
---

# Restaurant menu — agent playbook

> Paste this whole file (with the BRIEF filled in) into Claude cowork, chat, or Code. The agent walks through it with you and stops for your approval at every step that matters.

## What you'll get

A seasonal menu refresh package shot in a consistent house style — every dish looks like it came from the same kitchen and the same camera:

- **12 dish photos** — same plating language, same lighting, same lens. The biggest restaurant-photography problem is that every dish looks like a different restaurant. This fixes that.
- **Seasonal menu PDF** — single-page printable with the dishes laid out for the dining room.
- **4 IG dish posts** — your strongest plates with captions.
- **1 IG story carousel** — "This season's menu" — 6-frame tease for stories.
- **Google Business Profile cover** — wide hero shot, brand-colored, exactly the right ratio.

**Time**: ~30 minutes wall clock. **Your attention**: about 7 minutes across 5 quick approvals. **Cost**: $1.60 – $3.20 end to end.

## Tell the agent about the menu

```yaml
restaurant_name:    # e.g. Olea
cuisine_style:      # e.g. coastal Italian, wood-fire focused
season:             # spring / summer / fall / winter
dishes:             # 8-12 dish names, one per line under this
                    # e.g.
                    #   - house focaccia with bone-marrow butter
                    #   - charred-octopus puttanesca
                    #   - chitarra cacio e pepe
                    #   - whole branzino al sale
brand_palette:      # 4 hex colors, e.g. #1F3A2E #C9A86B #F0E6D2 #2E2625
plating_style:      # rustic / minimalist / vibrant / fine-dining
location_vibe:      # e.g. neighborhood trattoria with a wood-fire hearth, warm low light
```

## Quality controls (new — auto-applied)

This playbook leverages the closed quality loop. The agent applies these by default; you don't have to ask:

- **Cost upfront.** Before any multi-step batch fires, the agent calls `submit_plan` with `confirm:false` and shows you the proposed steps + total cost. Nothing runs until you approve.
- **Auto-retry on weak shots.** The server default is `quality_threshold: 0.7`. For the GBP cover and the strongest 4 dishes the playbook step tells the agent to pass `quality_threshold: 0.85` so a low-confidence first try gets one auto-retry before you see it.
- **Critic verdict on the result.** When the 12-dish batch finishes, the agent reads the `critique` field on the response (verdict: ship / iterate, plus per-dish issues / drift flags) and surfaces it for your review. This is the killer move for restaurant photography — the critic catches plating drift before you do.
- **One-click recovery.** If a step fails, `get_plan` returns a `recovery` hint pointing at `replan({plan_id})` — the agent classifies the failure and proposes a recovery plan you can approve.
- **End-of-project scorecard.** The final wrap-up calls `get_scorecard({project_id})` with succeeded count, mean quality score, critic verdict, total cost, and wall time.

You can override any of these per step.

## How the agent should run this (interaction contract)

1. **CONFIRM (one message, ≤1 question):** restate in 1 line ("<season> refresh for <restaurant>: 12 dishes in one house style + menu PDF + GBP cover + social pack, ~$1.60–3.20, ~30 min") + real choices: plating style (rustic/minimalist/vibrant/fine-dining) · 8 vs 12 dishes · flux-dev (fast photoreal) everywhere vs mai-image-2.5 where tableware carries brand text. One question max.
2. **PREVIEW CHECKPOINT:** the Step 1 house-style references — 3 plates, ~$0.05 — BEFORE the $1.00 12-dish batch. Wrong lighting temperature or ceramic here means 12 wrong dishes there; this is the cheapest taste decision in the playbook.
3. **NARRATE:** "shooting 12 dishes in parallel (~8 min, job …)"; poll `get_create_media` every 10–15s; surface the critic's per-dish drift flags as they land; never silent >2 min through the batch.
4. **FAIL GRACEFULLY:** critic flags plating drift → re-shoot ONLY the 1–2 drifted dishes with the house-style keywords restated (never redo the batch); a dish needs readable brand text on tableware → `mai-image-2.5`; GBP cover / typographic carousel frame garbles → `ideogram-v4` retry → textless shot + overlay the title in post. ≤2 retries per dish; 11 consistent dishes + 1 honest gap beats 12 mismatched ones.
5. **DELIVER:** the pack + one honest line ("these are AI renders in your house style, not photos of your actual plates — review with the chef before printing; dish 7 re-shot once for drift") + ONE next step ("update the GBP cover first — it bumps local-search ranking ~48h").

## How this works

Five gates. At each one the agent shows you the photos and asks one question. The killer move is the cross-dish consistency check — the agent's critic flags when a dish drifts away from the house plating language so you can re-shoot it before guests ever see it.

## The steps

### Step 0 — Confirm the brief

The agent reads back the BRIEF — restaurant name, season, dish list, plating style, vibe — so you catch typos before any plate gets shot.

**STOP**: "Brief looks right? (approve / edit [field] [new value])"

### Step 1 — Lock the house style (~30s, ~$0.05)

The agent builds a brand kit from your palette and plating_style. It infers 6-8 voice keywords from your cuisine_style + location_vibe ("wood-fire char", "rustic ceramic", "candlelit warm", "natural-light morning") and writes 3 reference plates that capture the house style — a starter, a main, a dessert in your plating language.

This locks every dish afterward to the same plating posture, lighting temperature, and surface.

> **For the agent**: this is the consistency anchor. Set this brand kit as the active one — every dish in step 2 inherits its palette and voice without re-prompting.

**STOP**: "Approve the house style, or refine? (approve / refine [direction])"

### Step 2 — Shoot 12 dishes (~8 min, ~$1.00)

Each dish from your BRIEF gets photographed in the locked house style. Same overhead-3/4 angle, same warm low light from the side, same plating ceramic, same garnish vocabulary. The agent runs all 12 in parallel.

> **For the agent**: render the dishes with `flux-dev` (photoreal food, fast) — fall back to `mai-image-2.5` if a plate needs accurate brand text on tableware. Pass `quality_threshold: 0.85` on the 4 strongest dishes (you'll know which ones — usually the focaccia, the hero pasta, the hero protein, the dessert). Auto-retry fires once on those if Gemini Vision grades below 0.85. The other 8 run on default 0.7.

> **Critic verdict** — this is the centerpiece quality gate. The 12-dish batch returns a `critique` field with per-dish issues + a cross-dish consistency assessment. If verdict=iterate, surface the drifted dishes here so the user can target a re-shoot at exactly those 1-2 plates instead of redoing the whole batch.

**STOP**: "Which dishes to keep? (keep all / redo [dish] [direction])"

If you say redo, only those dishes run again with your refinement.

### Step 3 — Seasonal menu PDF (~1 min, ~$0.05)

A single-page printable menu — your restaurant name at top in your palette typography, the 12 dishes laid out with names, short descriptions, prices. Brand-colored from your palette. The agent writes the descriptions if your BRIEF didn't include them — short, no clichés ("crispy", "savory" banned), evocative without trying too hard. Saved to `public/launches/{restaurant-slug}-menu.pdf`.

**STOP**: "Menu PDF approved, or refine? (approve / refine [layout / copy])"

### Step 4 — Google Business cover (~1 min, ~$0.15)

A wide 16:9 hero shot in the house style — could be the hero protein arriving at the pass, or a wide of the wood-fire hearth, or a top-down of 3 plates landing on a table. Brand-colored, no people's faces visible (privacy + future-proof).

> **For the agent**: pass `quality_threshold: 0.85` here too — this is the first image anyone sees when they Google the restaurant.

**STOP**: "Cover approved, or refine? (approve / refine [direction])"

### Step 5 — Social pack (~2 min, ~$0.10)

The agent assembles a social pack:

- **4 IG dish posts** — your 4 strongest dishes with captions. Captions follow the house voice — confident, not salesy, mentions one ingredient or technique per post. Hashtag pack included.
- **1 IG story carousel** — "This season's menu" — 6 frames cut from the dish set, vertical 9:16. Frame 1 is a typographic cover ("Spring at {restaurant_name}"), frames 2-6 are dishes with the names overlaid.

Saved to `public/launches/{restaurant-slug}-social.html`.

**STOP**: "Approve the social pack, or refine? (approve / refine [which one] [direction])"

### Final step — scorecard wrap-up

After all deliverables ship, call:

```
get_scorecard({ project_id: "{the project id from earlier steps}" })
```

The response is a one-page report card:

```
Scorecard for cjob_xxx
{N}/{N} scenes shipped — critic: SHIP (or ITERATE)
Title: <restaurant name — season>
Steps: N/N succeeded (100%)
Quality: mean X.XX · M/N passed · K retries
Critic: SHIP/ITERATE
Cost: $X.XX actual (est $Y.YY) · Ts wall time
Viewer: <project URL>
```

Paste the scorecard into your back-of-house channel so the chef and the front-of-house lead see the actual quality numbers before the menu goes live.

## When you're done

The agent prints:

```
✅ Seasonal menu (PDF): public/launches/{restaurant-slug}-menu.pdf
✅ Social pack page: public/launches/{restaurant-slug}-social.html
✅ Google Business cover: <URL>
✅ 12 dish photos: <viewer URL>

Total spent: $X.XX
Total wall-clock: MM:SS
```

## What to do next

1. **Print the menus** — flat run, heavy uncoated stock, 100 copies is ~$60. Stack at the host stand.
2. **Update Google Business Profile** with the new cover and the new dish photos. The GBP cover update bumps your local-search ranking for ~48 hours.
3. **Schedule the social pack** through your normal tool. Storyboard's Publora integration can schedule them if you ask.
4. **Email the menu PDF** to your regulars list with a "this season at {restaurant}" intro line.
5. **Save the brief** — next season just changes `season` and `dishes`. The house style stays.
