fix(seo): I1 — scope Off-page axis to what is actually measured

Axis was defined "backlinks, mentions, authority" (10% local / 15%
national of the FULL score) but only mentions have a data source
(STEP 6 web_search "<name>" -site:<domain>). Backlinks and authority
have no index, no API — the agent had to invent 2/3 of the number, and
that number reaches a client via /client-handover.

- Axis label names what is measured + points at §14.
- Off-page axis note: score mentions ONLY; never price in unmeasured
  sub-components; a low mention count is NOT evidence of a weak backlink
  profile. Mandatory verbatim §14 line naming the gap + the nearest free
  source (Common Crawl) so the omission is legible, not silent.
- LOCAL N/A label: was `N/A — requires FULL audit`, a promise FULL cannot
  keep for backlinks. Now states FULL covers brand mentions only.

Weights deliberately unchanged: re-deriving now and again when a backlink
source lands would churn historical scores twice. Revisit when the axis
widens back (Common Crawl, phase 5).

Note: initial plan was to mark the axis N/A in FULL and redistribute the
weight. Reading the real spec (seo-analyzer.md:622 + STEP 6) showed that
over-corrects — it discards the mentions data, which IS gathered. Narrowed
the definition instead; composes with the Common Crawl work later.

Verified: make test 35 GREEN / 0 RED.
This commit is contained in:
Bastien Chanot
2026-07-16 16:14:12 +02:00
parent 8b0c98c99a
commit 57c67f2f75
+23 -2
View File
@@ -619,7 +619,7 @@ FIX: AUTO (<what agent will do>) | USER (<what user must do>)
| Technical (perf, CWV, security headers, indexability) | 20% | 30% | | | Technical (perf, CWV, security headers, indexability) | 20% | 30% | |
| On-page (content, meta, headings, images, video, a11y, i18n) | 20% | 30% | | | On-page (content, meta, headings, images, video, a11y, i18n) | 20% | 30% | |
| SEO Local (NAP, GMB, citations) | 25% | 5% | | | SEO Local (NAP, GMB, citations) | 25% | 5% | |
| Off-page (backlinks, mentions, authority) | 10% | 15% | | | Off-page (unlinked brand mentions — backlinks/authority NOT auditable, §14) | 10% | 15% | |
| Social presence | 10% | 5% | | | Social presence | 10% | 5% | |
| Competitive position | 5% | 10% | | | Competitive position | 5% | 10% | |
| Legal compliance | 10% | 5% | | | Legal compliance | 10% | 5% | |
@@ -628,6 +628,23 @@ FIX: AUTO (<what agent will do>) | USER (<what user must do>)
real users, from STEP 4) when available; otherwise lab PageSpeed real users, from STEP 4) when available; otherwise lab PageSpeed
Lighthouse run. Lighthouse run.
**Off-page axis note (I1).** Score ONLY the unlinked brand mentions
gathered in STEP 6 (`web_search "<business-name>" -site:<domain>`).
Backlink profile and domain authority have NO data source here — no index,
no API, nothing. NEVER price them into the number: an unmeasured
sub-component cannot be judged, and this axis carries 10-15% of a score
that reaches a client via `/client-handover`. A low mention count is a low
mention count — it is NOT evidence of a weak backlink profile.
Mandatory §14 line whenever depth=FULL, verbatim:
`Backlinks / domain authority — NOT audited: no backlink index wired.
Nearest free source: Common Crawl hyperlinkgraph. Commercial: Ahrefs /
Semrush / Majestic. The Off-page score above prices in brand mentions only.`
Weight deliberately unchanged despite the narrower scope: re-deriving it
now, then again when a backlink source lands, would churn historical
scores twice. Revisit the 10/15% only when the axis widens back.
### LOCAL depth — 4 axes ### LOCAL depth — 4 axes
| Axis | Weight (local B2C) | Weight (SaaS/national/content) | Score /20 | | Axis | Weight (local B2C) | Weight (SaaS/national/content) | Score /20 |
@@ -638,7 +655,11 @@ Lighthouse run.
| Legal compliance (pages, CMP, mentions) | 20% | 15% | | | Legal compliance (pages, CMP, mentions) | 20% | 15% | |
LOCAL axes not audited (Off-page, Social, Competitive) appear as LOCAL axes not audited (Off-page, Social, Competitive) appear as
`N/A — requires FULL audit` in the report. `N/A — requires FULL audit` in the report. Off-page is the exception to
that promise: FULL audits its brand-mentions share ONLY — backlinks and
authority are unauditable at EVERY depth (see the Off-page axis note).
Print `N/A — FULL audits brand mentions only` for it, never a bare
"requires FULL audit" that FULL cannot keep.
### Projected code-only score + trajectory to 17/20 (mandatory) ### Projected code-only score + trajectory to 17/20 (mandatory)