The on-page non-negotiables. The SEO agent owns this layer; nothing here is written inline by whoever happens to be editing.
Non-negotiables (every page)
- Meta title: unique, Title Case, under pixel/character caps, no ambiguous fragments
- Meta description: unique, in the fill band (preview it in a SERP snippet tool), no colons (one separator style per site)
- One H1, matches JSON-LD headline exactly
- Slug: short, keyword-bearing, lowercase, hyphens
- Canonical + Open Graph (og:title, og:description, og:image) on every page
- Schema: the big organization graph on the homepage ONLY; every other page carries just its own page-type schema; FAQ schema answers verbatim = visible answers. Validate with the Rich Results Test and the schema.org validator
- Internal links: every page linked FROM and TO; anchors describe the destination page's topic, never generic verbs
- Images: unique title + keyword alt
- Sitemap entry with real lastmod (random seconds, never :00)
Make the contract machine-checkable
- Write the site's SEO contract as one spec file in the repo (bands, separator rules, canonical host, schema mapping), human-readable on top, machine-readable below.
- Wire a validator that checks every page against that spec (title and description bands, duplicates, canonicals, OG mirrors, one H1, schema headline = H1, sitemap listing).
- Run it after every finished page and in the pre-deploy gate; a violation fails the build. Rules an AI might skip, a script never does.
Schema coverage SOP (run once at build, rerun on every new page type)
- List every entity the site represents: the business, the website, each page type, articles, tools, FAQs, breadcrumbs, people, products, events, local presence.
- Map each entity to its closest specific type on schema.org; prefer the specific type over the generic one (ProfessionalService over Organization alone, WebApplication over WebPage for a tool).
- List the properties each type wants and mark what you do not know.
- Check the project's COMPANY.md first (the company facts file every project keeps at its repo root); ask the owner ONLY for facts it does not hold, and save every new answer there so nothing is asked twice. NEVER invent a value; a property you cannot source gets left out.
- Add the JSON-LD to the pages.
- Validate every page with the Rich Results Test and the schema.org validator.
Publish standards (per page)
- 600+ words, custom meta, target keyword, 3+ internal links, in the sitemap
Done when
- ☐ Every live page passes the list above (checked by the SEO agent, gated by the editor)