A page could pass every Hard Gate and still be unusable. The gate checked contrast and keyboard focus, and nothing else a person needs to perceive and operate the page. The performance side stopped at "no invented numbers" and never asked for the mechanisms that keep a page fast.
Two rules join the gate
- R-39 Accessible Semantics & Interaction Affordances. Every enabled control gets
cursor: pointer, a native element, an accessible name, and distinct hover, active, and disabled states. Every image getsalt, every field a visible label, and motion respectsprefers-reduced-motion. Page-level semantics (lang,<title>, landmarks, oneh1, no zoom ban) apply only when the task produces a whole document, never to a single component. The depth lives inantislop-human. - R-40 Performance Mechanisms. Media carries dimensions, the hero image is never lazy loaded and is marked
fetchpriority="high", no third-party script blocks render in<head>, and no performance number is reported without a measurement. The depth lives inantislop-ui.
LCP, INP, and CLS thresholds are field data from real visits, which the agent writing the page does not have, so they stay out of the gate. They live in references/CORE-WEB-VITALS.md, read when a real measurement exists.
References, read on demand
antislop-human gains WCAG 2.2 and copy-ready accessibility patterns. antislop-ui gains Core Web Vitals and an optional page baseline: doctype, mixed content, client secrets, unpinned third-party scripts. Page basics and security were first proposed as a third gate rule. They ship as a checklist instead, run when the task asks for a production-ready page.
The reference material is adapted from the MIT-licensed web-quality-skills by Addy Osmani, and the license sits beside it in both skills. Nothing loads until a rule points at it, so the always-loaded files grow by about 3 KB in the core, 2.6 KB in antislop-ui, and 4.7 KB in antislop-human.
Also in this release
- Every WCAG 2.2 success criterion is listed by level: 31 A, 24 AA, 31 AAA.
- The modal, error-summary, and live-region snippets in the accessibility reference run as written. Each one defines what it uses.
- The cursor base layer covers a label that wraps its checkbox or radio, not only
label[for]. - The picker hints, the skill catalogue in the guide, and the README skills table name the new depth.
Updating is unchanged:
npx antislop-ai --updateA plugin keeps its own copy, so update it through the agent that installed it. Skills load when a session starts, so start a new one afterwards. Full detail is in the ROADMAP. Thanks to @habibiahmada for #46, and to @fajarhide for the review that cut three rules to two and moved the field thresholds out of the gate.