Skills/SEO/Pre-publish page audit

Pre-publish page audit: in order of how fatal each defect is

Audits a page in order of consequence rather than in order of the checklist, so whether the page can be indexed at all is settled before anyone discusses the title tag.

skill 2,408 words MIT by Locul Verified safe · 0 secrets Tested 2026-08-19
No account, no install, nothing to sign up for. Copy it or download it and it works in Claude Code today. One-click import lands here shortly.
Our verdict

Revived on the harder test, and the only skill here that trades precision for recall. Read the cost before you install it.

Cut in the first round, revived in the second, and it carries the most uncomfortable cost of anything we have published.

The first test scored it against a fixture carrying thirteen planted defects. The control found twelve and led with the right one, so the skill added a single finding and was cut. The second test used real pages fetched from the live web, with whatever real defects they happened to carry, and a prompt with no mention of SEO at all: these go live tomorrow, have a quick look.

On real pages the gap opened up. Median 9 of 22 without the skill, 12 with it. Worst case 7 without, 10 with. Five runs each way, p=0.0238.

The difference is almost entirely about what gets noticed without being asked. The run without the skill reliably read the page it was pointed at and stopped. It never noticed the page with two H1 elements both reading Overview, never noticed the missing canonical, never noticed the Open Graph image declared as a root-relative path, and never noticed the meta description that was the site tagline rather than anything about the page. The run with the skill found all four, most of the time.

The cost, stated plainly, because we would rather you did not install this by accident. The rubric contained several criteria that are only met when a genuinely clean page is left alone. Without the skill, those scored a perfect 5 of 5. With it, 2 of 5. It reports problems on pages that do not have them. In exchange for roughly seven extra real findings per run it hands you roughly three false ones, and dismissing a confident false finding costs real time.

And the evidence here is weaker than for anything else on this site. One case, where the other skills had two. We are publishing it because it cleared a line we fixed before we looked at the numbers, and moving that line afterwards is the one thing that would make every other number on this site worthless.

When to reach for it

  • Immediately before a page goes live, which is the last moment a staging noindex can be caught for free.
  • After a migration or a template change, when a defect is likely to be identical across every page built from that template.
  • When traffic to a page never arrived and nobody knows why.
  • On a batch of pages queued to publish, where the useful question is which one is broken rather than whether any are.
  • Before asking anyone to review copy, because a page that cannot be indexed does not need a copy review yet.

The test we ran

Real public pages, fetched from the live web and saved with their response headers, since some fatal defects live only in headers. No defects were planted. The set included one page that is genuinely fine, so that a run inventing problems to look thorough could be caught, and one defect that is fatal in the sense that it makes every other finding on that page irrelevant.

The rubric was written by an author who never saw the skill file, working only from the saved bytes, and every criterion names the real file and the real markup behind it.

Both arms ran on the strongest model available with every user instruction file, plugin and installed skill disabled, and each output was graded alone by a session that was not told the other arm existed.

Result: median 9 of 22 without, 12 with. Worst case 7 without, 10 with. p=0.0238. One case, so weaker evidence than the two-case results elsewhere on this site.

What it does not do

Stated plainly, because a skill that claims everything is useful for nothing.

  • It raises more false alarms than working without it. This is measured, not a caveat we are adding for balance: across three separate criteria that check whether a genuinely clean page is left alone, the run WITHOUT the skill scored 5 of 5 and the run with it scored 2 of 5. It buys roughly seven extra real findings per run and costs roughly three false ones. Budget time to dismiss things.
  • Its evidence is weaker than the other skills here. One case, five runs an arm, where the others had two cases. We are publishing it because it cleared a threshold fixed before we saw the numbers, not because we are confident in the size of the effect.
  • Both arms scored badly in absolute terms, 8.6 and 12.4 out of 22. It is better than nothing on this task and it is nowhere near a competent human specialist.
  • It checks what is in the markup and the headers. It cannot tell you whether the content is worth publishing, whether the page duplicates something on another domain, or whether anyone searches for this.
  • It has no access to your analytics, your index coverage or your log files, so it reasons about what should happen rather than what did.

