# page-quick-check: open rubric v1

This is the open rubric behind the free SiteRevenue page quick-check. Anyone can read it, run it, or fork it.

- **10 checks, each pass, fail, or na** (na only when a check does not apply, such as a page with no images, or only images marked decorative). Each one has a clear rule and must quote what it found on the page.
- **No weights, no score, no letter grade.** A check either passes or it doesn't. The official grade comes from a separate step.
- **The paid audit goes deeper.** It covers the page's hero, calls to action, offer, proof, forms, trust, and mobile layout. None of those are in this rubric.

## How a check is run

1. Make **one GET request** to the URL. Follow redirects. Don't run JavaScript.
2. Use the raw HTML you get back and the **final response headers**.
3. Give each check a verdict: **pass**, **fail**, or **na** (not applicable). Every verdict must quote its evidence, such as the actual tag text, count, or header. If you can't quote evidence, you don't have a verdict.
4. Always run and report the checks in the order below.

**Impact order:** indexable, https-final, viewport-meta, title-length, canonical, meta-description, og-share, head-sync-scripts, img-alt, json-ld. The checks are listed in this order, most important first. It sets the order only. It is not a weight.

## The 10 checks

### 1. `indexable`: Search engines are allowed to index the page
- **What's measured:** The `content` of `<meta name="robots">` and the `X-Robots-Tag` response header. Report "none" if either is absent.
- **Pass / fail:** Fails if either one contains `noindex`. Otherwise it passes.
- **Fix:** Remove `noindex` from the live page.

### 2. `https-final`: Page ends up on HTTPS in one hop or less
- **What's measured:** The final URL after redirects, and how many redirects it took to get there.
- **Pass / fail:** Passes if the final URL starts with `https://` and it took **1 redirect or fewer**. Otherwise it fails.
- **Fix:** Set every http and www variant to 301-redirect straight to one https URL.

### 3. `viewport-meta`: Page is set up for mobile screens
- **What's measured:** The `content` of `<meta name="viewport">`.
- **Pass / fail:** Passes if it contains `width=device-width`. Fails if it doesn't or the tag is missing.
- **Edge rule:** The separator between values doesn't matter. Commas, semicolons, and spaces all count, so `width=device-width; initial-scale=1` passes the same as `width=device-width, initial-scale=1`. Matching is case-insensitive, and spaces around `=` are ignored.
- **Fix:** Add `<meta name="viewport" content="width=device-width, initial-scale=1">`.

### 4. `title-length`: Page title is present and a sensible length
- **What's measured:** The text of the first `<title>` inside `<head>`, with whitespace collapsed, plus its character count. `<title>` tags inside inline SVG icons don't count.
- **Pass / fail:** Passes if it's **10–60 characters**. Fails if it's missing, shorter, or longer.
- **Fix:** Make the title your offer plus your brand, in 60 characters or fewer.

### 5. `canonical`: Page names one official URL for itself
- **What's measured:** The `href` of `<link rel="canonical">`.
- **Pass / fail:** Passes if there's **exactly one** canonical tag, its URL is absolute, and its host matches the final page's host. Fails if it's missing, duplicated, relative, or points to another host.
- **Edge rule:** Compare **hosts only**. Ignore the path, query, fragment, and any trailing slash, so `https://carrd.com` matches a final URL of `https://carrd.com/`, and `https://example.com/pricing/` matches `https://example.com/pricing`. Host matching is case-insensitive. `www.example.com` and `example.com` are different hosts.
- **Fix:** Add one absolute canonical that points to the page itself.

### 6. `meta-description`: Search snippet description is present and a sensible length
- **What's measured:** The `content` of `<meta name="description">`, plus its character count.
- **Pass / fail:** Passes if it's **50–160 characters**. Fails if it's missing or out of range.
- **Fix:** Write one 120–155-character line that says who the page is for and what they get.

### 7. `og-share`: Page has a title and image for link previews
- **What's measured:** The `content` of `og:title` and `og:image`, using either the `property` or the `name` attribute.
- **Pass / fail:** Passes only if **both** are present and non-empty.
- **Fix:** Add both tags. Use an absolute image URL, sized 1200×630.

### 8. `head-sync-scripts`: Few scripts block the page from loading
- **What's measured:** The number of `<script src>` tags in `<head>` that have none of `async`, `defer`, or `type="module"`, plus the first such `src`.
- **Pass / fail:** Passes if there are **2 or fewer**. Fails if there are more.
- **Fix:** Add `defer`, or move the script to the end of `<body>`.

### 9. `img-alt`: Content images have alt text
- **What's measured:** The total number of `<img>` tags, how many have non-empty `alt` text, and how many were left out as decorative.
- **Edge rule (decorative images):** An image is decorative when it has `alt=""` (present and empty) **and** also `aria-hidden="true"` or `role="presentation"` / `role="none"` on the same tag. Decorative images never fail: they are left out of **both** counts, the images with alt text and the total. Every other image is a content image. A content image with no `alt`, or with a bare `alt=""` and neither attribute, counts as missing alt text. The evidence must say how many were left out, e.g. "4/4 have alt text (2 logos marked decorative, not counted)".
- **Pass / fail:** Passes if **80% or more** of the content images have alt text. Otherwise it fails. It's **na** if no content images are left (the page has none, or all of them are decorative).
- **Fix:** Write alt text for your content images. If an image is purely decorative, mark it `alt="" aria-hidden="true"`.

### 10. `json-ld`: Page describes itself with structured data
- **What's measured:** The number of `<script type="application/ld+json">` blocks and the first `@type` found.
- **Pass / fail:** Passes if there's **at least 1**. Fails if there are none.
- **Fix:** Add Organization, SoftwareApplication, or Product JSON-LD, whichever fits.

## What the output looks like

A file named `quickcheck-<host>-<YYYY-MM-DD>.md` containing:
- 10 rows, in the order above: #, id, verdict, evidence quote, fix.
- **Fix-3:** the first 3 failing checks, in the order above.
- One suggested headline (H1) rewrite, marked *subjective*. It isn't one of the 10 checks.
- Footer: `made with SiteRevenue · https://siterevenue.ai/?utm_source=grokbot&ref=tpl1`. `ref=tpl1` is the fixed code for this template (see the skill for how it's set).

The chat reply is a condensed, verdict-first summary of the same results (the skill defines the exact template). The saved file always keeps the full quoted evidence for every check.

## What this rubric doesn't do

- It doesn't grade, weight, or rank anything. The impact order only sets the order checks are listed in.
- It doesn't use an AI to judge any of the 10 checks. Every verdict follows from the evidence rule.
- It doesn't judge persuasion, copy quality, offer, trust, forms, or mobile conversion. The paid SiteRevenue audit covers those.

## Revisions

- **2026-09-25, impact order:** the 10 checks are now listed and reported in impact order (see "Impact order" above). Ids, rules, and thresholds are unchanged. Only the numbering moved.
- **2026-09-25, img-alt decorative rule:** images marked explicitly decorative (`alt=""` plus `aria-hidden="true"` or `role="presentation"`/`"none"`) are no longer counted in `img-alt`, and a check with no content images left is na. No other check changed.
