This screen is too small for the gate.

CreativeGate's dashboard is data-dense — verdict telemetry, evidence ledgers, calibration charts — and we currently support desktop, PC, and tablet views only. Please open this page on your computer.

min width 700px · mobile support planned
gate online
OK
// Creative quality gate

Nothing ships until it clears the gate.

CreativeGate runs every artifact through deterministic checks, a performance predictor trained on real outcomes, and a pairwise judge ensemble — then fuses only the evaluators that have earned trust through calibration.

EvaluationProfile · —

The gate, in four passes

ingest → gate → predict + judge → calibrate
01 · Ingest
Paste or POST
Text copy now; images pass the structural gate. The hub normalizes the artifact and picks a profile.
02 · Gate
Deterministic pass
Hard rules run first — banned claims, required CTA, length limits, aspect ratio. Free, instant, zero variance.
03 · Predict + Judge
Learned rungs
A bagged GBM predicts the outcome; a pairwise judge scores win-rate against known-outcome anchors.
04 · Calibrate
Fuse what's earned
Fusion weight = measured correlation with reality. Uncalibrated rungs contribute evidence, never weight.
verdicts stored
predictor calibration r
judge calibration r
// Ingestion hub

Drop an artifact. Get a verdict.

Paste creative copy to run it through the funnel with the default profile.

Drag & drop a creative asset
.txt · .png · .jpg  ·  images pass the structural gate (saliency v0.2)  ·  video planned v1.0
Evaluation profile

Recent runs

from this gate's database
// System design & roadmap

The wind tunnel for creative spend

Aircraft are tested in instrumented rigs long before a pilot flies one. Digital creative mostly skips the wind tunnel — it goes from generation straight to paid traffic. CreativeGate is the wind tunnel: a simulation-first evaluation funnel that scores any creative artifact before money moves, plus the discipline that keeps a wind tunnel honest — continuous calibration of every simulated measurement against real-world outcomes.

The problem

teams evaluating creative at scale have three options, and each fails a different way
expensive & slow
Live A/B testing
The ground truth — but it burns real budget and real audience on losers, needs large samples per variant, and can't keep pace with generation systems producing hundreds of variants a day. Testing everything live is economically impossible.
confident noise
Raw LLM judges
Cheap and flexible — but non-deterministic and model-dependent. Scores vary run to run, and an unvalidated judge is confident noise: nobody can say what a "78/100" means in conversions.
shallow
Deterministic rule checks
Reliable — but too strict and too shallow. They catch violations, not quality. A creative can pass every rule and still bore every human who sees it.
These aren't competing alternatives — they're rungs of a funnel, ordered by cost-per-evaluation and fidelity-to-reality. CreativeGate's thesis: evaluate before you spend, and make every cheap evaluator earn its trust by continuous calibration against the expensive ones.

Architecture, end to end

every layer is swappable behind a stable contract — the verdict schema is the product
Clients — anything that can speak HTTP
Dashboard SPA
this page — vanilla JS, zero build step, served at /
CLI
evaluate · seed-synthetic · calibration · serve · demo
Agentic pipelines
generation systems gating their own outputs via POST /evaluate
MCP server
v0.2 — same engine exposed as native agent tools
↓  HTTP · bearer token on mutations · CORS opt-in  ↓
Service — FastAPI, async job model
Durable jobs
jobs table, not process memory — restarts mark orphans interrupted; webhooks on completion
Artifact store
POST /artifacts — text inline, images on disk for structural checks
Read surface
/verdicts · /verdict/{id} · /calibration · /health — feeds this dashboard
Outcome ingestion
POST /ground-truth — real results enter here and trigger recalibration
↓  one evaluation job  ↓
Funnel engine — cost-ordered execution with filtering
01 · Deterministic gate
free, zero variance. Banned claims, required CTA, length, aspect ratio. Catches violations, never claims quality — score is always null.
02 · Performance predictor
bagged GBM over engineered + embedding features, trained on the ground-truth set. Prediction ± ensemble uncertainty.
03 · Judge ensemble
pairwise-only vs known-outcome anchors, temperature 0, N passes, position-debiased, variance reported.
Saliency · personas · OPE
v0.2–v0.3 rungs — same plugin interface, disabled until calibration evidence exists
Calibration-weighted fusion
weight = measured Spearman vs real outcomes for this segment/modality. Uncalibrated rungs contribute evidence and flags — never weight. Output: score ± band, evidence ledger, validity statements, cheapest-next-test.
↓  providers & persistence  ↓
Foundations
Provider slots
LLM: any OpenAI-compatible → deterministic heuristic fallback. Embeddings: TF-IDF+SVD fallback. Zero keys always works, labeled "degraded".
SQLite repository
verdicts · jobs · predictions · outcomes · append-only calibration audit trail. Postgres = reimplement ~10 methods.
Model cache
trained predictors persist to disk by config fingerprint — restarts don't retrain
Determinism
seeded runs; every verdict stamps config hash + rung/prompt versions — replayable, diffs attributable
⟲  The calibration loop — the honesty engine, and the actual product
1 · Record
every scoring rung's prediction is stored at evaluation time
2 · Reconcile
real outcomes arrive → joined to predictions per (rung, segment, modality)
3 · Re-measure
Spearman + Pearson recomputed; appended to the audit trail, never overwritten
4 · Adjust
drift alarm when correlation decays → that rung's fusion weight is cut automatically