Install it

  1. Open Locul, go to Library, and choose Import. One-click import from this page lands shortly.
  2. Locul writes the file to the right folder for every assistant you have connected, so you do not have to know where each one keeps its skills.
  3. Environment variables and headers in any shared config are replaced with a placeholder before they reach you, so importing a stranger's setup cannot hand you their credentials or take yours.
  4. Locul is free to start, on Mac and Windows. Get it here.
  1. Download SKILL.md using the button above, or copy the file.
  2. Save it at .claude/skills/pre-publish-page-audit/SKILL.md in your project, or under ~/.claude/skills/pre-publish-page-audit/SKILL.md on Mac and Linux, or %USERPROFILE%\.claude\skills\pre-publish-page-audit\SKILL.md on Windows, to make it available everywhere.
  3. Start a new session. Claude Code picks up the skill from the name and description in the file's frontmatter, so you can also invoke it by name.
  1. Download or copy the file.
  2. For Claude Desktop, add it through the skills panel in settings, or drop the folder into your skills directory.
  3. For Cursor and other assistants that read plain instruction files, paste the body into your project rules file. The skill is plain markdown with no tool bindings, so it carries across.

What else does this job

A real crawler is better than this at the mechanical checks and you should own one. What a crawler cannot do is look at a page that has not shipped yet, which is the entire window this covers.

We also wrote and tested a SERP-first content brief skill for this category, which decides what format to publish by reading the results page first. It produced a real, statistically detectable improvement and still missed the effect size we had fixed in advance, so it is not published. Its numbers are in the results table on the hub, including the p value, because a skill that was significant and still cut is the clearest illustration we have of why the threshold is set in advance.

Read the full source
---
name: pre-publish-page-audit
description: Audits a page before it goes live, in order of how fatal each defect is. Checks whether the page can be indexed at all, whether it competes with a page you already published, whether it is represented correctly in titles, canonicals and structured data, whether anything links to it, and whether it is degraded for users. Includes a cannibalisation decision tree and the structured-data rules that trigger manual penalties. This skill should be used on any page immediately before publishing.
---

# Pre-publish page audit

## The claim this skill is built on

Most page audits are run in the wrong order, so they find the wrong problems.

A typical checklist starts with the title tag, the meta description, and image alt text, works through
heading structure, and ends somewhere near structured data. Every item on it is real. But if the page
carries a `noindex` left over from staging, none of it matters, because the page will never appear.
And if the page duplicates the intent of something already ranking on the same site, fixing the title
makes things worse, because a better-optimised duplicate competes harder with the page that was
working.

So the order matters more than the list. This skill runs the checks in descending order of fatality,
and stops to raise the alarm at the first tier that fails, rather than delivering forty findings of
which one is load-bearing.

The five tiers:

0. The page cannot be indexed at all.
1. The page competes with your own site.
2. The page is indexed but misrepresented.
3. Nothing links to the page.
4. The page is degraded for the humans who reach it.

## Tier 0. Can this page be indexed at all?

If anything here fails, report it first, alone, and loudly. Everything below is moot.

- **Robots meta and header.** A `noindex` in the meta tag or in an `X-Robots-Tag` response header.
  Staging leftovers are the single most common cause of a page that quietly never ranks, and they are
  invisible to everyone who is looking at the rendered page rather than the source.
- **robots.txt.** Is the path or a parent directory disallowed? Are the assets needed to render it
  blocked, which can cause the page to be assessed on an incomplete render?
- **Canonical.** Does the canonical point at this page? Does it match the URL that will actually be
  served, in scheme, host, trailing slash, and extension? A canonical to `http://` on an `https://`
  site, or to `/page.html` when the site serves `/page`, is a self-inflicted deindexing. Cross-domain
  or cross-page canonicals must be deliberate and stated.
- **Server response.** 200, not a redirect chain, not a soft 404.
- **Rendering.** If the content requires JavaScript, does the initial HTML contain it? Content behind
  a client-side fetch may or may not be indexed, and treating it as safe is a gamble.
- **Authentication or paywall.** Content behind a gate is content that will not be assessed.

## Tier 1. Does this page compete with your own site?

This is the check almost nobody runs before publishing, and it is the one most likely to make the site
worse. **Run it before Tier 2**, because the answer may be that this page should not exist.

Compare the new page against everything already published on the domain:

- **Identical or near-identical titles.** Fastest signal.
- **Same target intent**, even where the wording differs. "Business expense categories" and "how to
  categorize business expenses" are one intent, not two.
- **URL near-duplicates.** `/blog/expense-categories` alongside `/blog/business-expense-categories` is
  a strong signal that somebody forgot the first one existed.
- **An existing page already ranking for the intended query**, which is the decisive fact. Splitting
  the signal for a page that already ranks is a straight downgrade.

