De quoi il s'agit
Le garde-fou local (yarn check) et le garde-fou d'intégration (.github/workflows/ci.yml) doivent
vérifier la même chose, pour qu'un yarn check vert ne puisse jamais casser la CI et réciproquement.
yarn check est le critère bloquant écrit noir sur blanc dans #10, #12 et #18, et CLAUDE.md le
présente comme « lint + format + typecheck + test + build sur tous les projets ».
La situation a évolué depuis la rédaction initiale de ce draft. À l'état 74bc516 relevé alors,
ni l'un ni l'autre n'était un sur-ensemble de l'autre. Depuis, le commit 9e4aa72 (#40, align the
check gate with CI on format and typecheck) a ajouté oxfmt --check et typecheck à yarn check.
Il ne reste donc qu'un seul écart : la CI ne lance pas build.
État actuel (HEAD 9e4aa72)
yarn check (package.json) :
oxlint --type-aware && oxfmt --check && nx run-many -t lint typecheck test build
Étape Checks de la CI (.github/workflows/ci.yml) :
yarn oxlint --type-aware
yarn format:check
yarn nx affected -t lint typecheck test
| Vérification |
yarn check (run-many, tous projets) |
CI (nx affected) |
oxlint --type-aware |
✅ |
✅ |
oxfmt --check |
✅ |
✅ |
| lint (ESLint, frontières Nx) |
✅ |
✅ |
typecheck |
✅ |
✅ |
test |
✅ |
✅ |
build |
✅ |
❌ |
yarn check est désormais un sur-ensemble de la CI. La seule différence assumée qui subsiste est
la sélection des projets — run-many (tout) en local, affected en CI — et c'est le bon choix :
inutile de passer la CI en run-many (voir Hors périmètre).
Le seul écart restant : build absent de la CI
Conséquence concrète : une CI verte peut casser le build. targetDefaults.test porte
dependsOn: ["^build"] (nx.json) — les dépendances d'un projet sont donc bâties avant ses
tests, mais le projet lui-même ne l'est jamais en CI. Une régression propre au build (config
vite.config.mts cassée, lib qui ne compile pas via tsc) passe l'intégration et n'est rattrapée
que par un yarn check local — que rien n'impose de lancer — ou plus tard au déploiement. C'est
exactement le prérequis que #32 (pipeline de build/push d'image) suppose réglé ici et ne veut pas
dupliquer.
Décisions à acter
- Garantie de non-divergence.
run-many et affected interdisent une commande unique, mais la
liste des cibles Nx (lint typecheck test build) et les deux étapes Oxc doivent rester
identiques des deux côtés. Approche recommandée : un garde-fou exécutable qui échoue si les deux
listes divergent, dans l'esprit du check « toolchain pins agree » déjà présent dans ci.yml
(lignes 84-117). Option minimale : un commentaire croisé explicite dans les deux fichiers.
À trancher.
- Coût du job. Ajouter
build à nx affected allonge le job check ; le surcoût est à mesurer
(avant/après, sur un affected non trivial) et à juger acceptable.
Critères d'acceptation
Découpage en tâches
- Ajouter
build à la commande nx affected de l'étape Checks dans .github/workflows/ci.yml.
- Mettre en place la garantie de non-divergence retenue (garde-fou exécutable de préférence).
- Mettre à jour
CLAUDE.md (section La CI… : ajouter build à la liste) et le README si besoin.
- Vérifier le garde-fou par un rouge/vert jetable (build cassé → CI rouge → réparé → CI verte).
- Mesurer et reporter le surcoût du job.
Hors périmètre
Dépendances
Aucune : package.json (scripts) et .github/workflows/ci.yml. Recoupe #21 (automate de mise à
jour des dépendances) sur le fichier CI, sans dépendance logique — #21 s'appuiera sur un garde-fou
correct, donc autant faire celle-ci d'abord.
Références
package.json (script check), .github/workflows/ci.yml (étape Checks, et le check
« toolchain pins agree » comme modèle de garde-fou), nx.json (targetDefaults, plugins),
ADR 0007 (Vite/Vitest partout), ADR 0008 (oxlint/oxfmt, ESLint réduit aux frontières),
CLAUDE.md (sections Commandes et CI), #40 (a déjà aligné format:check et typecheck),
#32 (consommateur du build vérifié en CI).
De quoi il s'agit
Le garde-fou local (
yarn check) et le garde-fou d'intégration (.github/workflows/ci.yml) doiventvérifier la même chose, pour qu'un
yarn checkvert ne puisse jamais casser la CI et réciproquement.yarn checkest le critère bloquant écrit noir sur blanc dans #10, #12 et #18, etCLAUDE.mdleprésente comme « lint + format + typecheck + test + build sur tous les projets ».
La situation a évolué depuis la rédaction initiale de ce draft. À l'état
74bc516relevé alors,ni l'un ni l'autre n'était un sur-ensemble de l'autre. Depuis, le commit
9e4aa72(#40, align thecheck gate with CI on format and typecheck) a ajouté
oxfmt --checkettypecheckàyarn check.Il ne reste donc qu'un seul écart : la CI ne lance pas
build.État actuel (HEAD
9e4aa72)yarn check(package.json) :Étape Checks de la CI (
.github/workflows/ci.yml) :yarn check(run-many, tous projets)nx affected)oxlint --type-awareoxfmt --checktypechecktestbuildyarn checkest désormais un sur-ensemble de la CI. La seule différence assumée qui subsiste estla sélection des projets —
run-many(tout) en local,affecteden CI — et c'est le bon choix :inutile de passer la CI en
run-many(voir Hors périmètre).Le seul écart restant :
buildabsent de la CIConséquence concrète : une CI verte peut casser le
build.targetDefaults.testportedependsOn: ["^build"](nx.json) — les dépendances d'un projet sont donc bâties avant sestests, mais le projet lui-même ne l'est jamais en CI. Une régression propre au build (config
vite.config.mtscassée, lib qui ne compile pas viatsc) passe l'intégration et n'est rattrapéeque par un
yarn checklocal — que rien n'impose de lancer — ou plus tard au déploiement. C'estexactement le prérequis que #32 (pipeline de build/push d'image) suppose réglé ici et ne veut pas
dupliquer.
Décisions à acter
run-manyetaffectedinterdisent une commande unique, mais laliste des cibles Nx (
lint typecheck test build) et les deux étapes Oxc doivent resteridentiques des deux côtés. Approche recommandée : un garde-fou exécutable qui échoue si les deux
listes divergent, dans l'esprit du check « toolchain pins agree » déjà présent dans
ci.yml(lignes 84-117). Option minimale : un commentaire croisé explicite dans les deux fichiers.
À trancher.
buildànx affectedallonge le job check ; le surcoût est à mesurer(avant/après, sur un
affectednon trivial) et à juger acceptable.Critères d'acceptation
build:yarn nx affected -t lint typecheck test build.yarn checket la CI ; seule lasélection des projets (
run-manyvsaffected) diffère, et c'est documenté.minima commentaire croisé — selon la décision actée ci-dessus).
CLAUDE.md(importinterdit,
voidmanquant) : casser unbuild(ex. erreur dans unvite.config.mtsou unelib) et constater que la CI échoue là où elle passait ; réparer, la CI repasse au vert.
CLAUDE.md(section CI) est mis à jour :nx affected -t lint typecheck test build.Découpage en tâches
buildà la commandenx affectedde l'étape Checks dans.github/workflows/ci.yml.CLAUDE.md(section La CI… : ajouterbuildà la liste) et le README si besoin.Hors périmètre
run-many. Le choixaffectedest le bon (base calculée parnrwl/nx-set-shas) — non rouvert ici.«
buildvérifié en CI » sans le dupliquer.terraformbloquant / requis — c'est le constat annexe de ci(infra): instruire l'automatisation du terraform plan/apply — plan relu, apply derrière approbation #33.Dépendances
Aucune :
package.json(scripts) et.github/workflows/ci.yml. Recoupe #21 (automate de mise àjour des dépendances) sur le fichier CI, sans dépendance logique — #21 s'appuiera sur un garde-fou
correct, donc autant faire celle-ci d'abord.
Références
package.json(scriptcheck),.github/workflows/ci.yml(étape Checks, et le check« toolchain pins agree » comme modèle de garde-fou),
nx.json(targetDefaults, plugins),ADR 0007 (Vite/Vitest partout), ADR 0008 (oxlint/oxfmt, ESLint réduit aux frontières),
CLAUDE.md(sections Commandes et CI), #40 (a déjà alignéformat:checkettypecheck),#32 (consommateur du
buildvérifié en CI).