# SMS/MMS + EMAIL CREATIVE REQUIREMENTS — BOOK N' COOK (STANDING RULES)
These are permanent requirements for ALL SMS/MMS and EMAIL creative produced by this machine. Set 2026-06-12 by the owner.

## EMAIL rules
E1. **Yellow brand navbar strip** (`#FFC737`) at the very top of every email, above the hero.
E2. Navbar left: the official BOOK N' COOK logo (site header lockup: mark + wordmark), scaled to fit the strip.
E3. Navbar right: the phone CTA rendered as a **pixel-perfect PNG image** (email clients don't respect display webfonts) — the image is wrapped in a clickable `tel:` link. Source PNGs: `assets/generated/email/navbar-logo.png`, `assets/generated/email/navbar-phone.png`.
E4. **Every email hero is an ANIMATED GIF**, bespoke and unique — no image reused across emails (or recycled from SMS tiles). Email 1 of a series may use the offer's core hero scene (animated). Emails 2+ must match that email's headline/theme. Stop-motion claymation brand style, core palette.
E5. Hero GIF target: ~800×400 (2:1), ≤1MB.

## Image tiles
1. **Bespoke image per message.** Every SMS tile gets its own custom-generated image whose THEME MATCHES THAT MESSAGE'S HEADLINE (not crops/recuts of shared art).
   - Exception: message 1 of a series MAY use the offer's hero/core scene image.
2. **Exactly 480×480 px.**
3. **Always animated GIF** — stop-motion claymation feel (3+ frames, jerky boomerang loops are on-brand). Target ≤600KB, hard ceiling 1MB (MMS).
4. **On brand:** toy-like 3D claymation style matching the lead-gen funnel; core palette mustard `#FFC737` (default flat background), ketchup red `#EB3322`, cream `#F7F2E5`, green `#8DF947`, pool blue `#2097CF`, purple `#7721C7`, black comic sparkles.
5. No text in images except short, headline-critical figures (e.g. "$99", "$150") — nano_banana_2 renders short strings reliably; never full sentences.

## Message copy
6. **≤140 characters total** per message (including the phone number).
7. **No emojis. Ever.**
8. GSM-7-safe characters only (no smart quotes, no accented letters — write "Entree" not "Entrée") so messages don't silently switch to UCS-2 and split.
9. CTA is always the trackable call line (currently **1-800-611-2863**).
10. Opt-out language is NOT written into the copy — the SMS platform (Attentive) auto-appends it. (Exception only if a platform doesn't auto-append.)

## HOSTING + DISTRIBUTION rules
H1. All campaign pages + assets are PUBLICLY hosted over HTTPS at **https://bookncook-campaigns.pages.dev** (Cloudflare Pages project `bookncook-campaigns`, seo@wgresorts account). This hub must stay deployed whenever a campaign exercise runs — outbound emails hot-link these assets (Campaign Monitor etc.).
H2. Publish hook: `bash tools/publish-campaigns.sh` assembles + deploys everything; a git post-commit hook auto-publishes whenever `ads/`, `assets/generated/{sms,email,ads,fb}/`, or campaign tooling changes (`SKIP_CAMPAIGN_PUBLISH=1` to suppress).
H3. Sendable email HTML must reference images by **fully-qualified domain URLs** (never relative) — generated by `tools/email-templates-gen.py`.
H4. Every hosted page carries a **DOWNLOAD ZIP** button delivering the full foldered kit (sms-kit / email-kit / facebook-kit). Pages caps files at 25 MiB — zips carry web-optimized MP4 re-encodes; full-bitrate masters stay individually downloadable.
H5. Facebook creative ships in ALL placement sizes — 1:1 (1080×1080), 9:16 (1080×1920), 16:9 (1920×1080) — static AND video, with ≥3 ad variants drawn from the strongest SMS headlines/imagery.

## Production pipeline (current implementation)
- Base tile: `higgsfield generate create nano_banana_2` @1:1, style clause from `tools/generate-sms-bespoke.sh`.
- Stop-motion frames: 2× image-to-image edits per base with a generic "next frame, everything hand-nudged slightly" delta.
- GIF assembly: ffmpeg 3-frame boomerang (0,1,2,1) @ ~2.6fps, `scale=480:480`, palette ≤110 colors, bayer dither.
- File naming: `assets/generated/sms/<offer>-sms<n>.gif` (n = send order 1-8).
- QA gate before delivery: every GIF exactly 480×480, >1 frame, ≤1MB; every message ≤140 chars and emoji-free (verified by script, not eyeball).
