Publish
Publishing verified pages
Opt a subject into a public scorecard, comparison page, framework page, or verified-fix changelog, with the live badge and the evidence standard behind every number.
A publication makes one subject public under a slug you choose: a brand scorecard at /verified/{slug}, a head-to-head comparison at /compare/{slug}, or a per-framework page at /verified/{slug}/{framework}. Nothing becomes public except through an explicit publish action on a specific subject, after a preview of the exact page, and every publication is revocable. Each page also serves JSON at /api/public/verified/{slug} and markdown to any client that asks with Accept: text/markdown.
What renders where
The scorecard carries four sections, each independently toggleable: Experience (per-agent assertion verdicts from the latest comparable cycle, the one chromatic surface), Preference (your share in neutral ink; competitors appear only as an anonymous rank), AEO (your check score), and the verified-fix changelog. Run descriptors (run id, client, model, client version, date, outcome) render under every numeric block; the wire traces behind them stay in your workspace. Competitors are named publicly in exactly one place: a comparison page for a matchup you registered, which must include your own brand, and where both brands render through identical templates with intervals, floors, and ties as ties.
The badge
/api/badge/verified/{slug} is computed live from the badge-backing evals you bound at publish (immutable afterward, like the slug). Freshness is cadence-relative: a daily eval's latest comparable cycle counts for 48 hours, a weekly one for 192, each clamped to the BADGE_MAX_AGE_H ceiling. The as-of date is inside the image in every state.
| state | rule | ink |
|---|---|---|
| verified | every backing eval has a fresh comparable cycle and every per-agent label is solid | emerald |
| flaky | fresh everywhere, worst label flaky | amber |
| failing | fresh everywhere, worst label broken | red |
| verification lapsed | any backing eval lacks a fresh comparable completed cycle (lapsed cadence, archived or disabled eval, edited spec without a new cycle) | neutral |
| not verified | slug unknown or revoked, publishing disabled, or no badge evals bound (served 404/410) | neutral |
The badge never freezes: when runs lapse it goes neutral, when they fail it goes red, and the only path back to emerald is fresh passing runs.
Caching and revocation
| surface | cache | revoked |
|---|---|---|
| HTML pages (/verified, /compare) | rendered per request, no CDN cache | 410 at the next render |
| public JSON, evidence, markdown | public, max-age=60, s-maxage=300 | 410, no-store |
| the badge | public, max-age=300, s-maxage=300, stale-while-revalidate=300 | 410, neutral image |
| previews (dashboard) | no-store, noindex, org-only | n/a |
Unpublish takes effect immediately for pages and within 10 minutes for badges and cached JSON, and the same 10-minute bound applies when a badge goes red or lapses to neutral. A revoked slug stays reserved forever; renames are revoke-and-republish, because a cited URL must not silently change meaning. Archiving a market, brand, or matchup retires its publications the same way; an archived bound eval only lapses the badge.
The changelog contract
A verified fix can publish as a changelog entry. You may write the "what changed" note (plain text, attributed to your team, refused server-side if it names a registered competitor). You cannot edit the verification block: it is rendered from the resolving cycle's evidence at publish time, and every entry carries the disclosure that it summarizes an AI-drafted finding and its verified re-verification. If a published fix later regresses, the entry says so in neutral ink until re-verification clears it.
Held to our own standard
The public pages are graded by the same AEO check registry we run against everyone else, in our verification gate before deploy and continuously in production. If our pages fail our own checks, the gate is red.