ultra11y 5.22.1 → 5.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@
10
10
  "name": "ultra11y",
11
11
  "source": "./",
12
12
  "description": "Automatic accessibility review of the code under change before every commit, push and pull request, plus full WCAG 2.2 AA / RGAA audits and conformance deliverables on demand.",
13
- "version": "5.22.1",
13
+ "version": "5.23.0",
14
14
  "author": { "name": "maxgfr" },
15
15
  "homepage": "https://github.com/maxgfr/ultra11y",
16
16
  "repository": "https://github.com/maxgfr/ultra11y",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ultra11y",
3
3
  "description": "Accessibility for WCAG 2.2 AA and country standards (RGAA…): an automatic review of the code under change before every commit, push and pull request, plus full audits and conformance deliverables on demand.",
4
- "version": "5.22.1",
4
+ "version": "5.23.0",
5
5
  "author": { "name": "maxgfr" },
6
6
  "homepage": "https://github.com/maxgfr/ultra11y",
7
7
  "repository": "https://github.com/maxgfr/ultra11y",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ultra11y",
3
3
  "description": "Accessibility for WCAG 2.2 AA and country standards (RGAA…): an automatic review of the code under change before every commit, push and pull request, plus full audits and conformance deliverables on demand.",
4
- "version": "5.22.1",
4
+ "version": "5.23.0",
5
5
  "author": { "name": "maxgfr", "url": "https://github.com/maxgfr" },
6
6
  "homepage": "https://github.com/maxgfr/ultra11y",
7
7
  "repository": "https://github.com/maxgfr/ultra11y",
@@ -27,7 +27,7 @@ import { fileURLToPath } from "node:url";
27
27
  // Ownership marker: `ultra11y install --opencode` refuses to overwrite a plugin file that
28
28
  // does not carry it, so a user's own ultra11y.js is never clobbered.
29
29
  const ULTRA11Y_OPENCODE_PLUGIN = "ULTRA11Y_OPENCODE_PLUGIN";
30
- const ULTRA11Y_PLUGIN_VERSION = "5.22.1";
30
+ const ULTRA11Y_PLUGIN_VERSION = "5.23.0";
31
31
 
32
32
  const here = dirname(fileURLToPath(import.meta.url));
33
33
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ultra11y",
3
- "version": "5.22.1",
3
+ "version": "5.23.0",
4
4
  "description": "Audit HTML/CSS/JSX against WCAG 2.2 AA and produce a dated compliance report, or author/review accessible markup (native-HTML-first). A skills.sh agent skill: an install-free static engine (bundled, no npm install) plus the agent's judgment, with check/verify gates against hallucinated non-conformities, and pluggable in-repo standards packs (RGAA France first; Section 508 & EN 301 549 next).",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.33.0",
@@ -377,6 +377,42 @@ async function main() {
377
377
  fr: 'Utilisez dir="rtl" ou dir="ltr" (ou dir="auto"), en accord avec le sens de lecture du texte porté.',
378
378
  },
379
379
  },
380
+ // RGAA 8.1 — « chaque page web est-elle définie par un type de document ? » THE criterion
381
+ // no engine could reach: it maps only onto WCAG 4.1.1, which WCAG 2.2 REMOVED, so
382
+ // `derivePackResults` classed it out of scope and left it « à évaluer » on every page of
383
+ // every run — the one criterion of the 106 that no measurement could ever close and only a
384
+ // model could. Measured on a real RGAA deliverable: a grid that sat at 105/106.
385
+ //
386
+ // Its subject is not an element, which is why no element rule could express it: the
387
+ // doctype is not part of `documentElement.outerHTML`. The collector records it beside the
388
+ // DOM (SnapshotMeta.doctype), and this DOCUMENT-level rule reads it there.
389
+ //
390
+ // WHAT IT DECIDES, AND WHAT IT DOES NOT. Test 8.1.1 (is a doctype present?) is the whole
391
+ // of it. 8.1.2 (is it valid?) and 8.1.3 (is it before <html>?) are not tested separately
392
+ // and deliberately so: a doctype the browser PARSED — which is the only kind that reaches
393
+ // `document.doctype` — is by construction well-formed and positioned ahead of the root
394
+ // element; one written after <html>, or malformed, is ignored by the parser and arrives
395
+ // here as the recorded empty string, i.e. as the absence this rule reports. Inventing a
396
+ // separate "invalid" verdict would mean guessing at legacy but legitimate declarations,
397
+ // and manufacturing a non-conformity is the one thing this tier must not do.
398
+ //
399
+ // NORMATIVE, and signal-gated: it fires only where a capture recorded the field, so a
400
+ // source file and a pre-field capture are both silence rather than a failure.
401
+ {
402
+ id: "doctype-missing",
403
+ criterion: "8.1",
404
+ wcag: ["4.1.1"],
405
+ severity: "majeur",
406
+ doc: { signal: "doctype", op: "absent" },
407
+ message: {
408
+ en: "The captured page declares no document type — the browser parsed no <!DOCTYPE> ahead of <html> (RGAA test 8.1.1).",
409
+ fr: "La page capturée ne déclare aucun type de document — le navigateur n’a analysé aucun <!DOCTYPE> avant <html> (test RGAA 8.1.1).",
410
+ },
411
+ remediation: {
412
+ en: "Emit <!DOCTYPE html> as the first line of the document, before <html>. A doctype placed after <html>, or malformed, is ignored by the parser and counts as absent.",
413
+ fr: "Émettez <!DOCTYPE html> en première ligne du document, avant <html>. Un doctype placé après <html>, ou malformé, est ignoré par l’analyseur et compte comme absent.",
414
+ },
415
+ },
380
416
  ];
381
417
  // Wire each rule's namespaced id (`pack:rgaa:<id>`) into the criterion it reports under,
382
418
  // so derivePackResults routes its finding onto that criterion through the same