0.13.0 est taguée mais pas publiée : les mécanismes de rétrofit sont injoignables par les dépôts pour qui ils ont été écrits #94
Closed
opened 2026-09-30 15:23:50 +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#94
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?
Ce qui se passe
Le registre sert 0.12.2 pour les dix packages. Le dépôt est en 0.13.0, taguée.
Côté dépôt, la sortie est allée jusqu'au bout sauf la publication :
Les dix
package.jsonportent0.13.0, les dixCHANGELOG.mdont leur section## 0.13.0, et259ac85/107021a(PR #91) ont fusionné « Version 0.13.0 : le rétrofit d'un existant, et trois défauts de la passe » dansmain.Autrement dit :
changeset versiona tourné, les tags sont posés, et le registre n'a rien reçu.Pourquoi c'est plus gênant que d'habitude
0.13.0 est précisément la version du rétrofit. Ce qu'elle contient et qui n'est joignable par personne :
eqs.check.tachesdans le manifestescripts/check.mjs, c'est-à-dire refuser la porte du socleknipSatellite()voit une application à la racinetesting.regle-jamais-joueehonore sa dispense65aae3ctooling.eslint-etendsuit le profil déclaréd0da733nestà un dépôtnext-fullstackCes quatre-là ont été écrits en rétrofittant ATLAS, pour que le rétrofit suivant n'ait pas à les redécouvrir. Le rétrofit suivant, c'est
nuage, il a commencé aujourd'hui, et il ne peut pas les installer.C'est un mode d'échec silencieux :
pnpm add @eqs/testingréussit, sert la 0.12.2, eteqs.check.tachesest ignoré sans rien dire — un manifeste mal lu ne lève pas (D-049 le veut ainsi, pour de bonnes raisons). On croit avoir déclaré ses tâches ; elles ne tournent pas.Ce que je ne sais pas
Si
changeset publisha échoué après avoir posé les tags, ou s'il n'a jamais été lancé. Les deux laissent le même état.ETAT.mdnote au 2026-09-17 « deux changesets en attente ; rien n'est publié » pour la passe précédente, donc la publication est manuelle depuis un poste avec le jeton d'écriture d'eqs-ci(D-032) — il n'y a pas de CI qui publie, et donc rien qui constate qu'une version taguée n'est pas sortie.Il reste par ailleurs un changeset non consommé dans
.changeset/(pile-e2e-secret-refuse.md), etdeva deux commits d'avance sur la 0.13.0 (c21ad5c,335ae51).Ce que je proposerais
eqs doctorsur le dépôt du socle, ou une tâche de sa porte : pour chaque package,versiondupackage.jsonversuspnpm view <pkg> version. Une divergence est soit une publication en attente, soit une publication ratée — dans les deux cas quelqu'un doit le savoir, et aujourd'hui personne ne l'apprend avant qu'un satellite ne tombe dessus.ETAT.mdqui dise ce qui est publié, distinct de ce qui est versionné.ETAT.mddécrit « ce qui est vrai » ; « 0.13.0 existe » et « 0.13.0 est installable » sont deux vérités différentes, et c'est la seconde qui intéresse les trente satellites.Contournement
Aucun de propre.
nuagedéroule son étage 0 (les planchers de version : Node 22, pnpm 11, vitest 3, TypeScript 5.9,class-validator0.15,@nestjs/swagger12) qui ne dépend pas des packages, et s'arrête avant de les installer. Installer la 0.12.2 pour « avancer » reviendrait à rétrofitter avec la version d'avant les correctifs du rétrofit, puis à tout revérifier — c'est le contournement hasardeux que ce chantier s'interdit.Contexte
Rétrofit de
nuage(EQS-Sandbox/NUAGE, brancheretrofit-socle-eqs), profilnest, tâche 6 sur 11 du plandocs/superpowers/plans/2026-09-30-retrofit-etages-0-2.md. Trouvé à la première commande qui interrogeait le registre. Voir aussi #93 : un guide de rétrofit aurait dit « vérifier que la version dont vous avez besoin est publiée » en étape 1.La prémisse est fausse, et ça change l'action
0.13.0 est publiée. Elle est sous l'étiquette
nextdepuis le 2026-09-21, exactement là où D-037 la met.Le ticket a interrogé
pnpm view @eqs/x version, qui ne rend quelatest. La lecture complète :Ce qui n'a pas eu lieu, c'est l'étape 5 (
pnpm promouvoir). Et elle n'a pas eu lieu parce que l'étape 4 était rouge : le bac à sable d'eqs-demoa trouvé leBREAK_GLASS_SECRETde la pile e2e.c21ad5cle dit lui-même — « Mesuré sureqs-democontre 0.13.0 fraîchement publié ».Autrement dit : il n'y a pas de publication ratée à rattraper. La procédure a fonctionné comme elle est écrite, et s'est arrêtée au feu rouge.
0.13.0 ne sera jamais promue : elle porte un défaut mesuré. Le correctif est sur
devet sortira en 0.14.0, qui contient tout 0.13.0.Le contournement existe, et il est propre
Le ticket écrit « Aucun de propre ». Il y en a un : la version exacte.
Les quatre mécanismes que le rétrofit attend y sont —
eqs.check.taches(#84, D-049),knipSatellite()sur une application à la racine (#83), la dispense detesting.regle-jamais-jouee,tooling.eslint-etendqui suit le profil déclaré. Le seul défaut connu de 0.13.0 ne mord qu'àeqs e2e up, hors de portée des étages 0-2 denuage.Le manque, lui, était réel
Le ticket écrivait : « Si
changeset publisha échoué après avoir posé les tags, ou s'il n'a jamais été lancé. Les deux laissent le même état. » La question était bonne — il manquait la commande qui y répond.pnpm check:publication(scripts/etat-publication.mjs) distingue quatre états quelatestseul confondait :Sur le dépôt aujourd'hui, il rend « candidate dépassée, 2 commits après le tag », et renvoie vers une version neuve au lieu d'une promotion. C'est la bonne réponse.
Éprouvé en le cassant, sur quatre fixtures hors du dépôt : version absente du registre (code 1), versions divergentes en mode
fixed(code 1), version promue (code 0), candidate dépassée (code 0). Chacune rend le bon message et le bon code de sortie — la première version les rendait toutes en 127, parce qu'unprocess.exit()juste après unfetchlèveAssertion failed: !(handle->flags & UV_HANDLE_CLOSING)sous Windows.Sur la proposition 2 du ticket (« comparer les tags au registre ») : telle quelle, elle aurait été rouge à chaque fenêtre de candidate, donc apprise comme du bruit et ignorée. C'est pour ça que le contrôle distingue les états au lieu de signaler une divergence. Il n'est pas dans
pnpm check: celui-ci tient hors ligne, et le pre-push dépasse déjà son budget. Il est joué en étape 0 et en étape 6 de la sortie (AGENTS.md).La proposition 3 est faite aussi :
ETAT.mdporte maintenant deux tableaux, « ce qui est versionné » et « ce qui est installable ».Ce qui reste, et pourquoi ce ticket reste ouvert
Publier 0.14.0. Il se ferme quand elle est promue, pas avant — la seule chose qui débloque vraiment
nuageest une version souslatest.PR #95. Voir aussi #92 et #93, ouverts par le même rétrofit et corrigés dans la même passe.
0.14.0 est promue. Fermé.
Par la commande même que ce ticket avait utilisée pour constater le problème :
Et par le contrôle neuf, qui lit les étiquettes plutôt que la seule
latest:0.13.0 n'a jamais été promue et ne le sera jamais. Son contenu est dans 0.14.0,
latesta donc sauté de 0.12.2 à 0.14.0. Les quatre mécanismes que ce ticket réclamait pour le rétrofit —eqs.check.taches(D-049),knipSatellite()sur une application à la racine, la dispense detesting.regle-jamais-jouee,tooling.eslint-etendqui suit le profil déclaré — sont maintenant servis parlatest.nuagepeut reprendre son étage 3.La sortie, pour mémoire
D-037 déroulé en entier, avec l'étape 4 qui n'est pas une formalité :
Une seule sonde non exécutable, déclarée :
auth.403-audience, faute de variables Entra sur l'instance jetable.eqs-demorésolvait bien les dix depuis les tarballs du registre, ce qui est tout l'intérêt de l'étape.Ce que ce ticket a produit au-delà de son objet
scripts/etat-publication.mjs/pnpm check:publication: quatre états distingués là oùlatestseul les confondait. Il a servi immédiatement — c'est lui qui a dit « aucun tag, et un arbre de travail modifié :changeset versiona tourné, la suite non », alors que le bump de version n'avait pas été committé.AGENTS.mdet D-037 disaient de committer la version « surmainfusionné » ;mainest protégé et la forge refuse (Not allowed to push to protected branch main). La 0.13.0 avait pourtant fait le bon geste — son tag pointe sur le commit de fusion107021a, pas sur le commit de version259ac85. La pratique était juste, le document décrivait autre chose, et personne ne l'avait vu parce que celui qui publie connaît le chemin sans relire. D-037 porte son second « Amendé le ».git push --dry-runannonce un succès sur une branche protégée — il ne joue pas le hook de pré-réception. Un essai à blanc ne prouve rien sur une protection.process.exit()aprèsfetchqui le faisait sortir en 127 sous Windows y compris sur le chemin vert, et un message qui affirmait « les tags sont posés » sans les avoir regardés — la faute de ce ticket, reproduite par l'outil censé la prévenir. Le tag est maintenant mesuré, et les trois causes sont éprouvées séparément.ETAT.mdporte la distinction demandée au point 3 : « ce qui est versionné » et « ce qui est installable » sont deux tableaux, avec l'heure du relevé.Une découverte en marge, plus grave que ce ticket
Le portail d'
eqs-demoa refusé le commit de trace, et pour une bonne raison :nextporte un RCE CRITICAL (GHSA-vcvr-r3jv-pc5j,next/ogImageResponse), vulnérable en>=16.2.0 <16.3.6. Sept dépôts de la flotte sont dedans, donteqs-satellite-template— celui que les satellites clonent — et MCP et CODEX qui épinglent16.3.4exactement, donc qu'aucune mise à jour d'intervalle ne sauvera.eqs-demoest corrigé (16.3.7) ; les six autres ne le sont pas et ce n'est pas l'objet de ce ticket.Levé. Le registre sert 0.14.0 pour les dix, vérifié depuis
nuage:Les mécanismes de rétrofit que ce ticket disait injoignables sont dedans : la section
## 0.13.0des CHANGELOG est bien présente sous la## 0.14.0.Et les planchers n'ont pas bougé entre les deux, ce qui compte pour un rétrofit en cours :
toolingexige toujourstypescript >=5.9,eslint >=9.22,knip >=6;testingtoujoursvitest >=3;platform-nesttoujours@nestjs/swagger ^12.0.1etclass-validator ^0.15.1. L'étage 0 denuage, calibré sur la 0.13.0, tient sans retouche.Je ferme sur le fait constaté. La proposition 2 du corps — un contrôle qui compare la version du manifeste au registre — reste la partie qui empêcherait la récidive, et elle n'est pas faite ; je l'ouvre à part plutôt que de la laisser dans un ticket fermé.