aeorank 2.3.2 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # AEORank
2
2
 
3
- Score any website for AI engine visibility across 28 criteria. Pure HTTP + regex - zero API keys, under 10 seconds.
3
+ Score any website for AI engine visibility across 34 criteria in a 5-pillar framework. Pure HTTP + regex - zero API keys, under 10 seconds.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/aeorank.svg)](https://www.npmjs.com/package/aeorank)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
@@ -35,17 +35,19 @@ import { audit } from 'aeorank';
35
35
 
36
36
  const result = await audit('example.com');
37
37
  console.log(result.overallScore); // 0-100
38
- console.log(result.scorecard); // 28 criteria with scores
38
+ console.log(result.scorecard); // 34 criteria with scores, pillars, weights
39
+ console.log(result.pillarScores); // { answerReadiness, contentStructure, ... }
40
+ console.log(result.topFixes); // Top 3 highest-impact fixes
39
41
  console.log(result.opportunities); // Prioritized improvements
40
42
  ```
41
43
 
42
44
  ## What It Checks
43
45
 
44
- AEORank evaluates 28 criteria that determine how AI engines (ChatGPT, Claude, Perplexity, Google AI Overviews) discover, parse, and cite your content. Criteria are organized into three tiers by impact on real-world AI citations:
46
+ AEORank evaluates 34 criteria that determine how AI engines (ChatGPT, Claude, Perplexity, Google AI Overviews) discover, parse, and cite your content. Criteria are organized into five pillars:
45
47
 
46
- ### Scoring Tiers (by importance)
48
+ ### 5-Pillar Framework
47
49
 
48
- **Content Substance (~55%)** - *Why* an AI engine would cite you:
50
+ **Pillar 1: Answer Readiness (~40%)** - *Why* an AI engine would cite you:
49
51
 
50
52
  | Criterion | Weight | What it measures |
51
53
  |-----------|--------|------------------|
@@ -53,27 +55,45 @@ AEORank evaluates 28 criteria that determine how AI engines (ChatGPT, Claude, Pe
53
55
  | Original Data & Expert Analysis | 10% | Proprietary research, case studies, unique data points |
54
56
  | Content Depth | 7% | Article length, heading structure, deep vs thin pages |
55
57
  | Fact & Data Density | 6% | Specific numbers, statistics, data points per page |
58
+ | Citation-Ready Writing | 4% | Self-contained definition sentences, single-claim statements |
59
+ | Answer-First Placement | 3% | Answer block in first 300 words, no throat-clearing openers |
60
+ | Evidence Packaging | 3% | Inline citations, attribution phrases, sources sections |
61
+
62
+ **Pillar 2: Content Structure (~25%)** - *How* AI extracts your answers:
63
+
64
+ | Criterion | Weight | What it measures |
65
+ |-----------|--------|------------------|
56
66
  | Direct Answer Paragraphs | 5% | Concise answer paragraphs after question headings |
57
67
  | Q&A Content Format | 5% | Question-format headings (What, How, Why) with answers |
58
68
  | Query-Answer Alignment | 5% | Every question heading followed by a direct answer |
59
69
  | Comprehensive FAQ Section | 4% | Dedicated FAQ with FAQPage schema markup |
70
+ | Table & List Extractability | 3% | HTML tables with headers, ordered/unordered lists |
71
+ | Definition Patterns | 2% | Clear "X is defined as..." patterns for key terms |
72
+ | Entity Disambiguation | 2% | Primary entity defined early, consistent terminology |
60
73
 
61
- **Content Organization (~30%)** - *How* easily AI can extract and trust your content:
74
+ **Pillar 3: Trust & Authority (~15%)** - *How* AI trusts your content:
62
75
 
63
76
  | Criterion | Weight | What it measures |
64
77
  |-----------|--------|------------------|
65
78
  | Entity Authority & NAP Consistency | 5% | Organization schema, consistent name/address/phone |
66
79
  | Internal Linking Structure | 4% | Topic clusters, breadcrumbs, reachability from homepage |
67
80
  | Content Freshness Signals | 4% | dateModified schema, visible dates, recent content |
68
- | Schema.org Structured Data | 3% | JSON-LD blocks (Organization, Article, FAQPage, etc.) |
69
81
  | Author & Expert Schema | 3% | Person schema with credentials and expertise |
70
- | Table & List Extractability | 3% | HTML tables with headers, ordered/unordered lists |
71
- | Definition Patterns | 2% | Clear "X is defined as..." patterns for key terms |
72
- | Visible Date Signal | 2% | Visible publication dates with `<time>` elements |
82
+ | Schema.org Structured Data | 3% | JSON-LD blocks (Organization, Article, FAQPage, etc.) |
83
+
84
+ **Pillar 4: Technical Foundation (~10%)** - *How* easily AI parses your pages:
85
+
86
+ | Criterion | Weight | What it measures |
87
+ |-----------|--------|------------------|
73
88
  | Semantic HTML5 & Accessibility | 2% | Semantic elements (main, article, nav), ARIA, lang |
74
89
  | Clean, Crawlable HTML | 2% | HTTPS, meta tags, proper heading hierarchy |
90
+ | Visible Date Signal | 2% | Visible publication dates with `<time>` elements |
91
+ | Extraction Friction | 2% | Sentence length, voice-friendly leads, jargon density |
92
+ | Image Context for AI | 1% | Figure/figcaption, descriptive alt text, contextual placement |
93
+ | Schema Coverage & Depth | 1% | Schema markup on inner pages, not just homepage |
94
+ | Speakable Schema | 1% | SpeakableSpecification for voice assistants |
75
95
 
76
- **Technical Plumbing (~15%)** - *Whether* AI crawlers can find you (table stakes):
96
+ **Pillar 5: AI Discovery (~10%)** - *Whether* AI crawlers can find you:
77
97
 
78
98
  | Criterion | Weight | What it measures |
79
99
  |-----------|--------|------------------|
@@ -85,44 +105,48 @@ AEORank evaluates 28 criteria that determine how AI engines (ChatGPT, Claude, Pe
85
105
  | Sitemap Completeness | 1% | sitemap.xml with lastmod dates |
86
106
  | Canonical URL Strategy | 1% | Self-referencing canonical tags |
87
107
  | RSS/Atom Feed | 1% | RSS feed linked from homepage |
88
- | Schema Coverage & Depth | 1% | Schema markup on inner pages, not just homepage |
89
- | Speakable Schema | 1% | SpeakableSpecification for voice assistants |
90
108
 
91
109
  > **Coherence Gate:** Sites with topic coherence below 6/10 are score-capped regardless of technical perfection. A scattered site with perfect robots.txt, llms.txt, and schema will score lower than a focused site with mediocre technical implementation.
92
110
 
93
111
  <details>
94
- <summary>All 28 criteria (numbered list)</summary>
95
-
96
- | # | Criterion | Weight | Tier |
97
- |---|-----------|--------|------|
98
- | 1 | llms.txt File | 2% | Plumbing |
99
- | 2 | Schema.org Structured Data | 3% | Organization |
100
- | 3 | Q&A Content Format | 5% | Substance |
101
- | 4 | Clean, Crawlable HTML | 2% | Organization |
102
- | 5 | Entity Authority & NAP Consistency | 5% | Organization |
103
- | 6 | robots.txt for AI Crawlers | 2% | Plumbing |
104
- | 7 | Comprehensive FAQ Section | 4% | Substance |
105
- | 8 | Original Data & Expert Analysis | 10% | Substance |
106
- | 9 | Internal Linking Structure | 4% | Organization |
107
- | 10 | Semantic HTML5 & Accessibility | 2% | Organization |
108
- | 11 | Content Freshness Signals | 4% | Organization |
109
- | 12 | Sitemap Completeness | 1% | Plumbing |
110
- | 13 | RSS/Atom Feed | 1% | Plumbing |
111
- | 14 | Table & List Extractability | 3% | Organization |
112
- | 15 | Definition Patterns | 2% | Organization |
113
- | 16 | Direct Answer Paragraphs | 5% | Substance |
114
- | 17 | Content Licensing & AI Permissions | 2% | Plumbing |
115
- | 18 | Author & Expert Schema | 3% | Organization |
116
- | 19 | Fact & Data Density | 6% | Substance |
117
- | 20 | Canonical URL Strategy | 1% | Plumbing |
118
- | 21 | Content Publishing Velocity | 2% | Plumbing |
119
- | 22 | Schema Coverage & Depth | 1% | Plumbing |
120
- | 23 | Speakable Schema | 1% | Plumbing |
121
- | 24 | Query-Answer Alignment | 5% | Substance |
122
- | 25 | Content Cannibalization | 2% | Plumbing |
123
- | 26 | Visible Date Signal | 2% | Organization |
124
- | 27 | Topic Coherence | 14% | Substance |
125
- | 28 | Content Depth | 7% | Substance |
112
+ <summary>All 34 criteria (numbered list)</summary>
113
+
114
+ | # | Criterion | Weight | Pillar |
115
+ |---|-----------|--------|--------|
116
+ | 1 | llms.txt File | 2% | AI Discovery |
117
+ | 2 | Schema.org Structured Data | 3% | Trust & Authority |
118
+ | 3 | Q&A Content Format | 5% | Content Structure |
119
+ | 4 | Clean, Crawlable HTML | 2% | Technical Foundation |
120
+ | 5 | Entity Authority & NAP Consistency | 5% | Trust & Authority |
121
+ | 6 | robots.txt for AI Crawlers | 2% | AI Discovery |
122
+ | 7 | Comprehensive FAQ Section | 4% | Content Structure |
123
+ | 8 | Original Data & Expert Analysis | 10% | Answer Readiness |
124
+ | 9 | Internal Linking Structure | 4% | Trust & Authority |
125
+ | 10 | Semantic HTML5 & Accessibility | 2% | Technical Foundation |
126
+ | 11 | Content Freshness Signals | 4% | Trust & Authority |
127
+ | 12 | Sitemap Completeness | 1% | AI Discovery |
128
+ | 13 | RSS/Atom Feed | 1% | AI Discovery |
129
+ | 14 | Table & List Extractability | 3% | Content Structure |
130
+ | 15 | Definition Patterns | 2% | Content Structure |
131
+ | 16 | Direct Answer Paragraphs | 5% | Content Structure |
132
+ | 17 | Content Licensing & AI Permissions | 2% | AI Discovery |
133
+ | 18 | Author & Expert Schema | 3% | Trust & Authority |
134
+ | 19 | Fact & Data Density | 6% | Answer Readiness |
135
+ | 20 | Canonical URL Strategy | 1% | AI Discovery |
136
+ | 21 | Content Publishing Velocity | 2% | AI Discovery |
137
+ | 22 | Schema Coverage & Depth | 1% | Technical Foundation |
138
+ | 23 | Speakable Schema | 1% | Technical Foundation |
139
+ | 24 | Query-Answer Alignment | 5% | Content Structure |
140
+ | 25 | Content Cannibalization | 2% | AI Discovery |
141
+ | 26 | Visible Date Signal | 2% | Technical Foundation |
142
+ | 27 | Topic Coherence | 14% | Answer Readiness |
143
+ | 28 | Content Depth | 7% | Answer Readiness |
144
+ | 29 | Citation-Ready Writing | 4% | Answer Readiness |
145
+ | 30 | Answer-First Placement | 3% | Answer Readiness |
146
+ | 31 | Evidence Packaging | 3% | Answer Readiness |
147
+ | 32 | Entity Disambiguation | 2% | Content Structure |
148
+ | 33 | Extraction Friction | 2% | Technical Foundation |
149
+ | 34 | Image Context for AI | 1% | Technical Foundation |
126
150
 
127
151
  </details>
128
152
 
@@ -358,29 +382,37 @@ console.log(crawlResult.discoveredUrls.length); // Total URLs found
358
382
 
359
383
  ## Per-Page Scoring
360
384
 
361
- AEORank scores each individual page (0-100) against the 14 criteria that apply at page level. Instead of only seeing "your site scores 62," you get "your /about page scores 45, your /blog/guide scores 78."
385
+ AEORank scores each individual page (0-75) against the 20 criteria that apply at page level. Instead of only seeing "your site scores 62," you get "your /about page scores 45, your /blog/guide scores 72."
362
386
 
363
- The 14 per-page criteria follow the same substance-first weighting as the site-level score:
387
+ The 20 per-page criteria follow the same pillar-first weighting as the site-level score:
364
388
 
365
- | Tier | Per-Page Criteria | Weight |
366
- |------|-------------------|--------|
367
- | **Substance** | Original Data & Expert Content | 10% |
389
+ | Pillar | Per-Page Criteria | Weight |
390
+ |--------|-------------------|--------|
391
+ | **Answer Readiness** | Original Data & Expert Content | 10% |
368
392
  | | Fact & Data Density | 6% |
369
- | | Direct Answer Paragraphs | 5% |
393
+ | | Citation-Ready Writing | 4% |
394
+ | | Answer-First Placement | 3% |
395
+ | | Evidence Packaging | 3% |
396
+ | **Content Structure** | Direct Answer Paragraphs | 5% |
370
397
  | | Q&A Content Format | 5% |
371
398
  | | Query-Answer Alignment | 5% |
372
399
  | | FAQ Section Content | 4% |
373
- | **Organization** | Content Freshness Signals | 4% |
374
- | | Schema.org Structured Data | 3% |
375
400
  | | Table & List Extractability | 3% |
376
401
  | | Definition Patterns | 2% |
377
- | | Visible Date Signal | 2% |
378
- | | Semantic HTML5 & Accessibility | 2% |
402
+ | | Entity Disambiguation | 2% |
403
+ | **Trust & Authority** | Content Freshness Signals | 4% |
404
+ | | Schema.org Structured Data | 3% |
405
+ | **Technical Foundation** | Semantic HTML5 & Accessibility | 2% |
379
406
  | | Clean, Crawlable HTML | 2% |
380
- | **Plumbing** | Canonical URL Strategy | 1% |
407
+ | | Visible Date Signal | 2% |
408
+ | | Extraction Friction | 2% |
409
+ | | Image Context for AI | 1% |
410
+ | **AI Discovery** | Canonical URL Strategy | 1% |
381
411
 
382
412
  The remaining 14 criteria are site-level only: llms.txt, robots.txt, sitemap, RSS, entity consistency, internal linking, content licensing, author schema, content velocity, schema coverage, speakable schema, content cannibalization, topic coherence, and content depth.
383
413
 
414
+ > **Single-page cap:** Per-page scores are capped at 75 since single pages cannot demonstrate site-wide signals like topic coherence, content velocity, or sitemap completeness.
415
+
384
416
  ### CLI Output
385
417
 
386
418
  Per-page scores appear in the pages section:
@@ -403,8 +435,9 @@ import type { PageScoreResult, PageCriterionScore } from 'aeorank';
403
435
 
404
436
  // Score a single page
405
437
  const result = scorePage(html, url);
406
- console.log(result.aeoScore); // 0-100
407
- console.log(result.criterionScores); // 14 per-criterion scores
438
+ console.log(result.aeoScore); // 0-75 (capped for single pages)
439
+ console.log(result.criterionScores); // 20 per-criterion scores
440
+ console.log(result.scoreCapped); // true if score was capped at 75
408
441
 
409
442
  // Score all pages from site data
410
443
  const allScores = scoreAllPages(siteData);
@@ -532,15 +565,17 @@ console.log(result.comparison.tied); // Criteria with equal scores
532
565
 
533
566
  ## Changelog
534
567
 
568
+ ### v3.0.0 - 5-Pillar Framework & 6 New Criteria
569
+
570
+ Scoring Engine v2: 28 → 34 criteria with 5-pillar framework (Answer Readiness, Content Structure, Trust & Authority, Technical Foundation, AI Discovery). 6 new criteria targeting citation quality, evidence packaging, and extraction friction. Per-pillar sub-scores, top-3 fixes, client-friendly names. Single-page score cap at 75. 15 per-page quality checks (up from 12).
571
+
535
572
  ### v2.3.0 - Coherence Scaling & Script Stripping
536
573
 
537
- - **Topic coherence scales with page count**: Sites with many pages (50+) no longer penalized for having more topic clusters. Cluster thresholds scale proportionally (pages/10, pages/5, pages/3). Absolute term presence (10+ pages) boosts focus score.
538
- - **Strip inline JavaScript from scoring**: `<script>` and `<style>` tags are now removed before text analysis, preventing WP Rocket and similar deferred-loading scripts from corrupting regex-based scoring.
539
- - **Regex safety net**: `checkQueryAnswerAlignment` wraps `new RegExp()` in try-catch to handle residual script content gracefully.
574
+ Topic coherence scales with page count. Inline JavaScript stripped from scoring.
540
575
 
541
576
  ### v2.2.0 - Auto Page Discovery
542
577
 
543
- Sites without a `sitemap.xml` now get up to 30 pages discovered from homepage links instead of 1-5. Prevents inflated scores from insufficient page coverage.
578
+ Auto-discover pages from homepage links when no sitemap exists.
544
579
 
545
580
  ### v2.1.0 - Scoring Rebalance with Coherence Gate
546
581
 
@@ -560,7 +595,7 @@ Individual page scores (0-100) against 14 page-level criteria. Top/bottom page r
560
595
 
561
596
  ## Benchmark Dataset
562
597
 
563
- The `data/` directory contains the largest open dataset of AI visibility scores - **13,619 domains** scored across 28 criteria, including **4,328 Y Combinator startups** across 48 batches (W06-W26):
598
+ The `data/` directory contains the largest open dataset of AI visibility scores - **13,619 domains** scored across 34 criteria, including **4,328 Y Combinator startups** across 48 batches (W06-W26):
564
599
 
565
600
  | File | Contents |
566
601
  |------|----------|
package/dist/browser.d.ts CHANGED
@@ -62,6 +62,33 @@ declare function extractLinksWithAnchors(html: string, sourceUrl: string, domain
62
62
  */
63
63
  declare function buildLinkGraph(pages: FetchResult[], domain: string, homepageUrl: string): LinkGraph;
64
64
 
65
+ /**
66
+ * V2 Pillar Framework — 5-pillar scoring model.
67
+ * Maps all 34 criteria into pillars, computes sub-scores,
68
+ * provides client-friendly names, and calculates top-3 fixes.
69
+ */
70
+
71
+ interface PillarScores {
72
+ answerReadiness: number;
73
+ contentStructure: number;
74
+ trustAuthority: number;
75
+ technicalFoundation: number;
76
+ aiDiscovery: number;
77
+ }
78
+ interface TopFix {
79
+ criterion: string;
80
+ clientName: string;
81
+ description: string;
82
+ impactPoints: number;
83
+ effort: 'Low' | 'Medium' | 'High';
84
+ }
85
+ type PillarName = 'Answer Readiness' | 'Content Structure' | 'Trust & Authority' | 'Technical Foundation' | 'AI Discovery';
86
+ declare const PILLARS: Record<PillarName, string[]>;
87
+ declare const CLIENT_NAMES: Record<string, string>;
88
+ declare function getCriterionPillar(criterionId: string): string;
89
+ declare function computePillarScores(criteria: CriterionResult[]): PillarScores;
90
+ declare function computeTopFixes(criteria: CriterionResult[], count?: number): TopFix[];
91
+
65
92
  /**
66
93
  * AEORank type definitions.
67
94
  * Inlined from @aeo/shared to keep the package zero-dependency.
@@ -76,6 +103,9 @@ interface ScoreCardItem {
76
103
  score: number;
77
104
  status: Status;
78
105
  keyFindings: string;
106
+ pillar?: string;
107
+ clientName?: string;
108
+ weight?: number;
79
109
  }
80
110
  interface DetailedFinding {
81
111
  type: FindingType;
@@ -120,6 +150,10 @@ interface PageReview {
120
150
  strengths: PageIssue[];
121
151
  aeoScore?: number;
122
152
  criterionScores?: PageCriterionScore$1[];
153
+ pillarScores?: PillarScores;
154
+ estimatedSiteScore?: number;
155
+ scoreCapped?: boolean;
156
+ topFixes?: string[];
123
157
  }
124
158
  interface AuditData {
125
159
  site: string;
@@ -134,6 +168,14 @@ interface AuditData {
134
168
  pitchNumbers: PitchMetric[];
135
169
  bottomLine: string;
136
170
  pagesReviewed?: PageReview[];
171
+ pillarScores?: PillarScores;
172
+ coherenceGated?: boolean;
173
+ criteriaScored?: number;
174
+ topFixes?: Array<{
175
+ fix: string;
176
+ impact: string;
177
+ effort: string;
178
+ }>;
137
179
  }
138
180
  type AuditStatus = 'pass' | 'fail' | 'partial' | 'not_found';
139
181
  type Priority = 'P0' | 'P1' | 'P2' | 'P3';
@@ -256,6 +298,12 @@ interface RawDataSummary {
256
298
  crawl_discovered: number;
257
299
  crawl_fetched: number;
258
300
  crawl_skipped: number;
301
+ citation_ready_sentences: number;
302
+ answer_first_ratio: number;
303
+ evidence_citations_avg: number;
304
+ entity_disambiguation_ratio: number;
305
+ extraction_friction_avg: number;
306
+ image_figure_ratio: number;
259
307
  }
260
308
  /**
261
309
  * Fetches all site data in parallel with HTTPS/HTTP fallback.
@@ -272,7 +320,7 @@ interface SitemapDateAnalysis {
272
320
  declare function countRecentSitemapDates(sitemapText: string): SitemapDateAnalysis;
273
321
  declare function extractRawDataSummary(data: SiteData): RawDataSummary;
274
322
  /**
275
- * Run all 26 criteria checks using pre-fetched site data.
323
+ * Run all 34 criteria checks using pre-fetched site data.
276
324
  * All functions are synchronous (no HTTP calls) - data was already fetched.
277
325
  */
278
326
  declare function auditSiteFromData(data: SiteData): CriterionResult[];
@@ -282,6 +330,7 @@ declare function auditSiteFromData(data: SiteData): CriterionResult[];
282
330
  */
283
331
  declare function auditSite(targetUrl: string): Promise<CriterionResult[]>;
284
332
 
333
+ declare const WEIGHTS: Record<string, number>;
285
334
  declare function calculateOverallScore(criteria: CriterionResult[]): number;
286
335
 
287
336
  /**
@@ -350,6 +399,24 @@ interface CrawlOptions {
350
399
  respectRobots?: boolean;
351
400
  /** Include asset files — skipped by default */
352
401
  includeAssets?: boolean;
402
+ /** Called after each batch with per-URL results */
403
+ onProgress?: (event: CrawlProgressEvent) => void;
404
+ }
405
+ interface CrawlProgressEvent {
406
+ /** URLs attempted in this batch */
407
+ urls: string[];
408
+ /** Whether each URL succeeded */
409
+ results: Array<{
410
+ url: string;
411
+ ok: boolean;
412
+ status?: number;
413
+ }>;
414
+ /** Total fetched so far */
415
+ fetched: number;
416
+ /** Total discovered so far */
417
+ discovered: number;
418
+ /** Max pages limit */
419
+ maxPages: number;
353
420
  }
354
421
  interface CrawlResult {
355
422
  pages: FetchResult[];
@@ -381,7 +448,7 @@ declare function crawlFullSite(siteData: SiteData, options?: CrawlOptions): Prom
381
448
 
382
449
  /**
383
450
  * Per-page analysis for instant audit.
384
- * Runs 12 deterministic checks on each crawled page (no LLM).
451
+ * Runs 15 deterministic checks on each crawled page (no LLM).
385
452
  */
386
453
 
387
454
  declare function analyzePage(html: string, url: string, category: PageCategory): PageReview;
@@ -389,8 +456,8 @@ declare function analyzeAllPages(siteData: SiteData): PageReview[];
389
456
 
390
457
  /**
391
458
  * Per-page AEO scoring.
392
- * Evaluates 14 of 28 criteria that apply at individual page level.
393
- * Produces a 0-100 AEO score per page.
459
+ * Evaluates 20 of 34 criteria that apply at individual page level.
460
+ * Produces a 0-75 AEO score per page (single-page cap at 75).
394
461
  */
395
462
 
396
463
  interface PageCriterionScore {
@@ -402,10 +469,23 @@ interface PageCriterionScore {
402
469
  interface PageScoreResult {
403
470
  aeoScore: number;
404
471
  criterionScores: PageCriterionScore[];
405
- }
472
+ scoreCapped?: boolean;
473
+ }
474
+ /** 15. Citation-Ready Writing Quality */
475
+ declare function scoreCitationReadyWriting(html: string): number;
476
+ /** 16. Answer-First Placement */
477
+ declare function scoreAnswerFirstPlacement(html: string): number;
478
+ /** 17. Evidence Packaging */
479
+ declare function scoreEvidencePackaging(html: string): number;
480
+ /** 18. Entity Disambiguation */
481
+ declare function scoreEntityDisambiguation(html: string): number;
482
+ /** 19. Extraction Friction Score */
483
+ declare function scoreExtractionFriction(html: string): number;
484
+ /** 20. Image Context for AI */
485
+ declare function scoreImageContextAI(html: string): number;
406
486
  /**
407
- * Score a single page against 14 AEO criteria.
408
- * Returns a 0-100 AEO score and individual criterion scores.
487
+ * Score a single page against 20 AEO criteria.
488
+ * Returns a 0-100 AEO score (capped at 75 for single pages) and individual criterion scores.
409
489
  */
410
490
  declare function scorePage(html: string, url?: string): PageScoreResult;
411
491
  /**
@@ -534,4 +614,4 @@ interface ComparisonResult {
534
614
  */
535
615
  declare function compare(domainA: string, domainB: string, options?: AuditOptions): Promise<ComparisonResult>;
536
616
 
537
- export { type AuditData, type AuditFinding, type AuditStatus, CRITERION_LABELS, type ComparisonResult, type CrawlOptions, type CrawlResult, type CriterionComparison, type CriterionDetail, type CriterionResult, type Deliverable, type DetailedFinding, type FetchResult, type FindingSeverity, type FindingType, type FixAction, type FixPhase, type FixPlan, type FixPlanSummary, type ImpactLevel, type LinkEdge, type LinkGraph, type LinkGraphStats, type PageCategory$1 as PageCategory, type PageCriterionScore$1 as PageCriterionScore, type PageIssue, type PageNode, type PageReview, type PageScoreResult, type ParkedDomainResult, type PitchMetric, type Priority, type RawDataSummary, type ScoreCardItem, type SerializedLinkGraph, type Severity, type SiteData, type SitemapDateAnalysis, type Status, type TopicCluster, analyzeAllPages, analyzePage, auditSite, auditSiteFromData, buildDetailedFindings, buildLinkGraph, buildScorecard, calculateOverallScore, compare, countRecentSitemapDates, crawlFullSite, detectParkedDomain, extractAllUrlsFromSitemap, extractContentPagesFromSitemap, extractInternalLinks, extractLinksWithAnchors, extractNavLinks, extractRawDataSummary, fetchMultiPageData, generateBottomLine, generateFixPlan, generateOpportunities, generatePitchNumbers, generateVerdict, inferCategory, prefetchSiteData, scoreAllPages, scorePage, scoreToStatus, serializeLinkGraph };
617
+ export { type AuditData, type AuditFinding, type AuditStatus, CLIENT_NAMES, CRITERION_LABELS, type ComparisonResult, type CrawlOptions, type CrawlProgressEvent, type CrawlResult, type CriterionComparison, type CriterionDetail, type CriterionResult, type Deliverable, type DetailedFinding, type FetchResult, type FindingSeverity, type FindingType, type FixAction, type FixPhase, type FixPlan, type FixPlanSummary, type ImpactLevel, type LinkEdge, type LinkGraph, type LinkGraphStats, PILLARS, type PageCategory$1 as PageCategory, type PageCriterionScore$1 as PageCriterionScore, type PageIssue, type PageNode, type PageReview, type PageScoreResult, type ParkedDomainResult, type PillarName, type PillarScores, type PitchMetric, type Priority, type RawDataSummary, type ScoreCardItem, type SerializedLinkGraph, type Severity, type SiteData, type SitemapDateAnalysis, type Status, type TopFix, type TopicCluster, WEIGHTS, analyzeAllPages, analyzePage, auditSite, auditSiteFromData, buildDetailedFindings, buildLinkGraph, buildScorecard, calculateOverallScore, compare, computePillarScores, computeTopFixes, countRecentSitemapDates, crawlFullSite, detectParkedDomain, extractAllUrlsFromSitemap, extractContentPagesFromSitemap, extractInternalLinks, extractLinksWithAnchors, extractNavLinks, extractRawDataSummary, fetchMultiPageData, generateBottomLine, generateFixPlan, generateOpportunities, generatePitchNumbers, generateVerdict, getCriterionPillar, inferCategory, prefetchSiteData, scoreAllPages, scoreAnswerFirstPlacement, scoreCitationReadyWriting, scoreEntityDisambiguation, scoreEvidencePackaging, scoreExtractionFriction, scoreImageContextAI, scorePage, scoreToStatus, serializeLinkGraph };