**The decision tree:**

- Existing page ranks well and covers the intent. → **Do not publish.** Fold the new material into
  the existing page. This is almost always the right answer and it is almost never the popular one.
- Existing page ranks poorly and the new page is clearly better. → **Publish at the existing URL**, or
  publish new and 301 the old one. Never leave both live.
- The intents are genuinely distinct and you can state the difference in one sentence. → **Publish**,
  and cross-link them so the distinction is legible.
- You cannot tell. → **Do not publish yet.** Resolve it. Publishing is easy to do and expensive to undo
  once links accumulate.

The one-sentence test is the useful discipline here: if you cannot state, in one sentence, the
difference between who should land on page A and who should land on page B, there is no difference and
you are about to create a duplicate.

## Tier 2. Is the page represented correctly?

Now the conventional checks, which matter once the page can rank and deserves to exist.

**Title.** Unique across the site. Front-loads the thing the page is about. Long enough to be
descriptive, short enough not to be truncated in results, which in practice means somewhere around 60
characters or 600 pixels. It should read as written for a person, not assembled from a keyword.

**Meta description.** Present, unique, and actually a description. A 40 character stub wastes the one
piece of copy you control in the results listing. Around 150 to 160 characters. It does not affect
ranking and it strongly affects clicks, which is a distinction worth understanding rather than
memorising.

**Headings.** Exactly one `h1`. No skipped levels, because the hierarchy is the outline and a jump from
`h2` to `h4` implies a level that does not exist. Headings should describe their sections rather than
being decorative.

**Social cards.** `og:title`, `og:description`, `og:url`, `og:type`, an `og:image`, and a Twitter card
type. **The image URL must be absolute**, with scheme and host. A relative image path is the most
common social card defect and it fails silently: the page looks fine, and every share renders without
an image.

**Structured data.** Two categories of problem, and the second is far more serious.

*Validity.* Dates in ISO 8601, not a local format. `author` as a `Person` or `Organization` object,
not a bare string. Absolute image URLs. Headlines within length limits. Required properties present
for the declared type.

*Honesty.* **Structured data must describe content that is visible on the page.** This is not a
nicety, it is the rule whose violation triggers manual penalties. The specific pattern to watch for:
an `FAQPage` block containing questions and answers that do not appear in the visible copy, frequently
including a promotional question about the product that nobody asked. That is marked-up content the
user cannot see, and it is the textbook violation. Also: no ratings for things nobody rated, no review
markup written by the seller about the seller, and no markup for a type the page is not.

*Two facts that most checklists have not caught up with, verified as of August 2026.* **FAQ rich
results were retired for all sites in May 2026**, so `FAQPage` markup no longer earns a results-page
feature. That does not make it harmless: a fabricated FAQ block is still a policy violation with no
upside left at all, which makes it the easiest thing on this page to simply delete. And **`HowTo`
markup was deprecated in 2023**; a checklist that still recommends adding it is out of date, and so is
one that still talks about keyword density, LSI keywords, or First Input Delay. If the audit you are
replacing mentions any of those, treat its other advice with suspicion too.

Check every block, not just the first. Pages routinely carry two or three, and the broken one is
rarely the first.

**Language and locale.** `lang` on the `html` element. `hreflang` if there are translations, and it
must be reciprocal, or it is ignored.

## Tier 3. Does anything link to the page?

A page nobody links to is a page that is hard to find and carries no internal authority.

- **Is it in the sitemap?** A newly published page absent from the sitemap is a common oversight,
  particularly when the sitemap is generated at build time from a source that does not know about the
  new file.
- **Does any existing page link to it?** If the answer is none, it is an orphan. At least two internal
  links from relevant existing pages, placed in the body where they are contextual, not in a footer
  block.
- **Do its outbound internal links resolve?** Check each against the actual set of pages that exist. A
  link to a page that was planned and never shipped is a 404 you are shipping deliberately.
- **Is any internal link marked `nofollow`?** Almost always a mistake. It blocks internal authority
  from flowing for no benefit.
- **Do the links use meaningful anchor text?** "Click here" and a bare URL both waste the signal.

## Tier 4. Is the page degraded for the humans who arrive?

- **Images.** Every image has an `alt` attribute. Decorative images get `alt=""`, which is a decision,
  not an omission. Content-bearing images, especially an image of a table or a chart, need their
  content available as text somewhere, because an image of a table is invisible to search engines and
  to screen readers alike.
