What the Publish Gate Actually Checks

Windrow's publish gate runs before a page can go live. If it finds a failure, the page does not publish. It does not warn you and move on, and it does not hand you a score to feel good about.

Here is what it checks, why each check is there, and the things it reports without blocking, because a computer cannot honestly decide them.

What is on the list?

The gate has two layers. The first is a set of checks I wrote for Windrow's own blocks. The second is axe-core, the open-source testing engine, running the page in a real browser.

Every row below blocks the publish.

Windrow's own blocking checks
Check Label it shows What it decides
Image has a description, or is marked decorative WCAG 1.1.1 Description present, or decorative chosen
Link has text WCAG 2.4.4 Accessible name is not empty
Link text is not "click here" or a bare web address WCAG 2.4.4 Text matched against a fixed list
Button has a name WCAG 4.1.2 Accessible name is not empty
Embedded video has a title WCAG 4.1.2 Title is not empty
Video captions are confirmed WCAG 1.2.2 The author confirmed captions exist
Audio has a transcript link WCAG 1.2.1 The link is on the page
Control is at least 24 by 24 pixels WCAG 2.5.8 Measured size
Page has a main heading Heading structure Count is not zero
Page has only one main heading Heading structure Count is not more than one
No skipped heading levels Heading structure Sequence
Figure has a text version Figure check Text version is present
Every footnote has a note, and every note a reference Footnote check References and notes match

Then axe-core runs every rule tagged WCAG 2.0, 2.1, or 2.2 at level A or AA. That is where text contrast, form labels, the page language, the page title, table header cells, and valid ARIA get checked. Any one of those failing blocks the publish too.

It scans the page four times: at a desktop width and a phone width, each in light mode and dark mode. A contrast failure that only shows up in dark mode on a phone is still a contrast failure.

And if the scan cannot run at all, the page does not publish. A gate that lets pages through when it breaks is not a gate.

Why only what a machine can decide?

Because a gate that guesses is a gate people learn to route around.

A machine can tell you an image has a description. It cannot tell you the description is any good. It can tell you a heading exists at level two. It cannot tell you the heading describes the section. Any product that claims otherwise is selling you a confidence score dressed as a verdict.

So the rule I settled on: the gate blocks on things it can prove. Contrast is math. Heading sequence is arithmetic. Label association is a lookup.

Two rows in that table are not pure measurement, and I want to be straight about them. The link-text row checks a short list of phrases that never describe a destination, like "click here." Anything vaguer only gets a warning. The captions row cannot see captions at all, because they live on YouTube. It checks that you said they are there.

The moment a gate produces one false block, the person on the other side stops trusting all of it. Then they find the override, and now you have a warning system with extra steps.

So what happens with alt text?

The gate checks that an author made a decision. That is all it can honestly check.

The gate cannot tell you the description is good. It can tell you nobody skipped it.

That extra step is the whole design. It is friction on purpose. Twenty years of audits taught me that the failure is not that people write bad alt text. It is that the tool let them write none at all and publish anyway.

What only gets a warning?

Four checks report on the page without blocking it. Each one points at a real problem, and each one would block pages that are fine.

The pattern is the same in all four. A check that is right most of the time is not a gate. It is a nag.

What did I take back?

The three heading checks used to say "WCAG 1.3.1." They were wrong to.

No success criterion requires a page to have a main heading. HTML allows more than one, and no criterion forbids it. Skipping a level fails no criterion either. Axe-core files its own versions of these under best practice, with no WCAG tag at all.

They still block. A single clear main heading and an unbroken outline make a page much better to listen to, and that is a fair call for the product to make. What changed is the label. They now say "Heading structure," and a test in the codebase fails if anyone puts the WCAG number back. A procurement team that checks a citation should find something behind it.

What will the gate never catch?

Plenty, and I would rather say it plainly than let the gate imply otherwise.

Automated testing covers roughly a third of WCAG. A green gate means you did not ship the third that machines can catch. It is not a conformance certificate.

Before you launch anything that matters: keyboard the top three tasks, zoom to 200%, and run a screen reader through the single most important flow. Fifteen minutes. It finds things no gate will.

Key points

Windrow is live and open now. Start free, or pick a paid plan: $19 a month for individuals, $29 for nonprofits and schools, $49 for organizations, $199 for agencies. See every plan on windrow.app.

Get new posts by email

No spam, no tracking, one-click unsubscribe in every message.