One evaluation, wire by wire

what actually happens between "Run gate" and a verdict on this dashboard
01client → servicePOST /evaluate with text or an uploaded artifact reference. A job row is written (queued) and the id returned immediately — the caller polls /jobs/{id} or registers a webhook.
02service → engineA background worker marks the job running, loads the evaluation profile (declarative YAML: which rungs, thresholds, fusion policy, seed) and the named ground-truth set, and builds the funnel.
03engine → rungsRungs execute cheapest-first, each receiving a context (config, ground truth, seed, provider slots, calibration lookup). A failed threshold eliminates the artifact — more expensive rungs never run, and the exact failing evidence rides on the verdict.
04rungs → harnessEvery scoring rung's raw prediction is recorded against the artifact — this is what makes future recalibration possible. Validity is stamped onto each result by the framework from calibration records; rungs cannot self-assert trustworthiness.
05engine → fusionSurviving scores fuse with weights = each rung's measured correlation for this segment/modality. The confidence band widens with ensemble disagreement, calibration weakness (1−r²), and thin coverage. If nothing is calibrated, the verdict says DIRECTIONAL ONLY — loudly.
06engine → verdictThe verdict stores score ± band, the full evidence ledger, per-rung validity statements, flags (including HUMAN_REVIEW_REQUIRED when a known-good anchor scores below the floor), the cheapest-next-test recommendation, runtime, config hash and versions.
07service → clientsJob flips to done; webhook fires if registered. Every open dashboard tab picks the run up on its next poll — no reload.
reality → harnessDays or weeks later, real outcomes land via POST /ground-truth. The harness re-scores what every cheap rung had predicted for those artifacts, updates per-cell correlations, raises drift alarms, and adjusts fusion weights — with an append-only audit trail. The system learns how much to trust itself.

The integration contract — JSON over HTTPS

