Maria Angelika Agutaya  ·  case study LOIS Ad Engine, 2026

One brief in. Nineteen distinct ads out.

ClientLOIS, legal AI for contract review My partPrompt architecture and creative direction, in Claude CampaignLOIS for Word, Meta static ads Finals19 ads across 5 awareness stages, delivered
LOIS ad: most attorneys still redline contracts by hand, gradient with Word comment panel LOIS ad: redline, draft, review without leaving Word, photographic hero LOIS ad: this isn't legal AI, it's Legal Operating Intelligence, portrait hero LOIS ad: your firm's contracts reviewed by LOIS in minutes, photographic hero with Word panel LOIS ad: retargeting, what 30 minutes with LOIS looks like, dark desk scene

The problem: Meta collapses similar creatives into one entity. A batch must be provably distinct.

What I did: staged prompts in Claude: brand ingest, brief ingest, spec matrix, generation, QA gate.

The result: 19 finals, 5 awareness stages, every pair differing on 3 of 5 axes.

The constraint

70% similar means the same ad

Meta's Andromeda rollup treats creatives sharing ~70% of their elements as one entity competing as one. The whole prompting system exists to defeat this, by design, not by later filtering.

Rule of thumb: differ on >=3 of the 7, with >=1 HIGH, to be a distinct entity.
Insufficient: same layout + new background color + one-word headline swap = same entity.
engine/sources/meta-static-qa.md, the registered platform source every prompt cites
The full dimension model

HIGH-impact dimensions: visual composition and layout, hero image, color palette. MEDIUM: primary text and headline angle. LOW: CTA type and aspect ratio (re-exporting the same creative at a new ratio does not make a new entity). The generation prompt carries the rule as a hard constraint: "every pair of specs differs on >=3 dimensions, including >=1 HIGH. If a pair fails, redesign one before output." The engine's dimension model enforces the top five of those seven: layout, hero, palette, copy angle, CTA. A later refinement scoped diversity within audience segments, since cross-segment archetype reuse was never a real requirement.

The prompting system

Five staged prompts, one learned brand

Sources are viewed, not just read.80 brand-book pages rendered to images, the chrome-relevant ones attached as vision, so Claude sees the brand before writing a layout.
P1_brand_ingestbrand book → brand.json archetype_library: DERIVE from the brand's own application pages... This is the layout vocabulary, learned per brand, never hardcoded.
P2_brief_ingestclient brief → brief.json Never merge two campaigns. Copy is verbatim, never paraphrased.
P3_spec_genthe ad matrix HARD CONSTRAINT (not a later filter): every pair of specs differs on >=3 dimensions, including >=1 HIGH.
P4_layout_genone spec → one ad, brand pages attached as vision You are shown the brand pages, study them... Do not default to one skeleton.
P5_qathe gate Then montage all ads into a contact-sheet grid and LOOK (no sign-off without the grid).
More of the actual prompt text

The hero-photography prompt injects the brand's photography rules and joins its anti-patterns as negatives: "Strictly avoid: {{brand.anti_patterns joined}}. No text, no logos, no watermarks, level horizon, no tilt, no filters, realistic." The spec prompt enforces a CTA color monopoly: "CTA color per ad must be absent from everything else on that ad." On-image text is confined to a lockup, a pre-qualifier eyebrow, a 3-to-6-word focal, and the CTA; the brief's full headline goes to Meta's off-image primary text verbatim. The engine's own hard-rules list closes with the line that named this section: "Sources are viewed, not just read."

The proof

A captured session, replayed verbatim

The staged prompts sent to Claude turn by turn, the way the campaign was actually made: brand ingest, brief ingest, spec generation. Real responses, no script.

Captured Claude Code session, 2026-08-28, replayed event for event. The prompts are the May 2026 originals. Labeled in-frame.
What the recording shows

The session was re-run for this capture: P1, P2, and P3, verbatim from engine/prompts, sent to a live Claude Code session in the project folder with read-only tools. Brand extraction, brief ingest, and three ad specs came back in conversation, including Claude flagging the source's own OCR typos and the brief's two-campaign split. Captured with claude -p in verbose stream-json mode, replayed from the event log. The rendering itself is a small code stage (Playwright turning Claude-written HTML into 2160px masters); it stays out of scope here, this case study is about the prompting that decides what those ads are.

The finals

Nineteen ads, five awareness stages

The brief's framework maps every ad to a stage of awareness, each with its own director's note. Dark builds for cold audiences, brights for warm ones. The ads shown are the finals: generated by the engine, then polished in Figma.

Problem Unaware

Stop. You're the audience. Does this make you pause?
Ad 01, problem unaware stage Ad 02, problem unaware stage Ad 03, problem unaware stage

Problem Aware

They feel the pain. Show them the exit.
Ad 04, problem aware stage Ad 05, problem aware stage Ad 06, problem aware stage Ad 07, problem aware stage

Solution Aware

Win the category, not just the click.
Ad 08, solution aware stage Ad 09, solution aware stage Ad 10, solution aware stage Ad 11, solution aware stage

Product Aware

Show the product working on a real contract.
Ad 12, product aware stage Ad 13, product aware stage Ad 14, product aware stage Ad 15, product aware stage Ad 16, product aware stage

Retargeting

Tip the fence-sitters. Urgency, not pressure.
Ad 17, retargeting stage Ad 18, retargeting stage Ad 19, retargeting stage

Where it stands

Delivered to the client; no performance numbers are published here. Measured in the work:

19

final ads in this campaign, one brief

5

awareness stages, each with its own director's note

3 of 5

minimum differing axes between any pair of ads

80

brand-book pages rendered for visual grounding

2160px

masters per ad, four aspect ratios

13

more finals in the sister campaign, same system

What did what

Claude generated: the brand extraction, the spec matrix, the hero briefs, and every layout. I owned: the staged prompt architecture, the Andromeda constraint design, the awareness framework, art direction against the brand book, the QA gate, and the Figma polish on every final. A second campaign, Make the Switch, ran through the same system: 13 more finals, each with built variants.

Maria Angelika AgutayaWorkflow Engineer · mariaangelika.com · LOIS Ad Engine, built in Claude, 2026