eqs check déclare une tâche knip que personne n'installe : le détecteur de code mort est éteint dans tous les satellites #51
Closed
opened 2026-09-10 13:14:19 +00:00 by nicolas-fryder
·
2 comments
No Branch/Tag specified
main
dev
@eqs/tooling@0.24.3
@eqs/testing@0.24.3
@eqs/telemetry@0.24.3
@eqs/platform-next@0.24.3
@eqs/platform-nest@0.24.3
@eqs/http@0.24.3
@eqs/errors@0.24.3
@eqs/config@0.24.3
@eqs/cli@0.24.3
@eqs/auth@0.24.3
@eqs/tooling@0.24.2
@eqs/testing@0.24.2
@eqs/telemetry@0.24.2
@eqs/platform-next@0.24.2
@eqs/platform-nest@0.24.2
@eqs/http@0.24.2
@eqs/errors@0.24.2
@eqs/config@0.24.2
@eqs/cli@0.24.2
@eqs/auth@0.24.2
@eqs/tooling@0.24.1
@eqs/testing@0.24.1
@eqs/telemetry@0.24.1
@eqs/platform-next@0.24.1
@eqs/platform-nest@0.24.1
@eqs/http@0.24.1
@eqs/errors@0.24.1
@eqs/config@0.24.1
@eqs/cli@0.24.1
@eqs/auth@0.24.1
@eqs/tooling@0.24.0
@eqs/testing@0.24.0
@eqs/telemetry@0.24.0
@eqs/platform-next@0.24.0
@eqs/platform-nest@0.24.0
@eqs/http@0.24.0
@eqs/errors@0.24.0
@eqs/config@0.24.0
@eqs/cli@0.24.0
@eqs/auth@0.24.0
@eqs/tooling@0.23.0
@eqs/testing@0.23.0
@eqs/telemetry@0.23.0
@eqs/platform-next@0.23.0
@eqs/platform-nest@0.23.0
@eqs/http@0.23.0
@eqs/errors@0.23.0
@eqs/config@0.23.0
@eqs/cli@0.23.0
@eqs/auth@0.23.0
@eqs/tooling@0.22.0
@eqs/testing@0.22.0
@eqs/telemetry@0.22.0
@eqs/platform-next@0.22.0
@eqs/platform-nest@0.22.0
@eqs/http@0.22.0
@eqs/errors@0.22.0
@eqs/config@0.22.0
@eqs/cli@0.22.0
@eqs/auth@0.22.0
@eqs/tooling@0.21.0
@eqs/testing@0.21.0
@eqs/telemetry@0.21.0
@eqs/platform-next@0.21.0
@eqs/platform-nest@0.21.0
@eqs/http@0.21.0
@eqs/errors@0.21.0
@eqs/config@0.21.0
@eqs/cli@0.21.0
@eqs/auth@0.21.0
@eqs/tooling@0.20.0
@eqs/testing@0.20.0
@eqs/telemetry@0.20.0
@eqs/platform-next@0.20.0
@eqs/platform-nest@0.20.0
@eqs/http@0.20.0
@eqs/errors@0.20.0
@eqs/config@0.20.0
@eqs/cli@0.20.0
@eqs/auth@0.20.0
@eqs/tooling@0.19.0
@eqs/testing@0.19.0
@eqs/telemetry@0.19.0
@eqs/platform-next@0.19.0
@eqs/platform-nest@0.19.0
@eqs/http@0.19.0
@eqs/errors@0.19.0
@eqs/config@0.19.0
@eqs/cli@0.19.0
@eqs/auth@0.19.0
@eqs/tooling@0.17.1
@eqs/testing@0.17.1
@eqs/telemetry@0.17.1
@eqs/platform-next@0.17.1
@eqs/platform-nest@0.17.1
@eqs/http@0.17.1
@eqs/errors@0.17.1
@eqs/config@0.17.1
@eqs/cli@0.17.1
@eqs/auth@0.17.1
@eqs/tooling@0.17.0
@eqs/testing@0.17.0
@eqs/telemetry@0.17.0
@eqs/platform-next@0.17.0
@eqs/platform-nest@0.17.0
@eqs/http@0.17.0
@eqs/errors@0.17.0
@eqs/config@0.17.0
@eqs/cli@0.17.0
@eqs/auth@0.17.0
@eqs/tooling@0.16.0
@eqs/testing@0.16.0
@eqs/telemetry@0.16.0
@eqs/platform-next@0.16.0
@eqs/platform-nest@0.16.0
@eqs/http@0.16.0
@eqs/errors@0.16.0
@eqs/config@0.16.0
@eqs/cli@0.16.0
@eqs/auth@0.16.0
@eqs/tooling@0.15.0
@eqs/testing@0.15.0
@eqs/telemetry@0.15.0
@eqs/platform-next@0.15.0
@eqs/platform-nest@0.15.0
@eqs/http@0.15.0
@eqs/errors@0.15.0
@eqs/config@0.15.0
@eqs/cli@0.15.0
@eqs/auth@0.15.0
@eqs/tooling@0.14.0
@eqs/testing@0.14.0
@eqs/telemetry@0.14.0
@eqs/platform-next@0.14.0
@eqs/platform-nest@0.14.0
@eqs/http@0.14.0
@eqs/errors@0.14.0
@eqs/config@0.14.0
@eqs/cli@0.14.0
@eqs/auth@0.14.0
@eqs/tooling@0.13.0
@eqs/testing@0.13.0
@eqs/telemetry@0.13.0
@eqs/platform-next@0.13.0
@eqs/platform-nest@0.13.0
@eqs/http@0.13.0
@eqs/errors@0.13.0
@eqs/config@0.13.0
@eqs/cli@0.13.0
@eqs/auth@0.13.0
@eqs/tooling@0.12.2
@eqs/testing@0.12.2
@eqs/telemetry@0.12.2
@eqs/platform-next@0.12.2
@eqs/platform-nest@0.12.2
@eqs/http@0.12.2
@eqs/errors@0.12.2
@eqs/config@0.12.2
@eqs/cli@0.12.2
@eqs/auth@0.12.2
@eqs/tooling@0.12.1
@eqs/testing@0.12.1
@eqs/telemetry@0.12.1
@eqs/platform-next@0.12.1
@eqs/platform-nest@0.12.1
@eqs/http@0.12.1
@eqs/errors@0.12.1
@eqs/config@0.12.1
@eqs/cli@0.12.1
@eqs/auth@0.12.1
@eqs/tooling@0.12.0
@eqs/testing@0.12.0
@eqs/telemetry@0.12.0
@eqs/platform-next@0.12.0
@eqs/platform-nest@0.12.0
@eqs/http@0.12.0
@eqs/errors@0.12.0
@eqs/config@0.12.0
@eqs/cli@0.12.0
@eqs/auth@0.12.0
@eqs/tooling@0.11.2
@eqs/testing@0.11.2
@eqs/telemetry@0.11.2
@eqs/platform-next@0.11.2
@eqs/platform-nest@0.11.2
@eqs/http@0.11.2
@eqs/errors@0.11.2
@eqs/config@0.11.2
@eqs/cli@0.11.2
@eqs/auth@0.11.2
@eqs/tooling@0.11.1
@eqs/testing@0.11.1
@eqs/telemetry@0.11.1
@eqs/platform-next@0.11.1
@eqs/platform-nest@0.11.1
@eqs/http@0.11.1
@eqs/errors@0.11.1
@eqs/config@0.11.1
@eqs/cli@0.11.1
@eqs/auth@0.11.1
@eqs/tooling@0.11.0
@eqs/testing@0.11.0
@eqs/telemetry@0.11.0
@eqs/platform-next@0.11.0
@eqs/platform-nest@0.11.0
@eqs/http@0.11.0
@eqs/errors@0.11.0
@eqs/config@0.11.0
@eqs/cli@0.11.0
@eqs/auth@0.11.0
@eqs/tooling@0.10.1
@eqs/testing@0.10.1
@eqs/telemetry@0.10.1
@eqs/platform-next@0.10.1
@eqs/platform-nest@0.10.1
@eqs/http@0.10.1
@eqs/errors@0.10.1
@eqs/config@0.10.1
@eqs/cli@0.10.1
@eqs/auth@0.10.1
@eqs/tooling@0.10.0
@eqs/testing@0.10.0
@eqs/telemetry@0.10.0
@eqs/platform-next@0.10.0
@eqs/platform-nest@0.10.0
@eqs/http@0.10.0
@eqs/errors@0.10.0
@eqs/config@0.10.0
@eqs/cli@0.10.0
@eqs/auth@0.10.0
@eqs/tooling@0.9.0
@eqs/testing@0.9.0
@eqs/telemetry@0.9.0
@eqs/platform-next@0.9.0
@eqs/platform-nest@0.9.0
@eqs/http@0.9.0
@eqs/errors@0.9.0
@eqs/config@0.9.0
@eqs/cli@0.9.0
@eqs/auth@0.9.0
@eqs/tooling@0.8.1
@eqs/testing@0.8.1
@eqs/telemetry@0.8.1
@eqs/platform-next@0.8.1
@eqs/platform-nest@0.8.1
@eqs/http@0.8.1
@eqs/errors@0.8.1
@eqs/config@0.8.1
@eqs/cli@0.8.1
@eqs/auth@0.8.1
@eqs/tooling@0.8.0
@eqs/testing@0.8.0
@eqs/telemetry@0.8.0
@eqs/platform-next@0.8.0
@eqs/platform-nest@0.8.0
@eqs/http@0.8.0
@eqs/errors@0.8.0
@eqs/config@0.8.0
@eqs/cli@0.8.0
@eqs/auth@0.8.0
@eqs/tooling@0.7.0
@eqs/testing@0.7.0
@eqs/telemetry@0.7.0
@eqs/platform-next@0.7.0
@eqs/platform-nest@0.7.0
@eqs/http@0.7.0
@eqs/errors@0.7.0
@eqs/config@0.7.0
@eqs/cli@0.7.0
@eqs/auth@0.7.0
@eqs/tooling@0.6.0
@eqs/testing@0.6.0
@eqs/telemetry@0.6.0
@eqs/platform-next@0.6.0
@eqs/platform-nest@0.6.0
@eqs/http@0.6.0
@eqs/errors@0.6.0
@eqs/config@0.6.0
@eqs/cli@0.6.0
@eqs/auth@0.6.0
@eqs/tooling@0.5.1
@eqs/testing@0.5.1
@eqs/telemetry@0.5.1
@eqs/platform-next@0.5.1
@eqs/platform-nest@0.5.1
@eqs/http@0.5.1
@eqs/errors@0.5.1
@eqs/config@0.5.1
@eqs/cli@0.5.1
@eqs/auth@0.5.1
@eqs/tooling@0.5.0
@eqs/testing@0.5.0
@eqs/telemetry@0.5.0
@eqs/platform-next@0.5.0
@eqs/platform-nest@0.5.0
@eqs/http@0.5.0
@eqs/errors@0.5.0
@eqs/config@0.5.0
@eqs/cli@0.5.0
@eqs/auth@0.5.0
@eqs/tooling@0.4.0
@eqs/testing@0.4.0
@eqs/telemetry@0.4.0
@eqs/platform-next@0.4.0
@eqs/platform-nest@0.4.0
@eqs/http@0.4.0
@eqs/errors@0.4.0
@eqs/config@0.4.0
@eqs/cli@0.4.0
@eqs/auth@0.4.0
@eqs/tooling@0.2.0
@eqs/telemetry@0.2.0
@eqs/errors@0.2.0
@eqs/config@0.2.0
@eqs/tooling@0.1.0
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
Infrastructure/eqs-platform#51
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
eqs checkannonce une tâcheknip,@eqs/toolingpublie unknip.jsonet son README la documente — maisknipn'est une dépendance de personne. La tâche est donc systématiquement sautée, et le contrôle n'a jamais tourné dans aucun satellite.Reproduction
Un clone neuf du gabarit,
pnpm install, puis :Sortie, au milieu des tâches vertes :
Où le maillon manque
node_modules/@eqs/tooling/knip.jsonest bien publié — la configuration existe.@eqs/toolingdocumente la tâche : «knip,stryker— bases ; le dépôt fixeentryet son cliquetbreak».@eqs/toolingne déclareknipni endependencies, ni enpeerDependencies, ni enpeerDependenciesMeta:package.jsondu gabarit (Infrastructure/eqs-satellite-template@main,8e70251) ne l'installe pas non plus. SesdevDependenciessont :@eqs/cli,@eqs/testing,@eqs/tooling,eslint,orval,prettier,typescript.Donc aucun satellite né du gabarit n'exécute knip, et rien ne le signale autrement que par cette ligne au milieu d'une sortie verte.
Ce que ça coûte
Le message est honnête — il dit exactement ce qui manque — et la porte reste fermée sur le reste. Ce n'est donc pas un faux vert au sens de #44. Mais le résultat pratique est le même : un contrôle annoncé qui ne contrôle rien, et personne ne s'en aperçoit parce que
pnpm checkfinit vert.Le défaut n'est pas théorique : j'en ai une occurrence. Dans Pilotage,
GrapheRepository.chargerVoisinagen'est appelée par aucun code de production depuis qu'une vue a changé de méthode de chargement — seuls trois tests d'intégration l'exercent encore. Trois tests sur soixante-dix-neuf couvrent donc du code mort, et c'est une revue humaine qui l'a trouvé, pas l'outillage. C'est précisément ce que knip attrape.Non bloquant, et sans contournement posé de notre côté : nous retirons le code mort à la main.
Ce que je proposerais
Trois voies, par ordre de préférence :
knipenpeerDependenciesde@eqs/tooling, avecpeerDependenciesMeta.optional: true, et ajouté auxdevDependenciesdu gabarit. Un satellite qui ne le veut pas peut le retirer, et il sait alors ce qu'il perd.knipendependenciesde@eqs/tooling. Plus simple, mais impose l'outil et son arbre à tous les satellites, y compris ceux qui ne le joueront jamais.eqs doctor, ou un compte des tâches sautées à la fin depnpm check(« 6 tâches vertes, 1 sautée »). Aujourd'hui la ligne se perd, et rien dans le résumé final ne rappelle qu'un contrôle manque.Le même raisonnement vaudrait pour
stryker, cité au même endroit du README — je ne l'ai pas vérifié.Versions
@eqs/tooling,@eqs/cli: 0.8.1eqs --version: 0.8.1packageManager:pnpm@11.8.0, Node v24.15.0, Windows 11 Pro 26200Trouvé en développant le premier satellite réel (Pilotage), lors de la revue finale d'un lot.
Vrai, et j'ai une dette à reconnaître avant le reste : ce trou était déjà consigné ce matin, dans
reference/chasses.md, sous « reste à regarder » — « le gabarit et les satellites n'installent toujours pas knip ». Je l'avais bouché poureqs-platformseul et noté le reste au lieu de le faire. Vous l'avez retrouvé six heures plus tard. Consigner un trou n'est pas le boucher.Vos trois options sont bonnes, et j'ai pris la 1 et la 3. Il manquait une quatrième chose, sans laquelle la 1 aurait été pire que le mal.
Ce qui manquait : la configuration
knip 6 n'a pas de champ
extends. Un dépôt ne peut donc pas partir deknip.jsonen une ligne de JSON — il lui faut du code. Et du code de configuration copié dans trente satellites dérive.Sans configuration, mesuré sur le gabarit :
Trente-huit fichiers, et les quatre vraies trouvailles noyées dedans. Installer knip sans la configuration aurait donné une porte qui crie sur du code vivant, c'est-à-dire une porte éteinte en une semaine — et plus jamais rallumée.
D'où
@eqs/tooling/knip-satellite:knipSatellite()lit la forme du dépôt (lesapps/*, leeqs.openapidu manifeste) et en déduit les points d'entrée. Leknip.jsd'un satellite tient en deux lignes :Avec ça, sur votre gabarit, il ne reste que du vrai.
Une de vos hypothèses était fausse, et c'est votre porte qui l'a dit
knip annonçait
zodinutilisée dansapps/web. Je l'ai retirée.types:weba refusé :La cause est dans la base de la flotte :
**/generated/**était dansignore, etignoreretire les fichiers du périmètre entier — leurs imports ne comptent plus. Une dépendance que seul le client généré utilise passe donc pour morte. Le client généré est maintenant déclaré enentry: ni signalé comme mort (une entrée ne l'est jamais), ni invisible. Vérifié en la retirant à nouveau — knip la rend alors en dépendance non déclarée, ce qui est la vérité.Il restait donc deux dépendances mortes, pas trois :
@eqs/errorset@eqs/telemetrydansapps/api, qui arrivent de toute façon par@eqs/platform-nest.Votre option 3, faite aussi
Vous aviez raison : la ligne se perd. Elle était imprimée en tête, avant toute la sortie des tâches. Elle est maintenant répétée dans le bloc final, avec un compte :
Même règle que pour les contrôles de conformité, appliquée au lanceur : un contrôle non exécutable n'est pas un contrôle vert.
Ce que knip a trouvé en tournant, et qui vaut plus que les dépendances
Votre
test:e2e:Deux défauts pour un caractère, un par plateforme, et le second est grave :
cmd.exene sépare pas sur;:eqs e2e downne tourne jamais, la pile Docker reste debout après chaque exécutionA; Best celui de B : unplaywright testrouge était suivi d'undownvert, et l'étage sortait à 0Mesuré des deux côtés :
node dire.mjs un; node dire.mjs deuxrend["un;","node","dire.mjs","deux"], etsh -c 'true && false; true'rend0.L'étage e2e ne pouvait pas échouer, y compris en CI. Une porte qui ne peut pas refuser n'est pas une porte.
scripts/e2e.mjsmet la descente dans unfinallyet rend le code de la mesure, pas du ménage. Le;rejointtooling.script-shell-posix— hors guillemets seulement,node -e "const a = 1; …"reste vert.Au passage :
@playwright/testn'est pas installé, il n'y a ni configuration ni scénario. Le script le dit maintenant avant de monter la pile, au lieu de laisserplaywrightéchouer sur « command not found » après coup.eqs e2e up/downfonctionnent ; c'est le côté Playwright qui reste à poser, et c'est un vrai chantier, pas un oubli.stryker, puisque vous posez la questionCe n'est pas le même cas, et j'ai vérifié avant de répondre. Aucune tâche ne déclare Stryker nulle part —
eqs checkne le mentionne pas. Donc rien ne ment : knip était annoncé et absent, Stryker n'est pas annoncé. La mutation prend des minutes, la porte vise soixante secondes, et le cliquet est fait pour tourner à part.Ce qui était trompeur, c'est la ligne du README qui les mettait sur le même plan. Elle est corrigée, et l'état réel est écrit : base publiée, aucun dépôt de la flotte n'installe Stryker, aucun cliquet posé.
Où en sont les branches
eqs-platformchasse/knip-et-code-morteqs-satellite-templatefix/scripts-windows(porte letest:e2e)eqs-satellite-templatechore/deps-morteseqs-satellite-templateLa dernière ligne mérite d'être dite franchement : le
knip.jsdu gabarit a besoin de@eqs/tooling/knip-satellite, donc du socle publié. J'ai essayé de la pousser ; votrepre-pushl'a refusée, parce quepnpm checkne peut pas être vert avant. Il a eu raison, et je n'ai pas passé--no-verify— #50 vient d'être écrit sur ce sujet précis. Ce morceau attend donc la sortie, et c'est le seul.Je laisse ce ticket ouvert jusqu'à la publication : chez vous,
knipne tournera qu'à ce moment-là.eqs checktype-vérifie le front mais ne le compile jamais : toute une classe de défauts échappe à la porte #53connect ETIMEDOUT 127.0.0.1:<port éphémère>quand la suite complète tourne — jamais fichier par fichier #57Corrigé. knip est installé et joué :
testing.etage-declare-videle connaît (OUTILSdepackages/testing/src/etages.ts), et le contrôle refuse désormais tout étage déclaré qu'aucun outil ne peut jouer — c'est la classe entière, pas la seule instance.AGENTS.mddu socle le dit : « knip n'y a été branché que le 2026-09-10 : il était annoncé depuis le début, publiait sa base dans@eqs/tooling, et n'était installé nulle part. »Fermé après vérification contre le code de
devle 2026-09-21. Ce ticket restait ouvert faute d'unCloses #51dans le commit, pas faute de correctif.eqs checktype-vérifie le front mais ne le compile jamais : toute une classe de défauts échappe à la porte #53