Skip to content
Advance Labs
Advance Labs Inc. logo

We audited our own site with our own tool. Half the failures were false positives.

Technical SEO · 7 min read · Updated 2026-09-16

Short answer: An SEO audit false positive is a failure the tool reports on markup that's actually correct. We found three in our own AEO auditor by running it on advancelabs.dev and checking all 6 reported failures by hand against the raw HTML. Three were real. Three were false positives, and chasing them turned up three bugs in our scoring engine: it counted alt="" as missing alt text, it failed a homepage for not being an article, and it couldn't see a Person nested inside an Article. After the fixes the same page went from 87/B to 92/A, and the 3 failures left are ones we agree with.

## what_happened

What happened when we audited our own site?

Before trusting our auditor with anyone else's site, we pointed it at ours. It reported 34 checks passed and 6 failed, for a score of 87 and a B. The obvious next step was to fix the 6. We didn't, not yet. We opened the raw HTML and confirmed each finding by hand first, because a score is only as good as the rules behind it, and we wrote the rules.

Reported failureHand checkVerdict
Title tag too long66 characters, over the limitReal
No FAQPage schemaNone on the homepageReal
No speakable markupNone on the homepageReal
Low alt-text coverage (58%)19 images: 11 described, 8 decorative, 0 missingFalse positive
Missing BreadcrumbListA homepage is the root of the trailFalse positive
Missing Article author schemaA homepage isn't an articleFalse positive
3 of 6

Half the failures our auditor reported on its own maker's site were false positives. Each one traced to a rule bug, and each one would have told a client to change markup that was already right. (aeo-toolkit PR #34)

## bug_1_alt_text

Why was alt="" counted as missing alt text?

Under WCAG, an empty alt attribute is the correct markup for a decorative image. It tells a screen reader to skip the image instead of reading out a file name. Leaving the attribute off entirely is the actual failure. So an image can be in three states: attribute missing, attribute empty, attribute filled. Our rule collapsed those into two, so every correctly marked decorative image counted as missing.

Our homepage has 19 images. 11 carry descriptions, 8 are decorative with alt="", and 0 are missing the attribute. The rule scored that 58%. Acting on it would have meant writing descriptions for background art, which adds noise to screen reader output. In other words, the tool was recommending an accessibility regression, in a report that partly sells itself on accessibility.

The fix

The engine now tracks decorative images as their own state and leaves them out of both sides of the coverage ratio. A regression test covers a page where every image is decorative, and another makes sure a genuinely missing alt still fails even when decorative images sit next to it. The same homepage now scores 100% on that check.

## bug_2_nested_schema

Why couldn't the tool see a nested author?

The structured data validator only read the type of each top-level node. A Person sitting inside an Article as its author property never registered. That's not an edge case. It's the shape Google's own Article documentation uses, with the author written as a nested object. So the better your markup, the more likely you were to fail.

On our homepage the old validator reported only Organization and WebSite, and said there was no Person. The page actually carries two Person nodes, plus SoftwareApplication, PostalAddress, Place, ImageObject, and SearchAction. Several scored rules read those flags, so one shallow read quietly distorted everything downstream of it. For a client, that's a finding telling them to add schema they already have, and a bill for doing it.

The fix

Types are now collected recursively at any depth, including array-valued @type. Tests cover an @graph with a nested Person, an Article with a nested author, and the flat case that already worked, so the fix can't regress the simple path.

## bug_3_page_type

Why did a homepage fail article checks?

Two rules, breadcrumbs and article author schema, ran on every page regardless of what the page was. A homepage has no breadcrumb trail to mark up because it's where the trail starts, and it isn't an article. So every homepage audit shipped two findings the owner should ignore.

That costs more than two points. Once someone learns that some findings are noise, they start discounting all of them, including the real ones. A rule that fires where it doesn't apply trains people to ignore the other 38 checks.

The fix

Rules can now declare which pages they apply to, and the engine drops a rule entirely where it doesn't apply: no finding and no weight. Passing it would have been just as wrong, because it would claim we checked something we didn't.

## how_to_verify

How do you check an audit finding before acting on it?

None of these bugs are exotic. Any audit tool can collapse states, read too shallowly, or apply a rule too broadly, including ours. Here's the pass we now run on every finding before it goes in a report, and the one we'd suggest before you change anything a tool tells you to.

  1. 01Open the raw HTML, not the rendered page

    View source on the exact URL the tool audited and find the element the finding names. Most false positives fall apart here, because the markup the rule says is missing is sitting right there.

  2. 02Ask whether the rule is counting states correctly

    Absent, empty, and filled are different things for alt text, and similar splits exist elsewhere. If a finding treats a deliberate empty value as a missing one, it's the rule that's wrong.

  3. 03Read structured data as a tree

    Paste the JSON-LD into a validator that shows nesting, and look for the type the tool says is absent anywhere in the tree, not only at the top level.

  4. 04Check the rule applies to this page type

    Breadcrumbs on a homepage, article schema on a contact page, product markup on a blog post. A finding that assumes the wrong page type isn't a finding.

  5. 05Re-run after the fix and compare the pass count

    A real fix moves a failure to a pass. If the score moves because a rule stopped running, write that down separately, so you never report a removed check as an improvement.

All three fixes ship in version 0.2.0 of the AEO/GEO Auditor, our free Chrome extension. It runs 40 checks in your browser and names the markup behind every finding, so you can do the check above in a couple of minutes.

Get the free AEO/GEO Auditor

Why the fixed build took two weeks to reach the store

The fixes merged on September 1, but version 0.1.0 went live on September 2 still carrying the old engine, and a published store build can't be patched in place. Our first 0.2.0 upload was then rejected for remote code: a bundled PDF library still contained a CDN address it never loads, and review matches on the string, not on whether it's reachable. We stripped it at build time, added a build guard so it can't come back, and 0.2.0 went live on September 15.

## faq

What is a false positive in an SEO audit?

It's a finding the tool reports as a failure when the page is actually correct. Common causes are rules that treat distinct cases as one (an empty alt attribute versus a missing one), validators that only read top-level structured data, and rules applied to page types they don't fit, like breadcrumb checks on a homepage.

Is an empty alt attribute bad for SEO or accessibility?

No. Under WCAG, alt="" is the correct markup for a decorative image, because it tells screen readers to skip it. The failure is leaving the alt attribute off entirely. An audit that counts empty alt as missing is reporting a false positive.

Why does my audit say I have no author schema when I do?

The tool may only read the top-level nodes of your JSON-LD. If your Person is nested inside an Article as its author, which is how Google's Article documentation shows it, a shallow validator won't see it. Check the markup as a tree before adding schema you already have.

How can I tell if an audit finding is real?

Open the raw HTML of the exact URL and find the element the finding names. Check that the rule counts states correctly, reads structured data at every depth, and applies to that page type. Then re-run after fixing and confirm a failure became a pass.

## sources

## related_guides

## want_it_done_for_you

Want this done and re-checked every month? Our AEO retainer re-runs your buying questions in ChatGPT, Perplexity and Google, ships the fixes that keep you out of the answers, and reports what moved. From $500 a month. Or run the free check on your site first, at advancelabs.dev/tools/audit.

See the plans