feat(seo): NAP guardrails + audit-end deliverables

- STEP 0 collects user-confirmed CANONICAL NAP (LRN-032 zenquality:
  duplicated-seed trap — source majority is not truth)
- Both dispatch prompts carry the canonical NAP + no-majority rule;
  seo-analyzer spec forbids directional NAP fix without confirmation
- STEP 2 now emits .claude/audits/HUMAN-ACTIONS.md (checklist from §11)
  and NAP-KIT.md (local business) in BOTH modes — audit-only runs leave
  the user immediately actionable; /client-handover §4 consumes NAP-KIT
This commit is contained in:
Bastien Chanot
2026-07-10 17:03:53 +02:00
parent 642da0147c
commit b6bde8f4ee
2 changed files with 73 additions and 2 deletions
+13
View File
@@ -481,12 +481,25 @@ web_search: "<business-name>" "<city>" site:google.com/maps
Or use provided URL. Extract: Or use provided URL. Extract:
- Name, address, phone, hours, rating, review count, categories, photos - Name, address, phone, hours, rating, review count, categories, photos
- Compare NAP with: - Compare NAP with:
- The CANONICAL NAP from the dispatch context (user-confirmed) — the
only source of truth when present
- LocalBusiness JSON-LD on site - LocalBusiness JSON-LD on site
- HTML visible content - HTML visible content
- Other citations below - Other citations below
**NAP inconsistencies = critical finding.** **NAP inconsistencies = critical finding.**
**NAP mismatch direction rule (LRN-032).** NEVER infer the correct value
from source majority: on-site sources (JSON-LD, footer, settings DB,
legal pages) usually descend from ONE seed and can all carry the same
wrong value — the single diverging source may be the only one a human
actually corrected. Direction of fix:
- Diverging from a CONFIRMED canonical field → fix the diverging source.
- Canonical field UNCONFIRMED or absent → report the divergence WITHOUT
a directional fix; escalate as a user question ("which value is
correct?") in the envelope (§11 user action). No bundle item may
rewrite a NAP value that no confirmed canonical backs.
### Social media verification ### Social media verification
For each provided URL: For each provided URL:
+60 -2
View File
@@ -159,6 +159,29 @@ GSC PROPERTY: <property> | none
Skip questions already answered in `$ARGUMENTS`. Skip questions already answered in `$ARGUMENTS`.
### NAP canonique (both depths — local-business projects)
If the project shows local-business signals (LocalBusiness JSON-LD, GMB,
phone/address in content), collect and get the user to CONFIRM the
canonical NAP — name, street address, postal code + city, phone, email,
opening hours. A previous audit's values or the code's values are NOT a
substitute for user confirmation (duplicated-seed trap — see LRN-032
zenquality: 3 on-site sources shared one wrong seeded phone; the single
diverging source was the only correct one).
Record in the shared context block:
```
CANONICAL NAP: <name> | <address> | <phone> | <email> | <hours>
```
Fields the user cannot confirm → mark `UNCONFIRMED`.
This user-confirmed NAP is the single source of truth for BOTH agents:
- A source diverging from a CONFIRMED field = finding with KNOWN
direction (fix the diverging source).
- A divergence on an UNCONFIRMED field = finding WITHOUT direction —
escalate as a user question ("which value is correct?"), NEVER pick
a side from source majority.
### Plugin check (FULL only) ### Plugin check (FULL only)
For FULL depth, verify `WebFetch` and `WebSearch` are available. For FULL depth, verify `WebFetch` and `WebSearch` are available.
@@ -248,9 +271,17 @@ BUSINESS CONTEXT:
Known citations: ... Known citations: ...
Known competitors: ... Known competitors: ...
Time budget: ... Time budget: ...
Canonical NAP: <from STEP 0, with UNCONFIRMED markers> | none
GSC account: <label> | none (FULL only) GSC account: <label> | none (FULL only)
GSC property: <property> | none (FULL only) GSC property: <property> | none (FULL only)
NAP RULE (LRN-032): the Canonical NAP above (user-confirmed) is the only
source of truth. NEVER infer a correct NAP value from source majority —
on-site sources usually share one seed and can all be wrong. Divergence
from a CONFIRMED field → finding with known direction. Divergence on an
UNCONFIRMED field (or no canonical provided) → finding WITHOUT
directional fix, escalated as a user question in your envelope.
You are the classical-SEO half of a parallel SEO+GEO audit. Do NOT You are the classical-SEO half of a parallel SEO+GEO audit. Do NOT
audit GEO/AI signals (llms.txt, AI crawlers, QAPage/Speakable schemas, audit GEO/AI signals (llms.txt, AI crawlers, QAPage/Speakable schemas,
entity SEO, content shape for AI, AI visibility) — the geo-analyzer entity SEO, content shape for AI, AI visibility) — the geo-analyzer
@@ -294,7 +325,11 @@ Dispatched from /seo. Context:
AUDIT DEPTH: <LOCAL|FULL> AUDIT DEPTH: <LOCAL|FULL>
BUSINESS CONTEXT: BUSINESS CONTEXT:
(same block as above) (same block as above, including Canonical NAP)
NAP RULE (LRN-032): same as seo-analyzer — the user-confirmed Canonical
NAP is the only truth for JSON-LD NAP content you own; never resolve a
divergence by source majority.
You are the GEO/AI half of a parallel SEO+GEO audit. Do NOT audit You are the GEO/AI half of a parallel SEO+GEO audit. Do NOT audit
classical SEO signals (meta tags, Core Web Vitals, hreflang, image classical SEO signals (meta tags, Core Web Vitals, hreflang, image
@@ -523,6 +558,27 @@ block, the dispatcher:
3. Tags it visibly in §0 if it's a legal/compliance blocker. 3. Tags it visibly in §0 if it's a legal/compliance blocker.
4. Keeps these notes visible on re-run — they don't silently vanish. 4. Keeps these notes visible on re-run — they don't silently vanish.
### Post-merge deliverables (ALWAYS — both modes, right after SEO.md)
These are AUDIT outputs, not fix outputs: generate them even in
conservative mode, so an audit-only run leaves the user immediately
actionable on visibility work.
1. **`.claude/audits/HUMAN-ACTIONS.md`** — regenerate from the merged
§11 on EVERY run (overwrite; SEO.md keeps the history). Format: one
`- [ ]` checkbox per action, grouped by §8/§9/§10 horizon, each with
its "Automatisation possible avec:" line and effort estimate. Header
links back to SEO.md + audit version/date. This is the working
checklist; §11 stays the authoritative reference.
2. **`.claude/audits/NAP-KIT.md`** — local-business projects only.
Generate/refresh from the CANONICAL NAP (STEP 0) + business context:
exact NAP table (display + machine formats), categories, 3
description lengths (short ~150 / medium ~350 / long ~600 chars, FR +
EN if bilingual), public pricing, URLs to reference, and the
directory checklist from §11 citations actions. Mark UNCONFIRMED
fields visibly. Rule at top: copy-paste only, never retype.
`/client-handover` §4 (NAP table) consumes this file when present.
## STEP 3 — Console summary ## STEP 3 — Console summary
``` ```
@@ -536,7 +592,9 @@ NOTE GEO (IA) : XX.X / 20
NOTE GLOBALE (pondérée) : XX.X / 20 NOTE GLOBALE (pondérée) : XX.X / 20
CHANGEMENTS APPLIQUES (N) : voir SEO.md §15 CHANGEMENTS APPLIQUES (N) : voir SEO.md §15
ACTIONS UTILISATEUR (N) : voir SEO.md §11 (avec automatisation) ACTIONS UTILISATEUR (N) : .claude/audits/HUMAN-ACTIONS.md (checklist)
+ SEO.md §11 (référence, avec automatisation)
NAP KIT : .claude/audits/NAP-KIT.md (si local business)
CONFORMITÉ LÉGALE : OK | <N> blockers → §0 CONFORMITÉ LÉGALE : OK | <N> blockers → §0
ALERTES MAJEURES : <short list> ALERTES MAJEURES : <short list>