Opquast Digital Quality Best Practices
Canonical source: examples/OPQUAST_DIGITAL_QUALITY_BEST_PRACTICES.md in mgifford/ACCESSIBILITY.md
This skill is derived from that file. When in doubt, the example is authoritative.
Apply the Opquast Digital Quality Checklist
(Version 5, 2025-2030) when building or reviewing web projects. The framework
contains 245 rules across 14 categories covering content, privacy, e-commerce,
forms, accessibility, security, performance, and more.
Rules are published under Creative Commons BY-SA 4.0.
Agents may reference and cite rule text; attribute Opquast and respect the
ShareAlike licence — derivatives must use the same licence.
See opquast.com for the authoritative source.
Severity Scale (this skill)
| Level | Meaning |
|---|
| Critical | Completely blocks access, purchase, or task completion for a user group |
| Serious | Significantly impairs access or usability; workaround unreasonable to expect |
| Moderate | Creates friction; workaround available but burdensome |
| Minor | Best-practice gap; marginal impact |
Category-level severity guidance:
- Security failures (HTTPS, headers, passwords): Critical to Serious
- Forms failures (labels, error handling): Critical to Serious
- Navigation failures (keyboard, focus): Critical to Serious
- Images/Media missing alt/captions: Critical
- Privacy policy missing: Serious
- Presentation contrast: Serious; zoom blocked: Serious
- Content, Links, Identification: Moderate to Minor in most cases
- Server/Performance, Newsletter, Internationalisation: Minor in most cases
When to Use This Skill
- Building a new website or web application
- Reviewing or auditing an existing site for quality
- Implementing accessibility, security, or privacy features
- Creating e-commerce flows, forms, or navigation systems
- Generating HTML/CSS code that must meet quality standards
Quick Reference by Category (245 rules across 14 categories)
| Category | Rules | Key Requirements |
|---|
| Content | 1–14 | Metadata (description + OG tags), explicit dates, <abbr> for acronyms, data tables for charts, labelled ads, moderation/abuse-report mechanisms |
| Personal Data / Privacy | 15–29 | Privacy link in footer, documented data access/modification process, no third-party-only login, generic auth-failure messages, Referrer-Policy, HTTPS for sensitive data, no sensitive data in URLs |
| E-Commerce | 30–68 | No pre-checked opt-ins, availability/delivery time/cost before checkout, explicit pricing incl. tax, two+ payment methods, order confirmation email, invoices online |
| Forms | 69–98 | <label for="...">, format/case-sensitivity hints, required indicated in text, password strength + show/hide, aria-invalid, aria-describedby, preserve data on error, correct input type/autocomplete, paste not blocked, disabled buttons not aria-hidden |
| Identification | 99–115 | Unique page titles (Page | Site), lang attribute, favicon, address/phone in footer, two+ contact methods, response-time/hours stated |
| Images/Media | 116–127 | Meaningful alt, empty alt="" for decorative, image-link alt describes destination, transcripts + synchronised captions, no autoplay, pausable media |
| Internationalisation | 128–135 | International dialling codes, country in addresses, hreflang/visible language indicator, lang on <html> and inline changes, translated-language link labels |
| Links | 136–152 | Descriptive anchor text (no "click here"), tel: protocol, new-tab warning, file type + size for downloads, no broken internal links |
| Navigation | 153–172 | Public content without forced login, no nav pop-ups, homepage link, breadcrumbs, consistent nav placement, visible icon labels, skip links, visible :focus-visible, logical tab order, internal search, sitemap |
| Newsletter | 173–179 | Confirmed opt-in, unsubscribe link, one-click unsubscribe, archives online, stated frequency |
| Presentation | 180–196 | Consistent visual identity, no colour-only info, contrast 4.5:1 normal / 3:1 large text, meaning survives with styles off, 24×24px+ touch targets, no zoom blocking, responsive layout, print styles |
| Security | 197–217 | HTTPS everywhere + HSTS, no mixed content, self-service password reset, no plain-text passwords, X-Content-Type-Options, X-Frame-Options/frame-ancestors, CSP, SRI on third-party scripts, no exposed server versions, SPF/DKIM/DMARC |
| Server/Performance | 218–230 | robots.txt, sitemap.xml, proper 404 status (not 200), custom error page with nav, gzip/Brotli, cache-control headers, minified CSS/JS |
| Structure/Code | 231–244 | Machine-readable dates (<time datetime>), UTF-8, unique IDs, no meta refresh, heading hierarchy h1>h2>h3, tagged (not scanned) PDFs, <caption>/<th scope> on data tables |
Workflow
1. Identify Applicable Categories
Not all 14 categories apply to every project:
- All web projects: Content, Forms, Identification, Images/Media, Links,
Navigation, Presentation, Security, Server/Performance, Structure/Code
- Add if applicable: E-Commerce (online sales), Newsletter (email marketing),
Internationalisation (multi-language), Personal Data/Privacy (user accounts/data collection)
2. Consult the Full Rule Text
For the complete rule text, code examples, and rule numbers, consult the
canonical Opquast guide
or the official checklist
directly — this skill summarizes the categories and highest-value patterns
rather than reproducing all 245 rules verbatim.
3. Apply During Development
When generating or reviewing code, apply rules as implementation requirements:
- HTML generation: Include metadata, semantic structure, accessible forms,
proper alt text
- CSS generation: Ensure contrast ratios, focus styles, responsive layout,
print styles
- Server configuration: Set security headers, enable compression, configure
caching
- Content review: Check date formats, link text, abbreviation expansion
4. Validate
After implementation, verify against applicable rules. Common automated checks:
- HTML validation and heading hierarchy
- Colour contrast ratios (4.5:1 normal text, 3:1 large text)
- Missing
alt attributes
- Missing form labels
- Security headers present
- Broken internal links
Essential Code Patterns
Page Template Minimum
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Page description here." />
<meta property="og:title" content="Page Title | Site Name" />
<meta property="og:description" content="Page description for sharing." />
<title>Page Title | Site Name</title>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
</head>
<body>
<a href="#main" class="skip-link">Skip to main content</a>
<nav aria-label="Main navigation"><!-- ... --></nav>
<main id="main"><!-- ... --></main>
<footer>
<a href="/privacy">Privacy Policy</a>
<a href="/terms">Terms of Use</a>
</footer>
</body>
</html>
Accessible Form Field
Use native required on native inputs. aria-required is redundant when
required is present and should be omitted to avoid accessibility tree noise
(rule 98 principle: don't add ARIA states that duplicate native semantics).
Use aria-required only on custom widgets (role="combobox" etc.). Also
indicate required state in visible text — an asterisk alone is insufficient
unless the convention is explained (rule 71).
<label for="email">
Email address <span aria-hidden="true">*</span> <span class="hint">(required)</span>
<span class="hint" id="email-hint">Example: user@example.com</span>
</label>
<input id="email" type="email" autocomplete="email"
required aria-describedby="email-hint" />
Password Field (rules 75–76, 202–205)
<label for="password">Password</label>
<div class="password-wrapper">
<input id="password" type="password" aria-describedby="password-hint" />
<button type="button" aria-controls="password" aria-pressed="false">
Show password
</button>
</div>
Security Headers (Server Config)
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: default-src 'self';
Referrer-Policy: strict-origin-when-cross-origin
Do not expose server software versions in response headers (rule 213) —
remove or obfuscate Server and X-Powered-By. Apply Subresource Integrity
to third-party scripts/stylesheets (rule 214):
<script src="https://cdn.example.com/library.min.js"
integrity="sha384-<hash>" crossorigin="anonymous"></script>
Focus and Contrast Styles
:focus-visible {
outline: 3px solid #005fcc;
outline-offset: 2px;
}
body {
color: #1a1a1a; /* ~16:1 contrast on white */
background: #ffffff;
}
Print Styles
@media print {
nav, header, footer, .sidebar, .no-print { display: none; }
body { font-size: 12pt; color: #000; }
a[href]::after { content: " (" attr(href) ")"; }
}
Accessible Data Table (rules 242–243)
<table>
<caption>Quarterly revenue by region (USD thousands)</caption>
<thead>
<tr><th scope="col">Region</th><th scope="col">Q1</th></tr>
</thead>
<tbody>
<tr><th scope="row">North America</th><td>1,200</td></tr>
</tbody>
</table>
WCAG Relationship
Opquast complements WCAG 2.2 rather than replacing it. Key mappings:
| Opquast Rules | WCAG Criteria |
|---|
116 (decorative images alt="") | 1.1.1 Non-text Content (A) |
| 117-118 (meaningful alt text) | 1.1.1 Non-text Content (A) |
| 121-122 (transcripts, captions) | 1.2.2, 1.2.3, 1.2.5 |
| 124-127 (no autoplay, pausable) | 1.4.2, 2.2.2 |
| 131-132 (lang attribute) | 3.1.1, 3.1.2 |
| 164 (skip links) | 2.4.1 Bypass Blocks (A) |
| 165 (focus visible) | 2.4.7, 2.4.11 Focus Visible/Appearance |
| 166 (keyboard operable) | 2.1.1 Keyboard (A) |
| 167 (logical tab order) | 2.4.3 Focus Order (A) |
| 181 (not colour alone) | 1.4.1 Use of Color (A) |
| 182 (contrast) | 1.4.3, 1.4.6, 1.4.11 Contrast |
| 186 (touch targets 24×24px min) | 2.5.8 Target Size Minimum (AA, WCAG 2.2) |
| 193 (no zoom block) | 1.4.4 Resize Text (AA) |
| 69-70 (labels, instructions) | 1.3.1, 3.3.2 |
| 79-80 (error identification) | 3.3.1, 3.3.3 |
Use Opquast as a holistic quality baseline and layer WCAG testing for full
accessibility compliance.
Sustainability Connection
Several Opquast categories directly align with
SUSTAINABILITY.md and the
Web Sustainability Guidelines:
- Server/Performance (rules 226-230): compression, caching, minification —
directly reduce data transfer and energy per page view
- Presentation (rule 193): not blocking zoom; (rule 194): responsive layout —
reduce need for separate mobile sites
- Structure/Code (rule 239): no meta refresh — avoids unnecessary page reloads
When applying Opquast Server/Performance rules, cross-reference with
SUSTAINABILITY.md for additional guidance on carbon-aware delivery and
asset optimisation.
Definition of Done Checklist
Apply to every project; skip categories not in scope:
Content & Identification
Forms
Images & Media
Navigation & Keyboard
Presentation
Security
Server/Performance
Structure/Code
Key WCAG Criteria
See WCAG relationship table above. Opquast covers all of WCAG 2.2 AA and
extends well beyond it into security, privacy, e-commerce, and performance.
References
Standards horizon: These rules target WCAG 2.2 AA alongside Opquast v5
(2025-2030). WCAG 3.0 is in development.
Monitor: https://www.w3.org/TR/wcag-3.0/