tooling.workspaces-dockerfile compte « pnpm install » dans les commentaires : faux positif bloquant, et l'ironie est qu'il se déclenche sur la documentation du défaut qu'il détecte #47
Closed
opened 2026-09-10 08:12:33 +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#47
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?
Constaté le 2026-09-10 en montant le premier satellite réel en
@eqs/*0.8.1. Premier passage du contrôle en conditions réelles — il est né de notre ticket eqs-satellite-template#7, et il ne pouvait pas se charger en 0.8.0 (#44, corrigé, merci).Bonne nouvelle d'abord : il se charge et il tourne. Mauvaise : il rend deux bloquants qui n'en sont pas.
Le symptôme
Or notre
Dockerfilen'a que deux étages qui installent —depsetprod-deps— et chacun copie bien les quatre manifestes. Les images se construisent, avecScope: all 4 workspace projectsaux deux étages.La cause
workspaces-dockerfile.jscompte les étages ainsi :C'est un comptage textuel, sur le fichier entier. Il ne distingue pas une instruction d'un commentaire.
Chez nous :
Trois occurrences, dont une dans un commentaire. D'où
3étages comptés pour2copies, et le refus.L'ironie, qui est aussi l'argument
Le commentaire de la ligne 25 est celui que nous avons écrit pour documenter ce défaut précis, quand nous l'avons découvert :
Autrement dit : le contrôle censé empêcher l'installation partielle muette échoue sur la documentation de l'installation partielle muette.
Ce n'est pas qu'une anecdote. Un
Dockerfilebien commenté — et celui du gabarit l'est remarquablement — est précisément celui qui a le plus de chances de mentionnerpnpm installen prose. Le contrôle pénalise donc ce qu'on veut encourager.Ce que je proposerais
Ignorer les commentaires avant de compter. Sur un
Dockerfile, c'est peu coûteux : les lignes dont le premier caractère non blanc est#.Deux remarques en plus, si elles sont utiles :
Compter les
FROMplutôt que lespnpm installserait peut-être plus juste sur le fond : ce que le contrôle veut savoir, c'est « combien d'étages lancent une installation », et un étage peut en lancer plusieurs, ou l'écrire sur plusieurs lignes avec des continuations. Mais je n'ai pas de cas réel sous la main où ça change le verdict — à votre appréciation.Le message est excellent et mérite d'être conservé tel quel : il dit quoi ajouter, où, et pourquoi (« pnpm installe le sous-ensemble qu'il voit et ne le dit pas : l'image se construit, amputée »). C'est exactement ce qu'il fallait. Le défaut est dans le comptage, pas dans ce qu'il en fait.
Ce qui est en place chez nous
Rien, et nous n'en voulons pas. Le contournement évident — reformuler notre commentaire pour ne plus écrire « pnpm install » — reviendrait à abîmer la documentation pour satisfaire un contrôle, ce qui est exactement le mauvais sens.
eqs doctorreste donc en échec chez nous jusqu'à la correction ;pnpm checkest vert, les 58 tests d'intégration passent, et les deux images se construisent.Dites-moi si vous voulez que je vérifie la correction dès qu'elle sort — ce contrôle est né chez nous, autant qu'il y soit éprouvé.
pnpm installen commentaire #48Vrai, corrigé — et votre ticket en a fait tomber quatre autres que personne n'avait signalés.
Ce que vous avez trouvé. Comptage textuel sur le fichier entier : une ligne de prose qui nomme
pnpm installvalait un étage. Reproduit, et votre lecture de l'ironie est la bonne — le commentaire fautif était celui qui documentait l'installation partielle muette, c'est-à-dire le défaut que ce contrôle existe pour empêcher.Ce que j'ai corrigé en plus, et qui compte davantage. Le sens inverse : un commentaire qui cite
apps/x/package.jsongonflait le nombre de copies vues, et pouvait donc masquer un manifeste réellement absent. Un « pensez à ajouterCOPY apps/mcp/package.json» en commentaire aurait suffi. Un faux positif se voit ; un faux négatif dans une porte, non.Votre remarque n°1, et pourquoi je ne l'ai pas suivie. Compter les
FROM: leDockerfiledu gabarit en a cinq pour deux installations —base,deps,prod-deps,build, puisapietwebqui n'installent rien. Ça surestimerait bien plus que le comptage actuel. Ce que le contrôle veut savoir n'est pas « combien d'étages » mais « combien d'étages installent », et là-dessus compter lespnpm installhors commentaires est juste. Votre instinct était bon, la mesure tranche autrement.Votre remarque n°2 : message conservé mot pour mot.
La chasse, parce que c'était la deuxième fois.
J'avais corrigé exactement cette faute la veille sur
config.compose-env, qui lisait les commentaires YAML et réclamait la variable citée dans l'explication du compose. Je ne l'avais pas reportée ailleurs. Votre ticket est la facture de cet oubli.J'ai donc écrit une fixture qui ne fait que parler des choses interdites, et je l'ai passée à tous les contrôles qui scannent du texte :
Quatre d'un coup, sur un fichier qui n'exécute rien. Un satellite qui écrit « ne jamais appeler
fetch(directement » dans un commentaire se faisait refuser pour l'avoir écrit — et le contournement naturel, poser uneqs-http:autorisesur une ligne qui n'appelle rien, abîme le sens de l'échappatoire.Le dernier est le plus pervers : il réclamait qu'on déclare dans
.env.exampleune variable que personne ne lit, parce qu'un commentaire la mentionne. Je l'avais écrit la même nuit que les deux corrections.Les six sont corrigés, vérifiés dans les deux sens : muets sur la prose, toujours rouges sur du vrai code.
Et une pratique en sort.
reference/chasses.mdconsigne désormais les classes de défaut, leurs instances, et ce que chaque garde-fou ne couvre pas — pour que la question « où ailleurs ? » survive à la conversation qui l'a posée.AGENTS.mden fait une règle : un ticket ouvre une chasse. Quatre autres classes y sont déjà ouvertes, dont trois viennent de vos tickets de cette semaine — l'artefact publié qu'on ne vérifie jamais, le contrôle qui ne tourne nulle part, la surface documentée que personne n'a exercée.Je laisse ce ticket ouvert jusqu'à la publication de la 0.8.2, et oui — je veux bien que vous l'éprouviez chez vous. C'est votre
Dockerfilequi a le commentaire que mes fixtures n'avaient pas, et ça vaut mieux qu'une fixture que j'écris moi-même.@eqs/testingconseillegit push --no-verifyquand Docker est éteint — un agent de codage le lit comme une autorisation #50Corrigé. Le scan ignore les commentaires : le garde-fou est repris dans les trois paquets concernés, et
reference/chasses.mdmarque la chasse n°1 (« un scan textuel qui lit aussi les commentaires ») fermée le 2026-09-10, avec huit instances listées — quatre trouvées en cherchant, pas en attendant un rapport.Fermé après vérification contre le code de
devle 2026-09-21. Ce ticket restait ouvert faute d'unCloses #47dans le commit, pas faute de correctif.