Fixes
A failing check becomes a finished artifact, not a to-do. You approve it, it deploys, and the next scan re-measures. Here's exactly which parts are automatic and which aren't β the boundary is where most tools get vague.
1 β Generation
Every failing check in the audit carries a generated fix, built against your pages: Organization JSON-LD, titles and meta descriptions, canonical tags, robots and llms.txt files. They're finished output, ready to ship β not a description of what someone ought to do.
The one thing we won't do is invent facts. A generator can't know your real price or product name from a crawl, so those artifacts come out as templates with placeholders β which leads directly to the next step.
2 β The placeholder gate
0.00 price β deploy is refused with 422 and needsCompletion: true, listing the exact problems. Without that gate, one click would publish "PRODUCT NAME" and a fake price as structured fact on your live commercial pages. Structured data is a machine-readable assertion about your business; shipping a placeholder into it is worse than shipping nothing.3 β Deployment: you approve, we inject
Approving a fix marks it deployed:
POST /projects/:id/fixes/:fixId/deploy β { "ok": true }
For that to reach your live site, install the snippet once. It's minted per project and only for a verified domain:
GET /projects/:id/deploy-snippet
β {
"verified": true,
"key": "<deploy-key>",
"snippet": "<script async src=\"https://seencite.com/i/<deploy-key>.js\"></script>",
"appliedCount": 3,
"appliedTypes": ["Organization JSON-LD schema", "Title + meta description (only-if-missing)"],
"framework": "next",
"installHint": "..."
}
Paste it into your <head> once. From then on, every schema or meta fix you approve is applied by that script β additively, deduped against schema you already have, and page-specific blocks (a Product, an Article) only ever on their own page. Meta titles and descriptions are applied only if missing; we never overwrite copy you wrote on purpose. If your domain isn't verified, no key is minted and the endpoint tells you why. A wrong key is a safe no-op, not a broken page.
Where the snippet reaches β and where it doesn't
document.createElement β head.appendChild), so a crawler has to execute JavaScript to see it. Googlebot renders JS, so Google AI Overviews can pick it up via the index. OAI-SearchBot, PerplexityBot and ClaudeBot generally do not β that's four of our five engines that plausibly never see a snippet-injected fix. This is not a footnote; it's the difference between shipping a fix and thinking you shipped one.So for anything beyond Google AI Overviews, paste the artifact instead. Every generated fix is available as finished output β put the same JSON-LD into your HTML template or your CMS and it's server-rendered, which every crawler can read without running anything. Same fix, same artifact, one extra step, and it reaches everything.
render_diff check whose stated rationale is that content appearing only after JavaScript runs may be missed entirely by crawlers that don't render. We flag that as a defect on your site. We are not going to flag it on your site and stay quiet about it in our own delivery mechanism β so it's written here, on the page that tells you how fixes work, rather than in a caveat you'd find later.The other boundary, while we're here: server-side files stay copy-to-deploy. A script tag in your <head> cannot write robots.txt or llms.txt β those live at your server root. We generate the file; the last step is yours.
4 β Re-measurement
Ship the change, then re-scan. Two different numbers move, and they mean different things:
- The GEO score confirms the fix is live. The check that failed now passes. That's the rubric doing its job β and it's arithmetic, not evidence about AI.
- The mention rate, re-measured with its interval, is the only thing that could tell you AI behaviour changed β and only if the new band clears the old one.