chore/tickets-satellite #27

Merged
nicolas-fryder merged 10 commits from chore/tickets-satellite into main 2026-09-15 21:59:56 +00:00
No description provided.
Les scripts `dev` et `start` portaient `next dev --port ${PORT_WEB:-4000}`.
pnpm passe les scripts par `cmd.exe` sous Windows, qui ne connaît pas cette
substitution : la chaîne arrivait telle quelle à `next`, qui refusait. Toute
l'équipe est sous Windows, donc le front ne démarrait chez personne.

Le port est maintenant résolu dans `scripts/next.mjs`, en JavaScript, avant
d'appeler `next`. C'est la seule forme qui se comporte pareil sur les deux
plateformes — et elle n'ajoute aucune dépendance.

Le script lance le point d'entrée JS de `next` avec le Node courant, pas le
shim `.cmd` : passer par un shell aurait ramené `cmd.exe`, c'est-à-dire la
cause du défaut.

`PORT_WEB` fonctionne pour la première fois
───────────────────────────────────────────
Sous Linux, où la substitution marche, elle ne servait à rien non plus :
`${PORT_WEB}` lit l'environnement du SHELL, que rien ne remplit. Le `.env`
du dépôt est chargé par `next.config.mjs`, donc DANS le processus Next, bien
après que `--port` a été analysé. `PORT_WEB=4000` dans `.env` n'avait donc
jamais eu le moindre effet, sur aucune plateforme : `.env.example` décrivait
un réglage qui n'existait pas.

Le script charge le `.env` racine avant de résoudre le port, avec le même
primitif que `next.config.mjs`. Vérifié à 4000 (défaut), 4321 (variable de
shell) et 4567 (fichier `.env`).

La variante `next-fullstack` portait le même défaut, sans être signalée.
Elle n'a pas besoin d'une copie du script : son README fusionne
`variantes/next-fullstack/apps/web/.` sur `apps/web/`, donc celui de la base
arrive avec.

Le socle gagne un contrôle bloquant `tooling.script-shell-posix` pour que la
classe ne revienne pas dans la flotte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`eqs e2e up && playwright test; eqs e2e down` : deux défauts, un par
plateforme, et le second est le pire.

Sous Windows, `cmd.exe` ne sépare pas sur `;`. Tout ce qui suit devient un
argument de `playwright`, et `eqs e2e down` ne tourne jamais : la pile
Docker reste debout après chaque exécution. Mesuré sur pnpm 11.8 —
`node dire.mjs un; node dire.mjs deux` rend `["un;","node","dire.mjs","deux"]`.

Sous sh, le code de sortie d'une liste `A; B` est celui de B. Mesuré :
`sh -c 'true && false; true'` rend 0. Un `playwright test` rouge était donc
suivi d'un `eqs e2e down` vert, et l'étage sortait à 0. L'étage e2e ne
pouvait PAS échouer, y compris en CI, qui est sous Linux. Une porte qui ne
peut pas refuser n'est pas une porte.

`scripts/e2e.mjs` : la descente est dans un `finally` et le code rendu est
celui de la mesure, pas du ménage. Le code de sortie de `eqs e2e down` est
ignoré — rater le ménage ne doit transformer ni un échec en succès, ni
l'inverse.

Le script dit aussi, AVANT de monter quoi que ce soit, que l'étage n'est pas
monté dans ce dépôt : il manque `@playwright/test`, une configuration et un
scénario. `eqs e2e up`/`down` existent et fonctionnent ; c'est le côté
Playwright qui reste à poser. Mieux vaut le dire que laisser
`playwright test` échouer sur « command not found » après avoir levé toute
une pile Docker.

Même classe que #22 : un script de manifeste qui suppose un shell POSIX. Le
socle gagne le `;` dans `tooling.script-shell-posix`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Trouvées par knip, qui n'a jamais tourné dans aucun satellite parce que
personne ne l'installe (#51). `apps/api` déclarait `@eqs/errors` et
`@eqs/telemetry` sans les importer : les deux arrivent de toute façon par
`@eqs/platform-nest`, qui les a en dépendances.

