3.4
Web standards
ProposedWhat quality bar does every site meet?
Specification
- WCAG 2.2 AA is the floor on every surface (criterion 4). What a static check can see is checked on every build: lang on html, one h1 and no skipped heading level, one main and a skip link, alt on every image, a name or aria-hidden on every inline SVG, text on every link, a label and autocomplete on every control. Focus (the ring), target size (24 px) and reduced motion are the shape tokens' job; contrast is proven by the colour build.
- Addresses: every page under its language (/es/, /en/, /pt/), every segment translated, lowercase ASCII with hyphens and a trailing slash; the root redirects by Accept-Language with Spanish as the fallback; x-default points at the root. Old addresses redirect permanently.
- Languages: lang equals the page's language (es, en, pt); hreflang for the three plus x-default, absolute, the page itself included; a canonical that is the page's own address. Numbers, dates and units through Intl in the page's language (es-AR, pt-BR, en): decimal comma in Spanish and Portuguese, a thin space before the unit and the %.
- SEO on indexable sites: a title of 10 to 70 characters, a description of 30 to 160, og:title, og:description, og:url and og:image (the brand's profile picture at 1200 px unless the page has its own), Organization JSON-LD on the home page with AKRIBIS Group as parentOrganization, and a sitemap with every page. Brand is noindex while it is a draft and carries everything but the sitemap.
- Budgets per page, uncompressed: HTML 200 kB, CSS 80 kB, JS 150 kB, fonts 260 kB, at most three preloaded fonts; every image with width and height; fonts only from Brand, never from a font CDN; study sheets and marks as files, not inlined.
- Consent: no third-party script loads before consent; a script from an analytics or advertising host is gated (data-consent). The default is none: where nothing tracks, no cookie notice is needed. The one analytics without consent is Cloudflare's cookieless beacon.
- The checker (brand/src/check-site.ts) runs these rules over a built site, plus the anatomy's patterns for the site's kind, lists every violation and exits with an error; this site runs it in its tests on every build, with zero violations over 175 pages; every site runs it before deploying.
- Not static, still a rule: keyboard operation of every component, visible focus, nothing lost at 400 % zoom or 320 px, motion stopped under prefers-reduced-motion, forms announcing their errors. Checked by hand on every shared component when it is built.
- Three more rules (ADR-0031, ADR-0032): pages, every shared page exists in every language at its slug; headers, the site publishes the response-header baseline in _headers (X-Content-Type-Options, Referrer-Policy, Permissions-Policy, X-Frame-Options); naming, no page writes a forbidden spelling in its text. The checker runs inside every site's build: the @akribis/site integration runs it over dist/ and one violation fails the build.
To re-reason
- Browser checks (axe, computed contrast, keyboard) in continuous integration once the sites have it: today none has CI.
- Images: formats (AVIF, WebP), srcset and the LCP's size; today no site uses astro:assets.
- Migrating today's addresses (Spanish at the root, untranslated segments) to the grammar: a redirect table per site.
Evidence to audit
- brand/standards.yaml · brand/src/check-site.ts · brand/test/site.test.ts (175 pages, 26 rules, 0 violations after the fixes this decision caused: canonical, descriptions, x-default, heading levels, inlined sheets)
- Audit (2026-10-05): hreflang on 3 of 5 sites (one always pointing at the homes), canonical on 4, sitemap on 2, JSON-LD on 2, a skip link on 1, focus styles missing on 1, Google Fonts on 1, reCAPTCHA scripts on 2, no CI, no a11y tooling, no Intl utilities; lang tags es-AR/pt-BR on 3 sites and bare codes on 2
- Audit: all five sites keep Spanish at the root (prefixDefaultLocale: false); only akribis_info translates section slugs, and keeps Spanish for legal and thank-you pages in every language
- Audit: akribis_info scripts/i18n-integrity.mjs, akleia_info scripts/check-i18n-parity.mjs, solfarma_com scripts/checks.mjs (AA contrast, no font CDN, links resolve): three partial checkers
- WCAG 2.2 (1.4.11, 2.4.11, 2.4.13, 2.5.8, 2.3.3) · llmstxt.org · schema.org Organization
- Websites/akribis_info · audit of 2026-10-06: no skip link, no _headers, reCAPTCHA and the analytics beacon without consent, 222 inline styles, an SSR adapter for static pages, 232 accepted type errors
Delivers
- The standards as data (standards.json)
- the checker any site runs over its build
- and this site as the first that meets them.
Depends on
Needed by
Decision
- ADR-0025 Set the web standards as data and check every build against them Proposed
- ADR-0031 Deliver the shared layer of every site as one Astro package with a starter, and check each build inside it Proposed
- ADR-0032 Name the shared pages in each language and check the spellings on every build Proposed
Figures
Addresses and languages
url-grammar^/[a-z0-9]+(?:/[a-z0-9-]+)*/$automatedhtml-langes, en, ptautomatedhreflangx-defaultautomatedcanonicalselfautomated
Accessibility
h11automatedheading-orderh1 → h2 → h3automatedmainmainautomatedskip-link#mainautomatedimg-altaltautomatedsvg-namedrole="img" | aria-hiddenautomatedlink-texttext | aria-labelautomatedcontrols-labelledlabelautomatedautocompletename, email, tel, organizationautomatedfocus-visible--focus-ringmanualtarget-size24 pxmanualreduced-motion--duration-* → 0manual
SEO
title10–70automateddescription30–160automatedopen-graphog:title, og:description, og:image, og:urlautomatedstructured-dataOrganizationautomatedsitemapsitemap.xmlautomated
Budgets per page, uncompressed
budget-html200 kBautomatedbudget-css80 kBautomatedbudget-js150 kBautomatedbudget-fonts260 kBautomatedpreloads≤ 3automatedimg-dimensionswidth, heightautomatedremote-fontsfonts.googleapis.com, fonts.gstatic.com, use.typekit.netautomated
Consent
consentgoogletagmanager.com, google-analytics.com, connect.facebook.net, hotjar.com, clarity.ms, doubleclick.net, cloudflareinsights.comautomated
Pages and headers
pages/<lang>/<slug>/ · /404.htmlautomatedheadersX-Content-Type-Options, Referrer-Policy, Permissions-Policy, X-Frame-Optionsautomated
Naming
namingSOL FARMA · Sol Farma · Sol-Farma · AKIOT · Akiot · AKRIBIS · One · AKRIBIS·One · AKRIBIS ONE · Akribis One · Parte de AKRIBISautomated
pnpm check runs the checker over the built site; one violation fails the build. Any site: node brand/src/check-site.ts dist