# Alle 86 regler i pSEO-kontrakten

Kontrakten består af 86 maskinelt verificerbare regler fordelt på 14 domæner, og hver regel her på siden er genereret programmatisk fra selve regel-registret — datasættet bag denne demoside er frameworkets egen kildekode.

## Teknisk SEO

- [seo/title](https://pseo.mikkelkrogsholm.dk/regler/seo/title/) — Every page has a well-sized <title> (15–60 characters).
- [seo/meta-description](https://pseo.mikkelkrogsholm.dk/regler/seo/meta-description/) — Every page has a meta description of 50–160 characters.
- [seo/canonical](https://pseo.mikkelkrogsholm.dk/regler/seo/canonical/) — Every page declares an absolute canonical URL.
- [seo/single-h1](https://pseo.mikkelkrogsholm.dk/regler/seo/single-h1/) — Every page has exactly one <h1>.
- [seo/heading-hierarchy](https://pseo.mikkelkrogsholm.dk/regler/seo/heading-hierarchy/) — Headings start at h1 and never skip levels.
- [seo/structured-data](https://pseo.mikkelkrogsholm.dk/regler/seo/structured-data/) — Every page carries valid JSON-LD structured data.
- [seo/og-tags](https://pseo.mikkelkrogsholm.dk/regler/seo/og-tags/) — Every page has og:title, og:description and og:image.
- [seo/lang-attribute](https://pseo.mikkelkrogsholm.dk/regler/seo/lang-attribute/) — The <html> element declares its language.
- [seo/image-alt](https://pseo.mikkelkrogsholm.dk/regler/seo/image-alt/) — Every <img> has an alt attribute.
- [seo/descriptive-links](https://pseo.mikkelkrogsholm.dk/regler/seo/descriptive-links/) — Link anchor text is descriptive, not generic.
- [seo/charset](https://pseo.mikkelkrogsholm.dk/regler/seo/charset/) — The page declares its character encoding.
- [seo/favicon](https://pseo.mikkelkrogsholm.dk/regler/seo/favicon/) — The page declares a favicon.
- [seo/canonical-collisions](https://pseo.mikkelkrogsholm.dk/regler/seo/canonical-collisions/) — No two pages claim the same canonical URL.
- [seo/clean-urls](https://pseo.mikkelkrogsholm.dk/regler/seo/clean-urls/) — URLs are lowercase, hyphenated and free of encoded spaces.
- [seo/root-favicon](https://pseo.mikkelkrogsholm.dk/regler/seo/root-favicon/) — The site serves a /favicon.ico at the root.
- [seo/canonical-target-health](https://pseo.mikkelkrogsholm.dk/regler/seo/canonical-target-health/) — Canonical URLs point to existing, indexable pages.
- [seo/no-parameter-internal-links](https://pseo.mikkelkrogsholm.dk/regler/seo/no-parameter-internal-links/) — Internal links carry no query parameters or tracking tags.
- [seo/trailing-slash-consistency](https://pseo.mikkelkrogsholm.dk/regler/seo/trailing-slash-consistency/) — Internal links use one trailing-slash convention site-wide.
- [seo/link-count-ceiling](https://pseo.mikkelkrogsholm.dk/regler/seo/link-count-ceiling/) — No page carries more than 300 links.
- [seo/schema-visible-parity](https://pseo.mikkelkrogsholm.dk/regler/seo/schema-visible-parity/) — FAQ structured data matches the visible page content.
- [seo/title-variable-ratio](https://pseo.mikkelkrogsholm.dk/regler/seo/title-variable-ratio/) — Titles are not dominated by a shared boilerplate prefix.
- [seo/breadcrumb-parity](https://pseo.mikkelkrogsholm.dk/regler/seo/breadcrumb-parity/) — BreadcrumbList schema matches visible content and real pages.
- [seo/robots-txt](https://pseo.mikkelkrogsholm.dk/regler/seo/robots-txt/) — The site serves a robots.txt.
- [seo/sitemap](https://pseo.mikkelkrogsholm.dk/regler/seo/sitemap/) — The site serves an XML sitemap.

## Indholdskvalitet

- [quality/placeholder-leakage](https://pseo.mikkelkrogsholm.dk/regler/quality/placeholder-leakage/) — No template artifacts leak into rendered content.
- [quality/date-sanity](https://pseo.mikkelkrogsholm.dk/regler/quality/date-sanity/) — Structured-data dates are valid, ordered and not in the future.
- [quality/thin-content](https://pseo.mikkelkrogsholm.dk/regler/quality/thin-content/) — Main content has at least 250 words.
- [quality/duplicate-titles](https://pseo.mikkelkrogsholm.dk/regler/quality/duplicate-titles/) — No two pages share the same <title>.
- [quality/duplicate-descriptions](https://pseo.mikkelkrogsholm.dk/regler/quality/duplicate-descriptions/) — No two pages share the same meta description.
- [quality/boilerplate-share](https://pseo.mikkelkrogsholm.dk/regler/quality/boilerplate-share/) — Repeated stock sentences stay a minority of each page.
- [quality/intro-differentiation](https://pseo.mikkelkrogsholm.dk/regler/quality/intro-differentiation/) — Lead paragraphs differ between pages beyond token swaps.
- [quality/trust-pages](https://pseo.mikkelkrogsholm.dk/regler/quality/trust-pages/) — Declared trust pages exist and are linked site-wide.
- [quality/near-duplicate-content](https://pseo.mikkelkrogsholm.dk/regler/quality/near-duplicate-content/) — No two pages have near-identical main content.

## Linkgraf

- [graph/url-pattern-per-type](https://pseo.mikkelkrogsholm.dk/regler/graph/url-pattern-per-type/) — Every page URL matches a declared page-type pattern.
- [graph/orphan-pages](https://pseo.mikkelkrogsholm.dk/regler/graph/orphan-pages/) — Every page receives at least one internal link.
- [graph/broken-internal-links](https://pseo.mikkelkrogsholm.dk/regler/graph/broken-internal-links/) — No internal link points to a missing page.
- [graph/click-depth](https://pseo.mikkelkrogsholm.dk/regler/graph/click-depth/) — Every page is reachable from the homepage in ≤ 3 clicks.

## Performance

- [perf/img-dimensions](https://pseo.mikkelkrogsholm.dk/regler/perf/img-dimensions/) — Every <img> declares width and height.
- [perf/no-blocking-scripts](https://pseo.mikkelkrogsholm.dk/regler/perf/no-blocking-scripts/) — No render-blocking scripts in <head>.
- [perf/html-weight](https://pseo.mikkelkrogsholm.dk/regler/perf/html-weight/) — HTML document stays under 100 KB.
- [perf/modern-image-formats](https://pseo.mikkelkrogsholm.dk/regler/perf/modern-image-formats/) — Raster images are served as AVIF/WebP, not plain JPEG/PNG.
- [perf/responsive-images](https://pseo.mikkelkrogsholm.dk/regler/perf/responsive-images/) — Large content images declare srcset/sizes.
- [perf/lazy-loading](https://pseo.mikkelkrogsholm.dk/regler/perf/lazy-loading/) — Below-fold images lazy-load; the LCP candidate does not.
- [perf/image-weight](https://pseo.mikkelkrogsholm.dk/regler/perf/image-weight/) — No served image exceeds 150 KB.
- [perf/self-hosted-fonts](https://pseo.mikkelkrogsholm.dk/regler/perf/self-hosted-fonts/) — Fonts are self-hosted, not loaded from third-party CDNs.

## Tilgængelighed

- [a11y/main-landmark](https://pseo.mikkelkrogsholm.dk/regler/a11y/main-landmark/) — Every page has exactly one <main> landmark.
- [a11y/viewport](https://pseo.mikkelkrogsholm.dk/regler/a11y/viewport/) — Viewport meta exists and does not disable zoom.
- [a11y/accessible-names](https://pseo.mikkelkrogsholm.dk/regler/a11y/accessible-names/) — Every link and button has an accessible name.
- [a11y/skip-link](https://pseo.mikkelkrogsholm.dk/regler/a11y/skip-link/) — Page offers a skip-to-content link.
- [a11y/aria-integrity](https://pseo.mikkelkrogsholm.dk/regler/a11y/aria-integrity/) — ARIA references resolve and aria-hidden hides no focusables.
- [a11y/duplicate-ids](https://pseo.mikkelkrogsholm.dk/regler/a11y/duplicate-ids/) — No duplicate id values in the document.
- [a11y/iframe-title](https://pseo.mikkelkrogsholm.dk/regler/a11y/iframe-title/) — Every iframe has a descriptive title.
- [a11y/no-autoplay-motion](https://pseo.mikkelkrogsholm.dk/regler/a11y/no-autoplay-motion/) — No autoplaying media, marquee or timed refresh.

## Agent-parathed

- [agent/llms-txt](https://pseo.mikkelkrogsholm.dk/regler/agent/llms-txt/) — The site serves an /llms.txt.
- [agent/content-without-js](https://pseo.mikkelkrogsholm.dk/regler/agent/content-without-js/) — Page content is present in the HTML without executing JavaScript.
- [agent/llms-full-txt](https://pseo.mikkelkrogsholm.dk/regler/agent/llms-full-txt/) — The site serves an /llms-full.txt with the full content.
- [agent/utf8-text-files](https://pseo.mikkelkrogsholm.dk/regler/agent/utf8-text-files/) — Agent-facing text files are valid UTF-8 without mojibake.
- [agent/markdown-mirrors](https://pseo.mikkelkrogsholm.dk/regler/agent/markdown-mirrors/) — Every page has a markdown twin, declared via a link alternate.
- [agent/token-efficiency](https://pseo.mikkelkrogsholm.dk/regler/agent/token-efficiency/) — Visible text makes up a reasonable share of the HTML bytes.
- [agent/answer-first](https://pseo.mikkelkrogsholm.dk/regler/agent/answer-first/) — The first paragraph answers the page’s implied query directly.
- [agent/stable-heading-anchors](https://pseo.mikkelkrogsholm.dk/regler/agent/stable-heading-anchors/) — Section headings carry id attributes for deep linking.

## Sikkerhed

- [security/no-mixed-content](https://pseo.mikkelkrogsholm.dk/regler/security/no-mixed-content/) — No resources are loaded over insecure http://.
- [security/noopener](https://pseo.mikkelkrogsholm.dk/regler/security/noopener/) — target="_blank" links carry rel="noopener".
- [security/no-inline-event-handlers](https://pseo.mikkelkrogsholm.dk/regler/security/no-inline-event-handlers/) — No inline event handlers or javascript: URLs.
- [security/sri-external-resources](https://pseo.mikkelkrogsholm.dk/regler/security/sri-external-resources/) — Cross-origin scripts and stylesheets carry SRI integrity hashes.
- [security/no-base-tag](https://pseo.mikkelkrogsholm.dk/regler/security/no-base-tag/) — No <base> element.

## Grøn web

- [green/page-weight](https://pseo.mikkelkrogsholm.dk/regler/green/page-weight/) — Total page weight (HTML + CSS + JS + images) stays under 300 KB.

## Privatliv

- [privacy/no-trackers](https://pseo.mikkelkrogsholm.dk/regler/privacy/no-trackers/) — No consent-requiring trackers are embedded.
- [privacy/third-party-inventory](https://pseo.mikkelkrogsholm.dk/regler/privacy/third-party-inventory/) — The site loads no resources from third-party origins.

## Internationalisering

- [i18n/no-mojibake](https://pseo.mikkelkrogsholm.dk/regler/i18n/no-mojibake/) — No encoding corruption (mojibake) in visible text.
- [i18n/localized-formats](https://pseo.mikkelkrogsholm.dk/regler/i18n/localized-formats/) — Danish pages use Danish date formats.

## Distribution

- [distribution/og-image-uniqueness](https://pseo.mikkelkrogsholm.dk/regler/distribution/og-image-uniqueness/) — OG images are page-specific, not one shared fallback.

## Build-ledger

- [ledger/url-permanence](https://pseo.mikkelkrogsholm.dk/regler/ledger/url-permanence/) — No previously published URL disappears without a redirect.
- [ledger/anchor-stability](https://pseo.mikkelkrogsholm.dk/regler/ledger/anchor-stability/) — Heading anchors never disappear from a shipped page.
- [ledger/lastmod-truthfulness](https://pseo.mikkelkrogsholm.dk/regler/ledger/lastmod-truthfulness/) — lastmod advances exactly when content actually changed.
- [ledger/launch-rate](https://pseo.mikkelkrogsholm.dk/regler/ledger/launch-rate/) — New-page volume per build stays within the launch ramp.

## Servering

- [served/security-headers](https://pseo.mikkelkrogsholm.dk/regler/served/security-headers/) — The full security header suite is present.
- [served/csp-quality](https://pseo.mikkelkrogsholm.dk/regler/served/csp-quality/) — CSP contains no unsafe-inline scripts or wildcard sources.
- [served/hsts-quality](https://pseo.mikkelkrogsholm.dk/regler/served/hsts-quality/) — HSTS is preload-grade (1 year, includeSubDomains, preload).
- [served/compression](https://pseo.mikkelkrogsholm.dk/regler/served/compression/) — HTML responses are served compressed (brotli/gzip/zstd).
- [served/404-contract](https://pseo.mikkelkrogsholm.dk/regler/served/404-contract/) — Unknown paths return a real 404 status.

## Netværk og forfald

- [network/external-link-liveness](https://pseo.mikkelkrogsholm.dk/regler/network/external-link-liveness/) — External links resolve to working pages.
- [network/og-image-liveness](https://pseo.mikkelkrogsholm.dk/regler/network/og-image-liveness/) — og:image URLs serve real images.
- [network/sitemap-reality](https://pseo.mikkelkrogsholm.dk/regler/network/sitemap-reality/) — Every sitemap URL returns 200 on the live site.
- [network/security-txt](https://pseo.mikkelkrogsholm.dk/regler/network/security-txt/) — The site serves /.well-known/security.txt.
- [network/cert-expiry](https://pseo.mikkelkrogsholm.dk/regler/network/cert-expiry/) — TLS certificate has more than 21 days of validity.