Architecture & guardrails
The demo is deterministic first: the full guided flow works with no model call. AI is additive, never a single point of failure — and whatever it proposes is checked by the same rules that gate everything else.
System layers
Calendar ingestion
DeterministicThe year's promo calendar is ingested up front, so promos are preloaded with dates, season, and label. No manual date entry — and it's what lets the workflow scale across accounts, teams, and roles.
Brief ingestion
DeterministicMarketing's promo doc (.docx/.pdf) is parsed server-side (mammoth / unpdf) and deterministically extracted into current-year facts, each tagged with its provenance — brief vs calendar vs missing.
Data
DeterministicStatic synthetic seed — a fictional advertiser, 8 promos across two years, an account map, two years of KPI history. No database; the whole flow resets instantly.
Copy
AI-assistedA deterministic golden template fills 15 headlines + 4 descriptions with the promo slot from current facts. AI can propose alternatives; the same rules gate them.
Rules
DeterministicOne pure validation library, shared by the browser and the server route. Every blocking rule runs again server-side before any output.
Export
DeterministicA 28-column Google Ads Editor CSV — 1:1 unique headlines, per-row Path 1 by category, every ad Paused. Idempotent for identical inputs.
API path
SimulatedAn interactive console mirrors a capacity-aware go-live — scan, pause the lowest-L90D RSA to free a slot, label, load paused promo RSAs, handle policy issues — with real API-shaped payloads and no external call.
Measurement
DeterministicYear-over-year KPI reporting on date-aligned promo windows, keyed by the per-year ad label — the loop that closes planning → execution → result.
The 28-column Google Ads Editor schema
Headlines map straight 1:1 into columns (Google rejects duplicate headline text in one RSA). Path 1 is derived per-row from the product category; Path 2 is the global promo slug; every ad is exported Paused.
Deterministic validation catalog
emptyAsset is blank.char_overHeadline > 30 or description > 90 characters.placeholderBroken DKI / placeholder / template residue.internal_tokenInternal token or naming convention leaked into copy.repeated_wordConsecutive duplicate word.stale_yearReferences a year earlier than the current promo year.banned_termOff-brand banned term.toneUrgency / superlative tone violation.date_refHard slash-date reference — confirm still in-window.count_hMust have exactly 15 headlines.count_dMust have exactly 4 descriptions.dup_headlineDuplicate headline text (Google rejects it).promo_cap_hAt most one promo headline.promo_cap_dAt most one promo description.missing_vpA required value-prop signal is absent.missing_taglineNo approved brand tagline present.mix_imbalanceA messaging bucket is over-represented.column_countCSV must be exactly 28 columns.url_validityEvery final URL must be valid HTTP(S).no_duplicate_urlsNo duplicate campaign/ad-group/URL rows.required_fieldsCampaign, ad group, and final URL are required.path1_populatedEvery row should have a Path 1 value.Production mapping
What each demo element stands in for — without exposing real identifiers, data, or code.
What stays private
The production application, real advertiser data, live account structure, credentials, and the exact production copy corpus are not part of this demo. This public twin is fully synthetic; it demonstrates the workflow, not the confidential system it mirrors.