three calls: submit → collect → report outcomes · every field means something
POST /evaluate — submit an artifact
One JSON body. Binary creatives (.png/.jpg) go through POST /artifacts first (multipart upload), then reference the returned id here instead of text.
{ "artifact_id": "summer-hero-01", // optional — auto-generated if omitted. Use YOUR id: real // outcomes are joined back by this key later "modality": "text", // "text" | "image" "text": "Meet your new favorite running shoes. Free shipping. Shop now.", "segment": "gen-z-us", // audience segment — scopes which calibration records apply; // trust earned on one segment never transfers silently "platform": "meta", // free-form platform tag "profile": "banner-web-v1", // which criteria set judges this artifact class // (gate rules, thresholds, rubric, outcome corpus). Default if omitted "metadata": {"campaign": "q3-launch"}, // free-form passthrough, stored with the verdict "webhook_url": "https://you.example/cb" // optional — POSTed {job_id, status, verdict_id} on completion } // → immediately returns {"job_id": "job-a1b2c3", "status": "queued"}
GET /jobs/{job_id} → /verdict/{verdict_id} — collect the verdict
Poll the job (evaluations take ~0.3–2s; states are a durable machine: queued → running → done | error | interrupted) or wait for the webhook, then fetch the verdict — the output contract:
{ "id": "v-7fc716df", "artifact_id": "summer-hero-01", "eliminated": false, // true ⇒ a rung killed it; more expensive rungs never ran "eliminated_by": null, // which rung, e.g. "deterministic_gate" — evidence says exactly why "score": 0.842, // calibration-WEIGHTED fusion, 0..1 — weights are measured // correlations with real outcomes, never opinions "band": [0.46, 1.0], // the honesty interval — wide = thin or weakly-validated evidence. // Gate launches on the LOWER edge, not the point score "confidence_note": "Calibration-weighted fusion of performance_predictor (weight 0.98), judge_ensemble (weight 0.42)...", // or "DIRECTIONAL ONLY" when nothing is calibrated "flags": [], // e.g. HUMAN_REVIEW_REQUIRED (known-good ad scored below floor), // degraded_provider (keyless comparator served) "validity_summary": "performance_predictor: Validated for segment='gen-z-us', modality='text': Spearman r=0.91 vs ctr (n=144)...", // the verdict citing its credentials — // and volunteering where it has none "next_test": { // what limits confidence + the cheapest way to fix it "kind": "human_pretest", "estimated_cost_usd": 400, "rationale": "..." }, "rung_results": [ /* every rung: score, passed, confidence, validity, evidence */ ], "evidence": [ /* the full ledger: every check, comparison, prediction — nothing unexplained */ ], "config_hash": "41fc701c0c06c031", // exact criteria that produced this number — replayable "seed": 7, "runtime_ms": 701 }
POST /ground-truth — report reality (the call most integrators forget)
{"records": [{"artifact_ref": "summer-hero-01", // the id you evaluated with — this is the join key "modality": "text", "segment": "gen-z-us", "outcomes": {"ctr": 0.043}}]} // what actually happened when it ran // → recalibrates every affected rung: correlations re-measured, drift alarms raised, // fusion weights adjusted. This call is what keeps every future verdict honest.
How agents and automated systems will talk to it — MCP PLANNED · v0.2
MCP is not a second pipeline — it wraps the same engine as native tools so agent frameworks (Claude agents, LangGraph nodes, n8n) call the gate without HTTP glue. An autonomous creative pipeline replaces its internal critic with these five tools; the REST contract above does the identical job today.
T1evaluate_artifacttext or artifact ref + profile + segment → verdict summary in one round-trip (eliminated, score, band, flags, next_test) — no polling; agents want a single call.
T2get_verdictfull document — evidence ledger and validity statements — when the agent must explain or defend a decision.
T3report_outcomeartifact ref + metric + value → recalibration summary. The agent closes the trust loop itself.
T4get_rung_validity"how much should I trust you?" — the calibration report as a tool, so an agent can check credentials before acting.
T5plan_live_test(v0.3) funnel survivors + budget constraints → experiment spec with funnel scores as bandit priors.
the agent loopgenerate variants → evaluate_artifact each → eliminated ⇒ regenerate using the evidence as repair instructions ("banned phrase 'guaranteed results'") · survivor ⇒ rank by band-lower-edge · flags ⇒ escalate to a human → launch top-N through the agent's own platform tooling (never ours) → days later report_outcome per variant → the gate is sharper on the agent's next run.

Safety rails, enforced structurally

encoded as the test suite's spine — changes violating these are rejected regardless of quality
Uncalibrated ⇒ zero weight
A rung with no measured correlation against real outcomes can flag and explain, but its score can never move the fused verdict.
No unearned validity
Validity statements are built by the framework from the calibration store. A rung physically cannot report trust it hasn't earned.
Known-good floor
A proven converter scored below the floor raises human review instead of silent rejection — a rung may have drifted; don't auto-bury winners.
Keyless degradation
Zero API keys always produces a verdict — honestly labeled lower-fidelity. Models are enhancers, never dependencies.

Roadmap

wire, don't stub — a few rungs working end-to-end with real calibration beat all rungs half-built
v0.1SHIPPEDThe vertical slice: stable schemas, funnel engine, three rungs end-to-end, calibration harness verified against a synthetic world with known physics, CLI, API, this dashboard. Hardened: durable jobs, token auth, artifact uploads, model-cache persistence, live polling.
v0.2NEXTMCP server (the engine as native agent tools); attention/saliency rung for images with a keyless contrast-and-center fallback; event-driven recalibration; verdict replay from stored config hashes.
v0.3PLANNEDLive-Test Planner: bandit specs seeded with funnel scores as priors, sequential designs with SRM sanity gates, micro-flight/geo-split designs. Off-policy evaluation over propensity logs. Synthetic persona panel with "directional-only until calibrated" enforcement.
v1.0PLANNEDVideo modality (frame-sampled); proxy-metric ladder validated per segment; multi-tenant profiles; Postgres; hardening.
Deliberately out of scope, forever: serving traffic, managing spend, an ad server, user management beyond a token, a heavyweight frontend. The funnel plans and scores; it never moves money.
// Calibration harness

How much the gate trusts itself

Every scoring rung's predictions are joined to real outcomes; its fusion weight is the measured Spearman correlation. The chart tracks each rung's correlation across recalibration events — amber guides mark drift alarms, where a rung's weight was automatically cut.

RungCell (segment · modality)Spearman rnStatus