Le rétrofit n'a pas de guide : le clone neuf a 405 lignes et 14 étapes vérifiables, l'existant a une commande et deux décisions #93
Closed
opened 2026-09-30 15:13:20 +00:00 by nicolas-fryder
·
3 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#93
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?
L'asymétrie
Deux chemins mènent au socle. Un seul est écrit.
docs/initialiser-un-satellite.md— 405 lignes, 14 étapes, chacune avec son critère de vérification/eqs-initeqs migrate inspect/eqs migrate planETAT.md,reference/chasses.mdEQS/ATLAS,docs/retrofit-eqs.mdD-003 pose pourtant les deux chemins à égalité — « le template est pour les dépôts neufs, les packages sont pour tout le monde » — et la ROADMAP #15 fait du rétrofit d'ATLAS un objectif de premier rang. D-048 va jusqu'à nommer «
docs/du rétrofit » dans sa colonne de conséquences (reference/decisions.md). Cedocs/n'existe pas.Ce que ça coûte, mesuré
Le rétrofit de
nuagecommence aujourd'hui. C'est le second après ATLAS, et il a dû reconstituer à la main :reference/decisions.md— pas dans un guide ;peerDependenciesde chaque package, en ouvrant les dixpackage.json, pour découvrir que l'adoption exige Node ≥ 22.18, vitest ≥ 3, TypeScript ≥ 5.9, knip ≥ 6,class-validator^0.15.1 et@nestjs/swagger^12 — c'est-à-dire un étage 0 entier qui n'est annoncé nulle part ;eqs migrateexiste, découvert dans le cahier de@eqs/cliet dans #79.Chacun de ces points a été trouvé. Aucun ne l'a été là où on le cherchait.
Le retour d'expérience d'ATLAS est réel et détaillé, mais il vit dans ATLAS. C'est contraire à D-021 (« le cadre de tests et la doctrine ne sont pas copiés : ils ont un seul exemplaire, dans
eqs-platform») appliqué au rétrofit : la procédure d'adoption est une propriété du socle, pas de chaque dépôt qui l'adopte. Le troisième rétrofit (photofront, metalfrom) repartira de zéro une troisième fois.Ce que je proposerais
Un
docs/retrofitter-un-existant.md, symétrique d'initialiser-un-satellite.md— même forme, une étape, un critère de vérification — qui dise au minimum :peerDependenciesdu socle, versus ce qu'un dépôt de deux ans porte. C'est la marche la plus haute et elle est avant la première.--suppress-all, le secondtsconfig.json, l'interdiction de--pass-on-unpruned-suppressions).eqs.check.tachesde D-049 : ce qu'un existant fait de ses gates maison — ils s'ajoutent.eqs migrate inspectd'abord, toujours.Et, si la commande
/eqs-migrateévoquée dans #79 existe quelque part, la référencer — elle n'est pas dans.claude/commands/de ce dépôt, qui ne porte queeqs-init.md.Lien avec #85
#85 demandait le mécanisme de baseline, et D-048 l'a tranché. Ce ticket demande autre chose : que la procédure soit écrite quelque part où on la cherche. Les deux sont voisins et ne se remplacent pas — D-048 existe et reste introuvable pour qui ne lit pas
reference/decisions.mdligne à ligne.Contexte
Rétrofit de
nuage(EQS-Sandbox/NUAGE, brancheretrofit-socle-eqs), profilnest,@eqs/*0.13.0. Conception dansdocs/superpowers/specs/2026-09-30-retrofit-socle-eqs-design.md. Je tiendrai le journal de ce rétrofit dans le dépôt, comme ATLAS — et c'est précisément ce qui fait le doublon que ce ticket voudrait éviter au suivant.Correction : j'ai écrit « le troisième rétrofit (photofront, metalfrom) ».
metalfromn'est pas un dépôt de la flotte — son origine estgit.nicolasfryder.ovh/nico/metalfrom.eu, une autre forge, un compte personnel. Je l'avais repris de la liste dedocs/profils.md, qui est justement fausse sur ce point (#92).Lire donc : le troisième rétrofit —
EQS/LUMIX, et ce qui suivra dans l'organisation — repartira de zéro une troisième fois.La règle qui m'a manqué et qui vaut d'être écrite quelque part : l'origine git dit si un dépôt est de la flotte. Un nom dans une liste ne le dit pas.
docs/profils.md: la liste des dépôts du profilnext-fullstacka trois entrées fausses sur quatre #92Écrit :
docs/retrofitter-un-existant.md, par84d4dcc(PR #95). Fermeture à la fusion.Le symétrique d'
initialiser-un-satellite.md— même forme, une étape, un critère de vérification. Les six points demandés y sont, et voici ce qu'ils ont donné en les mesurant plutôt qu'en les recopiant.1. L'étage 0, relevé sur les dix
package.jsonLe tableau complet des
peerDependenciesdu socle, avec ce qui l'exige et quand. Deux pièges que la lecture rapide manque :@nestjs/swaggera deux planchers.@eqs/errorsaccepte>=11,@eqs/platform-nestexige^12.0.1. Un profilnestest donc en^12— lire la ligne d'errorsseule fait croire à 11.zodest en^4.5.4, pas^3. C'est la migration la plus coûteuse de l'étage 0 pour un dépôt qui valide beaucoup, et la seule qui n'a rien à voir avec le socle : elle se fait avant.Le guide donne aussi la commande pour re-mesurer le tableau à chaque version, plutôt que de le laisser se périmer — c'est exactement la faute de #92, et il aurait été malvenu de la refaire dans le document qui la raconte.
2 à 6
tsconfig.jsondaté et chiffré (exemple complet dans le guide),--suppress-allune seule fois,--prune-suppressionsaprès correction, et l'interdiction de--pass-on-unpruned-suppressions— avec la raison, qui est que le cliquet devient un seuil.eqs.check.tachesde D-049, et ses deux silences par dessein : une tâche dont l'outil manque se retire en le disant (requiert), un manifeste mal déclaré ne lève pas. Conséquence que le guide écrit noir sur blanc : il faut vérifier que ses tâches tournent, parce que « ma tâche passe » et « ma tâche n'a pas tourné » affichent le même vert.fetchAmontd'ATLAS contre D-025.eqs migrate inspectd'abord, toujours — et le critère qui tranche le profil : les route handlers, pas la présence de Next.Sur la commande
/eqs-migrate: elle n'existe pas..claude/commands/ne porte queeqs-init.md, votre constat est exact. Le guide s'appuie sureqs migrate inspecteteqs migrate plan, qui existent bien (packages/cli/src/bin/eqs.ts).Trouvé en l'écrivant, et qui aggrave le ticket
Le retour d'expérience d'ATLAS existe —
docs/retrofit-eqs.md, 583 lignes : l'ordre des étages, six arbitrages tranchés et datés, et six risques du socle repérés avant d'écrire une ligne. Mais il est sur une branche localeepic/retrofitqui n'est pas poussée (26 commits d'avance, 144 de retard surmain) :Ce n'est donc pas seulement « le retour d'expérience vit dans ATLAS » : seul le poste qui l'a écrit peut le lire. Le guide en reprend ce qui est vrai de tout rétrofit, et le dit dans un encadré — ce qui est propre au dépôt reste chez lui, ce qui est vrai de tout rétrofit remonte dans
eqs-platform(D-021).Rien n'a été touché dans ATLAS : le dépôt est un autre chantier. Sortir cette branche mérite son propre passage.
Ce que je n'ai pas vérifié
Le guide n'a pas été déroulé de bout en bout par quelqu'un qui le suit. Il est tiré d'un rétrofit fait, pas d'un rétrofit refait en le lisant. Le rétrofit de
nuageest le premier à pouvoir le démentir — et c'est ce qu'on lui demande : ce qui manque, ce qui est faux, ce qui est dans le mauvais ordre revient ici en ticket.Référencé depuis
AGENTS.md, à côté du chemin du clone neuf, avec la mention que les deux sont à égalité (D-003).Deux pièges de plus pour le guide, trouvés en finissant les étages 0 à 2 de
nuage. Les deux coûtent une demi-heure à qui ne les connaît pas, et cinq lignes à qui les a écrites.1.
ERR_PNPM_TARBALL_URL_MISMATCHaudocker build— et le message accuse le verrouOn va donc inspecter
pnpm-lock.yaml. Les URL y sont identiques au caractère près à ce que le registre annonce :La vraie cause tient en une mesure :
Le registre exige une authentification même pour lire les métadonnées. Sans jeton, pnpm ne peut pas vérifier le verrou — et c'est CE refus qu'il rapporte comme une incohérence de verrou. Le message envoie chercher au mauvais endroit, et il y envoie avec insistance.
Il fallait deux choses, et n'en faire qu'une ne change rien au message :
.npmrcdans l'image (sans quoi le conteneur cherche@eqs/*sur npmjs.org) ;pnpm install.Le gabarit fait bien les deux —
COPY … .npmrc ./puis--mount=type=secret,id=npmrc— mais nulle part il n'est dit que l'un sans l'autre produit ce message-là. Un rétrofit ne copie pas le Dockerfile du gabarit : il modifie le sien, et il ajoute ce qu'il croit manquer, un morceau à la fois.Ce que le guide gagnerait à dire, à l'étape des images : « le registre répond 401 même sur les métadonnées ; si
docker buildparle d'un verrou incohérent, c'est le jeton qui manque, pas le verrou ». Et, pour la pile de développement, que le secret se déclare dans le compose (secrets: npmrc: file: ${HOME}/.npmrc) pour questack:upcontinue de marcher sans commande à retenir.2.
protobufjs— le gabarit l'a écrit, un rétrofit ne le lit paspnpm installsort en 1 et écrit littéralementprotobufjs: set this to true or falsedans lepnpm-workspace.yamldu dépôt. La décision de la flotte existe, commentée en quinze lignes dans le gabarit et danseqs-demo— mais un rétrofit n'ouvre pas lepnpm-workspace.yamldu gabarit, il ouvre le sien.C'est exactement le cas que ce ticket décrit : la connaissance existe, elle est même bien écrite, et elle est là où seul un clone la trouve. Une ligne dans le guide (« les scripts d'installation à approuver, et la décision de la flotte pour chacun ») éviterait de la retrancher à chaque fois.
Contexte :
EQS-Sandbox/NUAGE, brancheretrofit-socle-eqs, étages 0 à 2 terminés,@eqs/*0.14.0. Le journal est dansdocs/RETROFIT.md— et je le tiens là faute d'un endroit commun, ce qui est le doublon même que ce ticket voudrait éviter au suivant.