- **The largest image above the fold must not be lazily loaded.** `loading="lazy"` on the hero image
  delays the largest contentful paint, which is the exact metric it is measured by. Lazy loading is
  correct below the fold and harmful above it.
- **Dimensions on images**, to prevent layout shift.
- **Viewport meta tag** present.
- **Contrast, focus visibility, and keyboard reachability** for anything interactive.
- **Text that is actually text.** Copy baked into images is not readable, not translatable, and not
  indexable.

## Reporting

Group by tier, and lead with the highest tier that has a failure. If Tier 0 fails, the report is
one line and a fix, and the rest is an appendix. Burying "this page has a noindex tag" as item 14 of
a 22 item list is a real failure of the audit, not a stylistic preference.

For each finding: what is wrong, the exact line or attribute, what it causes, and the corrected value.
Not "improve the meta description" but the description to use.

End with an explicit ship or hold, and if hold, the minimum set that unblocks it.

## Worked example, compressed

A guide scheduled to publish tomorrow.

**Tier 0, fatal.** `<meta name="robots" content="noindex, follow">` is present. The page cannot rank at
all. The canonical is also wrong twice: it uses `http://` on an `https://` site and includes a `.html`
extension the site does not serve. Nothing else in this report matters until these are fixed.

**Tier 1, fatal in a different way.** An existing published page carries a byte-identical title and
targets the same intent, and it already ranks for the query this page is aimed at. Applying the
decision tree: the existing page ranks, so this page should not publish as a new URL. Its material
belongs in the existing page. **Fixing the noindex without resolving this would actively harm the
site**, which is exactly why the tiers run in this order.

**Tier 2.** Two `h1` elements. The heading hierarchy jumps from `h2` to `h4`. The meta description is
41 characters where the existing page's is materially better. `og:image` is a root-relative path, so
every share renders imageless. `og:description`, `og:url`, `og:type` and the Twitter card are all
absent. The `Article` block has a date in day-first format rather than ISO 8601, a headline well over
the length limit, a bare string author, and a relative image. The `FAQPage` block contains three
questions, none of which appear in the visible copy, and one is a promotional question about the
product. That last item is the most serious finding in this tier and is a manual-penalty pattern, not
a missed optimisation.

**Tier 3.** The page is absent from the sitemap and nothing links to it, so it is an orphan. One
outbound internal link points to a page that does not exist on the site. Another internal link carries
`rel="nofollow"` for no reason.

**Tier 4.** None of the three images has an `alt` attribute, and one of them is an image of a category
table, so its entire content is invisible to both search engines and screen readers. The hero image
carries `loading="lazy"`, delaying the largest contentful paint.

**Verdict: hold.** The Tier 1 finding means the correct action is not to fix this page but to merge it
into the existing one. If it does ship separately, the noindex and both canonical defects and the
fabricated FAQ markup are blocking.

## Failure modes

**Running the list in the printed order.** Producing twenty findings when one of them makes the other
nineteen irrelevant.

**Auditing the page in isolation.** Tier 1 is invisible if you never look at the rest of the site, and
Tier 1 is where the expensive mistakes live.

**Validating structured data only for syntax.** A block can be perfectly valid and still be a policy
violation. Ask whether a reader can see it.

**Trusting the rendered page.** Robots meta, canonical, and structured data are all in the source. Read
the source.

**Checking the first structured data block only.** Pages carry several.

**Reporting a truncated title as equal in weight to a noindex.** Severity is the whole point.

**Auditing a template once.** If the page is generated from a template, a defect is not one defect. It
is one per generated page, and the report should say so.

## What this skill does not do

- It does not fetch live results, check current rankings, or measure real traffic. Statements about
  what already ranks have to come from analytics or a rank tracker, and it will ask rather than assume.
- It does not measure performance. It flags patterns known to hurt, like a lazily loaded hero, but real
  numbers need a real measurement.
- It does not judge whether the content is good, whether it matches search intent, or whether the
  keyword was worth targeting. Those belong upstream, before the page was written.
- It does not audit sitewide technical health: redirect chains across the site, crawl budget, log
  files, index bloat.
- It cannot verify what it cannot see. Server headers, redirects, and rendered output need the live
  URL, and a source-only audit will say which checks it could not complete.
Why import instead of copy

A skill is only as good as what it can read.

These skills all ask your assistant to check things against your actual codebase, your actual schema, your actual design system. Locul keeps that context current on its own, from the files you already have, on your machine. Mac and Windows, free to start.

Start free