Une troisième trouvaille était FAUSSE, et c'est la porte du dépôt qui l'a
dit, pas la relecture. knip annonçait `zod` inutilisée dans `apps/web` ; la
retirer casse `types:web`, parce que `generated/api/zod/**` l'importe. La
cause est dans la configuration : la base de la flotte met
`**/generated/**` dans `ignore`, ce qui retire ces fichiers du périmètre
ENTIER — leurs imports ne comptent plus, donc une dépendance que seul le
client généré utilise passe pour morte.

`knipSatellite()` déclare désormais le client généré en `entry` plutôt que
de l'ignorer : il n'est ni signalé comme mort — une entrée ne l'est jamais —
ni invisible. Vérifié : knip rend alors `zod` en dépendance NON DÉCLARÉE
quand on la retire, ce qui est la vérité.

Le câblage de knip lui-même attend le socle 0.9.0 : il lui faut
`@eqs/tooling/knip-satellite`, parce que knip 6 n'a pas de champ `extends`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Relancer l'API pendant qu'une instance tourne échouait systématiquement
sous Windows : le binaire du moteur Prisma est verrouillé par tout processus
Node qui l'a chargé.

    EPERM: operation not permitted, rename
      '...\.prisma\client\query_engine-windows.dll.node.tmp102972' -> '...'

Le message ne nomme ni Prisma ni la cause. On cherche un problème de droits,
un antivirus, un `node_modules` corrompu — et pendant ce temps l'API qui
tourne encore laisse croire que tout va bien, jusqu'à ce qu'on se demande
pourquoi le code modifié ne prend pas.

Et ce n'est pas un cas limite : relancer après un changement de variable,
après un `git checkout`, ou parce qu'un agent a redémarré la pile, c'est le
cas NORMAL en développement.

Le client est déjà produit au `postinstall` et par `db:dev` (`prisma migrate
dev` régénère). Le rejouer à chaque démarrage ne protégeait de rien.

`db:schema` reste : la copie d'`auth.prisma` depuis `@eqs/auth` est
idempotente, rapide, et c'est elle qui garde le schéma aligné sur le socle
après une mise à jour.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#62 — deux clones partageaient la même base
────────────────────────────────────────────
Le rapporteur a corrigé son propre ticket : le scénario de dégât était
DÉDUIT, pas joué, et il demandait qu'on le confirme avant de le citer. Fait,
avec deux clones réels :

  docker compose ls  →  un seul projet « template »
  sat-a : template-postgres-1 Up (healthy)
  sat-b : template-postgres-1 Up (healthy)

  sat-a : INSERT 0 1
  sat-b : SELECT → « ecrit depuis sat-a »   (1 row)

Une ligne écrite depuis un clone se lit depuis l'autre. Une migration jouée
dans l'un s'applique à la base de développement de l'autre, et RÉUSSIT : le
mode d'échec n'est pas une erreur, c'est un succès sur la mauvaise base.

`name: ${SERVICE_NAME:?…}` refuse désormais de lever sans nom, en le
nommant, et `.env.example` livre la variable VIDE. Le schéma de @eqs/config
exige déjà deux caractères minimum : un clone qui oublie échoue au premier
démarrage au lieu de réussir sur la base du voisin.

Je n'ai pas vidé les PORTS (son option 3) : un port déjà pris se voit —
« Bind for 127.0.0.1:55400 failed: port is already allocated », constaté
pendant la reproduction. C'est le nom de projet qui ne se voit pas, et lui
seul qui refuse.

#61 — un clone neuf n'est déployé nulle part
─────────────────────────────────────────────
`AGENTS.md` affirmait « Push sur main → Coolify » au présent, alors
qu'`ETAT.md` déclare le projet Coolify inexistant deux fichiers plus loin.
Un agent a lu le premier, en a conclu qu'un push partait en production, et a
posé une question dont la prémisse était fausse.

La section dit maintenant que Coolify est la CIBLE, que c'est `ETAT.md` qui
tranche, et pourquoi : une phrase au présent dans un gabarit est vraie pour
le dépôt qui l'a écrite et devient un piège pour ses trente clones.

Cherché d'autres affirmations d'infrastructure au présent dans AGENTS.md et
README.md : aucune autre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
# Conflicts:
#	apps/api/package.json
#	pnpm-lock.yaml
# Conflicts:
#	AGENTS.md
# Conflicts:
#	apps/web/scripts/next.mjs
#	package.json
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
nicolas-fryder deleted branch chore/tickets-satellite 2026-09-15 21:59:56 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
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-satellite-template!27
No description provided.