This is the single source of truth for what “compliant” means on growthmaxinc.com. Every published page must pass scripts/seo_aeo_audit.py (CI enforces this on every push to main).
If you’re a contributor, a subagent, or future-me — read this before editing or generating any page.
Answer Engine Optimization is what makes a page citable by ChatGPT, Perplexity, Google AI Overviews, and Featured Snippets. The mechanism is simple: those engines preferentially quote short, declarative chunks that directly answer a search-shaped question. If your chunk is too long, you either get truncated mid-sentence or get skipped in favor of a competitor’s tighter answer.
The whole AEO discipline reduces to one rule: every question H2 must be followed by a 40–60 word direct answer.
Every H2 phrased as a question (ends with ?) must be immediately followed by a paragraph of 40–60 words. The first sentence resolves the question; the remaining 1–2 sentences add color or specificity. Any further elaboration goes in the second paragraph of that section.
This applies to:
## Question? (excluding markdown formatting)<p> element after <h2>Question?</h2>CTA-style H2s (“Ready to…?”) are exempt.
H2 headings never end with a period. Question H2s end with ?; topical H2s end with no terminal punctuation. Sentence-style H2s (“The path forward.”) are not allowed.
Front-matter description: field must be ≤ 160 characters. Google truncates SERP descriptions around 155–160 chars; longer descriptions render with … mid-word.
Front-matter tldr: field must be ≤ 220 characters. The TLDR renders in a callout box at the top of every post; longer TLDRs visually overwhelm the hero.
Every file in _posts/ must have these fields:
title, subtitle, description, category, read_time, tags, keywordsslug, image, image_alttldr, faq (FAQPage schema renders from this)pillar, pillar_page, primary_keyword (the keyword program uses these for sibling discovery)Every Jekyll-processed HTML page must have:
layout (usually default) OR an inline `<nav class="fixed top-0 w-full bg-cyan-100/80 backdrop-blur-md border-b border-cyan-200 z-50">
</nav> `
title, description, permalink<h1> in post bodiesThe post layout (_layouts/post.html) emits <h1>SEO + AEO Standards</h1>. A second H1 in the markdown body creates a duplicate-H1 SEO problem. Use ## and below in post markdown.
Every internal link of the form /blog/<slug>/, /resources/<page>/, /solutions/<page>/, /partnership/, or /ai-agents-for-business/ must resolve to a real file in the repo. Broken internal links waste crawl budget and frustrate users.
Any <script type="application/ld+json"> containing "@type": "FAQPage" must parse as valid JSON.
python scripts/seo_aeo_audit.py
scripts/generate-post.py runs the same audit logic on its own output before saving. If the generated post fails AEO validation, the script regenerates (up to 3 attempts) with feedback like “previous attempt had paragraph X at 87 words; tighten to 40–60.” If 3 attempts all fail, the script exits non-zero, the GitHub Action fails, and the Calendar row stays Not started — the bad post never gets committed.
The .github/workflows/seo-audit.yml workflow runs python scripts/seo_aeo_audit.py and fails the check if exit code is non-zero. Required-status-check on main blocks merges that introduce regressions.
In May 2026 we shipped 20 blog posts with question-format H2s but 92% of the answer paragraphs were too long (~100 words instead of 40–60). The mistake wasn’t bad writing — it was the absence of a binding test. Every check in this doc has a corresponding line in scripts/seo_aeo_audit.py. If a check isn’t enforced by the script, it isn’t really a standard.