$npx -y skills add Hainrixz/claude-seo-ai --skill seo-entity-linkingAudit and generate entity & knowledge-graph linkage for a page — verify sameAs identity links (Wikidata/Wikipedia/LinkedIn/Crunchbase/official profiles) on Organization/Person, check NAP/entity consistency for local, confirm a defined primary entity, and measure entity density, t
| 1 | # seo-entity-linking (M6) |
| 2 | |
| 3 | Entity linkage tells search engines and AI systems *which real-world thing* a page is about and ties it to the Knowledge Graph. Reference: `references/schema-tier1.md` (the `sameAs`/`@id`/Person+Organization rules). This module owns the `sameAs` detail M5 defers here. |
| 4 | |
| 5 | ## Audits |
| 6 | Working from the PageSnapshot (`rendered_dom` if present, else `raw_html`): |
| 7 | 1. **sameAs identity links**: for `Organization`/`Person` entities, check for `sameAs[]` resolving to canonical identities — Wikidata QID, Wikipedia, LinkedIn, Crunchbase, official social/company profiles. Wikidata is the strongest Knowledge Graph target. |
| 8 | 2. **Primary entity defined**: confirm exactly one clear primary entity per page (via `@id` + `mainEntity`/`mainEntityOfPage`), not an ambiguous or missing subject. |
| 9 | 3. **Entity consistency (local)**: for `LocalBusiness`, verify NAP (name, address, telephone) in schema matches visible on-page NAP and is internally consistent across blocks. |
| 10 | 4. **Entity density**: count distinct linked/marked entities (`@id`d nodes, `sameAs` targets, `about`/`mentions`) — flag thin pages with no resolvable entity references. |
| 11 | |
| 12 | ## Fixes |
| 13 | - **AUTO** (`fixable: auto`): inject a `sameAs[]` array on `Organization`/`Person` using **only user-confirmed URLs**, and add `about`/`mentions` entity references to existing schema. Additive, deterministic diffs for `fix`. **Never invent** identity links — if a URL is unconfirmed, leave a clearly-marked `TODO` placeholder the user fills. |
| 14 | - **PROPOSED** (`fixable: proposed`): a candidate Wikidata/LinkedIn match found by lookup — drafted for per-item human accept, never auto-written. |
| 15 | - **ADVISORY** (`fixable: advisory`): "establish a Wikidata entity / claim profiles" when none exist — guidance only, the tool writes nothing. |
| 16 | |
| 17 | ## Verification |
| 18 | - `dom_assert`: confirm `sameAs`/`@id`/`mainEntity` present and well-formed in the parsed JSON-LD. |
| 19 | - Resolve each `sameAs` URL (Tier 1 Wikidata lookup) to confirm it is live and refers to the asserted entity — a dead or mismatched link is a fail, not a pass. |
| 20 | - When the live lookup tier is unavailable, status is `needs_api`, never a false `pass`. |
| 21 | |
| 22 | ## Findings |
| 23 | Emit findings per `schema/finding.schema.json`. Examples: |
| 24 | - `M6.organization.missing_sameas` — `Organization` has no `sameAs[]` (status `fail`, severity 4, `fixable: proposed`, axis `ai`, confidence `directional`). |
| 25 | - `M6.person.no_wikidata_link` — author `Person` lacks a Wikidata/LinkedIn identity link (status `warn`, severity 2, `fixable: proposed`, axis `ai`, confidence `directional`). |
| 26 | - `M6.page.no_primary_entity` — no single defined primary entity (`@id`/`mainEntity`) on the page (status `warn`, severity 4, `fixable: advisory`, axis `ai`, confidence `directional`). |
| 27 | Each finding: `evidence.observed` quotes the page (the entity block or its absence); `verification.reproduce` is a runnable assertion/lookup; `expected_impact` is banded + confidence-tagged (no naked %). |
| 28 | |
| 29 | ## Honesty |
| 30 | - A `sameAs` link does **not** force entry into the Knowledge Graph and produces no guaranteed ranking lift — it is a disambiguation signal, so impact is `directional`/`ai`, not `established`. |
| 31 | - Never fabricate, guess, or "best-effort" an identity URL to inflate entity density — a wrong `sameAs` actively misleads engines. Confirmed-only, or leave it as a TODO. |