Le relevé automatisé des non-conformités RGAA d'un site, rattachées aux critères numérotés du référentiel. Un audit dit où vous en étiez ; un relevé dit où vous en êtes, à chaque déploiement.
Un relevé n'est pas un audit et ne conclut jamais à la conformité : seul l'examen humain des 106 critères du RGAA en est capable (ADR-0002). Ce que le relevé donne, c'est un constat opposable sur la part du référentiel qu'une machine peut vérifier, et il dit toujours quelle part elle n'a pas regardée.
Deux faces, un seul moteur : l'analyse publique gratuite sur attestable.fr, et le contrôle en intégration continue documenté ici.
pnpm install
pnpm --filter @attestable/moteur exec playwright install --with-deps chromium
node packages/moteur/src/cli.ts releve https://exemple.fr --fail-on=criticalNode 22.18 ou plus récent : la CLI est du TypeScript exécuté directement. Une
fois le paquet lié, la commande s'appelle attestable releve <url>.
L'adresse d'accueil suffit, le périmètre en est déduit : les pages que déclare
sitemap.xml s'il existe, sinon celles atteignables depuis l'URL de départ
jusqu'à trois niveaux de liens, avec un plafond de 20 pages. Le robots.txt du
site est respecté.
La sortie donne le score de conformité, la part du référentiel laissée non examinée, puis chaque non-conformité constatée avec sa gravité, son critère RGAA, la règle axe qui l'a produite, son nombre d'occurrences et les pages où elle apparaît.
--fail-on nomme la gravité à partir de laquelle le relevé fait échouer le
contrôle. Le seuil est absolu : il nomme une gravité et ne se compare jamais
à un relevé antérieur, donc un site déjà fautif ne passe pas au motif qu'il ne
s'est pas dégradé.
| Seuil | Fait échouer |
|---|---|
critical |
les non-conformités critiques |
major |
les critiques et les majeures |
minor |
les critiques, les majeures, les mineures |
none |
rien : le relevé est rendu, sans verdict |
La décision lit des gravités, jamais des quantités : une seule non-conformité
critique fait échouer un seuil critical, et cinq cents mineures ne le font pas.
Le défaut de la CLI est none, celui de l'Action critical.
| Code | Sens | Ce qu'il faut en faire |
|---|---|---|
0 |
Relevé rendu, seuil non atteint | Laisser passer |
1 |
Relevé rendu, seuil atteint | Bloquer : le site viole le référentiel |
2 |
Aucun relevé n'a pu être produit | Avertir, ne pas bloquer : rien n'a été vérifié |
Les codes 1 et 2 sont distincts par construction. Un 1 est un constat sur
le site ; un 2 est un constat sur le relevé — usage invalide, seuil inconnu,
site injoignable, authentification requise, ou robots.txt qui interdit le
crawl. Une panne réseau ne doit pas bloquer une mise en production, et un site
interdit n'est pas un site fautif.
node packages/moteur/src/cli.ts releve "$SITE" --fail-on=critical
case $? in
0) ;;
1) echo "Seuil atteint" ; exit 1 ;;
2) echo "Relevé impossible : le seuil n'a pas été vérifié" ;;
esacname: Accessibilité
on: [push]
jobs:
releve:
runs-on: ubuntu-latest
steps:
- uses: floperrier/attestable@v1
with:
site: https://exemple.fr
fail_on: critical| Entrée | Requise | Défaut | Sens |
|---|---|---|---|
site |
oui | — | URL de départ ; le périmètre en est déduit |
fail_on |
non | critical |
Le seuil de gravité, ou none |
L'Action reprend la distinction des codes de sortie : un seuil atteint fait
échouer le job, tandis qu'un relevé impossible est rendu en ::warning et laisse
le build passer, en disant que le seuil n'a pas été vérifié.
L'étiquette @v1 suit les versions compatibles ; @main résout aussi, au prix
de ce qui vient d'y être poussé.
Les services que le produit consomme s'installent une fois, et plusieurs de ces étapes ne peuvent être faites que par un humain devant un navigateur : acheter le domaine, vérifier un domaine d'envoi, lier une facturation.
./scripts/setup.shLe script ouvre chaque page au bon endroit, dit quoi y faire, et écrit ce qu'il
récolte dans packages/app/.env — c'est le fichier que Next lit, et dont le
worker lancé depuis l'application hérite. Il est relançable : chaque valeur déjà
présente est proposée par défaut, et rien n'est créé deux fois.
| Variable | Lue par |
|---|---|
DATABASE_URL |
l'application et le worker |
RESEND_API_KEY |
l'annonce du relevé par email |
APP_URL |
le lien vers le rapport, dans l'email |
CRAWL_JOB |
le job Cloud Run à déclencher, absent en développement |
CRAWL_JOB_AUDIENCE, CRAWL_JOB_ACCOUNT |
la fédération qui autorise ce déclenchement (ADR-0008) |
Sans RESEND_API_KEY ni APP_URL, le relevé est produit et enregistré : il
n'est simplement pas annoncé. Sans CRAWL_JOB, l'application lance le worker
d'à côté au lieu du job Cloud Run — c'est ce qu'une machine de développement
fait, et il n'y a rien à configurer pour ça.
| Paquet | Rôle |
|---|---|
packages/moteur |
Le moteur, la CLI et le worker de crawl |
packages/app |
L'application : formulaire, progression, rapport |
packages/vitrine |
Le site vitrine |
pnpm test # tous les paquets
pnpm typecheck
pnpm dev # l'application
pnpm vitrine # le site vitrine
pnpm worker # consomme le plus ancien relevé en attenteCONTEXT.md porte le vocabulaire du projet, contraint par le référentiel et par
le contrôle administratif ; docs/adr/ porte les décisions difficiles à
revenir dessus, dont la définition du score et le refus de conclure.
FSL-1.1-ALv2 : la Functional Source License, avec bascule en Apache 2.0 au deuxième anniversaire de chaque version. Lire, modifier, exécuter, relever ses propres sites et ceux de ses clients : tout cela est permis. Ce qui ne l'est pas, c'est en faire un service concurrent de celui-ci.
Le choix suit ce que le projet vend, qui n'est pas le code : le service hébergé, la surveillance continue, et la table de correspondance tenue à jour au fil des versions du RGAA et d'axe-core.