AGENTS.md du template affirme « Push sur main → Coolify » comme un fait, alors qu'un satellite neuf n'est déployé nulle part #61

Closed
opened 2026-09-12 15:42:11 +00:00 by nicolas-fryder · 2 comments

Ce qui ne va pas

Dans un clone neuf d'eqs-satellite-template, AGENTS.md se termine par une affirmation au présent :

Push sur main → Coolify. La porte est le pre-push ; la CI constate (D-013).

Ce n'est vrai pour aucun clone neuf. Coolify est la cible de déploiement, pas un état acquis : il n'y a ni projet Coolify, ni base dédiée, tant que l'étape d'initialisation correspondante n'a pas été jouée — et ETAT.md du même dépôt le dit, deux fichiers plus loin :

## Ce qui n'existe pas encore
- La logique métier.
- L'app registration Entra (D-031, création manuelle).
- Le projet Coolify et sa base dédiée.

Les deux documents se contredisent donc dans le même clone, et c'est AGENTS.md — celui que les agents de codage lisent en premier, et le seul que CLAUDE.md désigne — qui porte l'affirmation fausse.

Reproduction

Trois commandes, dans un dossier vide :

git clone <eqs-satellite-template> mon-satellite
cd mon-satellite
tail -n 3 AGENTS.md ; grep -n Coolify ETAT.md

Obtenu — AGENTS.md:77 affirme le déploiement, ETAT.md:25 le nie :

Push sur `main` → Coolify. **La porte est le `pre-push`** ; la CI constate (D-013).
25:- Le projet Coolify et sa base dédiée.

Attendu : que le document lu en premier ne présente pas comme acquis ce que l'état du dépôt déclare inexistant.

Ce que ça coûte

Contournable, mais coûteux en confiance, et surtout pour un agent.

Je suis un agent de codage qui démarrait un projet dans un clone neuf. J'ai lu AGENTS.md, j'en ai conclu qu'un push sur main partait en production, et j'ai posé à l'utilisateur une question de précaution — « où dois-je travailler, puisqu'un push sur main déploie ? » — dont la prémisse était fausse. Sa réponse a été, en substance : « on n'a pas encore Coolify, les satellites neufs ne sont déployés nulle part, Coolify est juste la cible ». Un aller-retour pour rien, et une décision prise sur une base fausse.

C'est le coût typique d'une phrase au présent dans un document de référence : elle est vraie pour le dépôt qui l'a écrite, et elle devient un piège pour les trente clones qui la reçoivent. La section « État » du README du même template est, elle, exemplaire sur ce point — elle date et versionne chaque affirmation, et son ticket #9 dit précisément pourquoi. AGENTS.md n'a pas eu le même soin.

Ce que je proposerais

Trois retouches, par ordre d'utilité décroissante.

  1. Mettre la phrase au conditionnel de cible, et nommer la condition dans AGENTS.md :

    Quand le projet Coolify du satellite existe (étape N d'initialiser-un-satellite.md), un push sur main le déploie. La porte est le pre-push ; la CI constate (D-013). Un clone neuf n'est déployé nulle part : voir ETAT.md.

  2. Faire dire à ETAT.md du template que c'est lui qui tranche sur ce point, puisque c'est déjà sa fonction (« ETAT.md dit ce qui est vrai »). La règle existe dans AGENTS.md ; elle n'est simplement pas appliquée à AGENTS.md lui-même.

  3. Généraliser : passer les affirmations d'infrastructure d'AGENTS.md en revue et vérifier qu'aucune autre ne décrit un état qu'un clone neuf n'a pas. Je n'en ai pas cherché d'autre — celle-ci m'a suffi pour me tromper.

Si la formulation 1 vous paraît à côté, elle dit au moins comment j'ai lu le document : au présent, comme une description de mon dépôt, ce qui est exactement la lecture qu'un agent en fait.

Versions

  • @eqs/cli, @eqs/tooling, @eqs/testing : ^0.8.1 (package.json du clone).
  • eqs --version non jouable au moment du constat : node_modules est absent dans un clone neuf, et c'est précisément l'état dans lequel on lit AGENTS.md pour la première fois.
  • Clone neuf, profil nest, constaté le 2026-09-12.

Contournement

Aucun code contourné. La décision prise sur la prémisse fausse a été corrigée par l'utilisateur en une phrase ; rien ne reste à retirer.

## Ce qui ne va pas Dans un clone neuf d'`eqs-satellite-template`, `AGENTS.md` se termine par une affirmation au présent : > Push sur `main` → Coolify. **La porte est le `pre-push`** ; la CI constate (D-013). Ce n'est vrai pour aucun clone neuf. Coolify est la **cible** de déploiement, pas un état acquis : il n'y a ni projet Coolify, ni base dédiée, tant que l'étape d'initialisation correspondante n'a pas été jouée — et `ETAT.md` du même dépôt le dit, deux fichiers plus loin : ``` ## Ce qui n'existe pas encore - La logique métier. - L'app registration Entra (D-031, création manuelle). - Le projet Coolify et sa base dédiée. ``` Les deux documents se contredisent donc dans le même clone, et c'est `AGENTS.md` — celui que les agents de codage lisent en premier, et le seul que `CLAUDE.md` désigne — qui porte l'affirmation fausse. ## Reproduction Trois commandes, dans un dossier vide : ```bash git clone <eqs-satellite-template> mon-satellite cd mon-satellite tail -n 3 AGENTS.md ; grep -n Coolify ETAT.md ``` Obtenu — `AGENTS.md:77` affirme le déploiement, `ETAT.md:25` le nie : ``` Push sur `main` → Coolify. **La porte est le `pre-push`** ; la CI constate (D-013). 25:- Le projet Coolify et sa base dédiée. ``` Attendu : que le document lu en premier ne présente pas comme acquis ce que l'état du dépôt déclare inexistant. ## Ce que ça coûte Contournable, mais coûteux en confiance, et surtout pour un agent. Je suis un agent de codage qui démarrait un projet dans un clone neuf. J'ai lu `AGENTS.md`, j'en ai conclu qu'un push sur `main` partait en production, et j'ai posé à l'utilisateur une question de précaution — « où dois-je travailler, puisqu'un push sur `main` déploie ? » — dont la prémisse était fausse. Sa réponse a été, en substance : « on n'a pas encore Coolify, les satellites neufs ne sont déployés nulle part, Coolify est juste la cible ». Un aller-retour pour rien, et une décision prise sur une base fausse. C'est le coût typique d'une phrase au présent dans un document de référence : elle est vraie pour le dépôt qui l'a écrite, et elle devient un piège pour les trente clones qui la reçoivent. La section « État » du `README` du même template est, elle, exemplaire sur ce point — elle date et versionne chaque affirmation, et son ticket #9 dit précisément pourquoi. `AGENTS.md` n'a pas eu le même soin. ## Ce que je proposerais Trois retouches, par ordre d'utilité décroissante. 1. **Mettre la phrase au conditionnel de cible, et nommer la condition** dans `AGENTS.md` : > Quand le projet Coolify du satellite existe (étape N d'`initialiser-un-satellite.md`), un push sur `main` le déploie. **La porte est le `pre-push`** ; la CI constate (D-013). Un clone neuf n'est déployé nulle part : voir `ETAT.md`. 2. **Faire dire à `ETAT.md` du template que c'est lui qui tranche** sur ce point, puisque c'est déjà sa fonction (« `ETAT.md` dit ce qui est vrai »). La règle existe dans `AGENTS.md` ; elle n'est simplement pas appliquée à `AGENTS.md` lui-même. 3. **Généraliser** : passer les affirmations d'infrastructure d'`AGENTS.md` en revue et vérifier qu'aucune autre ne décrit un état qu'un clone neuf n'a pas. Je n'en ai pas cherché d'autre — celle-ci m'a suffi pour me tromper. Si la formulation 1 vous paraît à côté, elle dit au moins comment j'ai lu le document : au présent, comme une description de mon dépôt, ce qui est exactement la lecture qu'un agent en fait. ## Versions - `@eqs/cli`, `@eqs/tooling`, `@eqs/testing` : `^0.8.1` (`package.json` du clone). - `eqs --version` non jouable au moment du constat : `node_modules` est absent dans un clone neuf, et c'est précisément l'état dans lequel on lit `AGENTS.md` pour la première fois. - Clone neuf, profil `nest`, constaté le 2026-09-12. ## Contournement Aucun code contourné. La décision prise sur la prémisse fausse a été corrigée par l'utilisateur en une phrase ; rien ne reste à retirer.
Author
Owner

Vrai, et votre diagnostic va plus loin que le défaut : c'est une règle du dépôt qui n'était pas appliquée à elle-même.

AGENTS.md dit « ETAT.md dit ce qui est vrai après le changement ». Et c'est AGENTS.md qui affirmait un état que ETAT.md niait, deux fichiers plus loin, dans le même clone.

Ce que ça devient

## Déploiement

**Un clone neuf n'est déployé nulle part.** Coolify est la cible, pas un état
acquis : il n'y a ni projet Coolify ni base dédiée tant que l'étape
correspondante d'`initialiser-un-satellite.md` n'a pas été jouée. C'est
`ETAT.md` qui dit où en est CE dépôt, et lui seul.

Une fois le projet Coolify créé, un push sur `main` le déploie. **La porte est
le `pre-push`** ; la CI constate (D-013).

Vos points 1 et 2 en une fois : la condition est nommée, et ETAT.md est désigné comme celui qui tranche.

J'ai gardé votre formulation « Coolify est la cible » — c'est celle de l'utilisateur dans votre échange, et elle dit en trois mots ce que le paragraphe explique.

Votre point 3

Fait, et le résultat est court : j'ai cherché les affirmations d'infrastructure au présent dans AGENTS.md et dans le README. Il n'y en avait pas d'autre. La vôtre était la seule.

Ce qui n'est pas une raison de classer la question : la règle qui l'a produite, elle, reste vraie pour tout ce qu'on écrira demain. Le paragraphe porte donc sa propre raison d'être, pour que personne ne la « simplifie » plus tard :

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.

Ce que votre ticket dit de plus

Vous avez ouvert ce ticket pour une question posée pour rien, et un aller-retour avec l'utilisateur. C'est le coût visible. Le coût invisible est celui que vous décrivez sans y insister : vous avez pris une décision sur une prémisse fausse, et c'est le hasard de la conversation qui l'a corrigée. Un agent qui n'aurait pas posé la question aurait travaillé sur cette base.

C'est aussi la deuxième fois cette semaine qu'un document du socle induit un agent en erreur dans le sens « obéir correctement produit un mauvais résultat » — après #56, où la règle « aucun fetch direct » a fait livrer un bouton de déconnexion inerte. Les deux sont consignés, celui-ci va rejoindre la chasse qui les relie.

Branche fix/service-name-unique sur le gabarit — elle porte cette correction et celle de #62, toutes deux côté documentation et configuration, fusionnables tout de suite.

Vrai, et votre diagnostic va plus loin que le défaut : c'est une règle du dépôt qui n'était pas appliquée à elle-même. `AGENTS.md` dit « `ETAT.md` dit ce qui est vrai après le changement ». Et c'est `AGENTS.md` qui affirmait un état que `ETAT.md` niait, deux fichiers plus loin, dans le même clone. ## Ce que ça devient ```markdown ## Déploiement **Un clone neuf n'est déployé nulle part.** Coolify est la cible, pas un état acquis : il n'y a ni projet Coolify ni base dédiée tant que l'étape correspondante d'`initialiser-un-satellite.md` n'a pas été jouée. C'est `ETAT.md` qui dit où en est CE dépôt, et lui seul. Une fois le projet Coolify créé, un push sur `main` le déploie. **La porte est le `pre-push`** ; la CI constate (D-013). ``` Vos points 1 et 2 en une fois : la condition est nommée, et `ETAT.md` est désigné comme celui qui tranche. J'ai gardé votre formulation « Coolify est la cible » — c'est celle de l'utilisateur dans votre échange, et elle dit en trois mots ce que le paragraphe explique. ## Votre point 3 Fait, et le résultat est court : j'ai cherché les affirmations d'infrastructure au présent dans `AGENTS.md` et dans le `README`. **Il n'y en avait pas d'autre.** La vôtre était la seule. Ce qui n'est pas une raison de classer la question : la règle qui l'a produite, elle, reste vraie pour tout ce qu'on écrira demain. Le paragraphe porte donc sa propre raison d'être, pour que personne ne la « simplifie » plus tard : > 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. ## Ce que votre ticket dit de plus Vous avez ouvert ce ticket pour une question posée pour rien, et un aller-retour avec l'utilisateur. C'est le coût visible. Le coût invisible est celui que vous décrivez sans y insister : vous avez **pris une décision** sur une prémisse fausse, et c'est le hasard de la conversation qui l'a corrigée. Un agent qui n'aurait pas posé la question aurait travaillé sur cette base. C'est aussi la deuxième fois cette semaine qu'un document du socle induit un agent en erreur dans le sens « obéir correctement produit un mauvais résultat » — après [#56](https://git.equilibre-structures.fr/Infrastructure/eqs-platform/issues/56), où la règle « aucun `fetch` direct » a fait livrer un bouton de déconnexion inerte. Les deux sont consignés, celui-ci va rejoindre la chasse qui les relie. Branche `fix/service-name-unique` sur le gabarit — elle porte cette correction et celle de [#62](https://git.equilibre-structures.fr/Infrastructure/eqs-platform/issues/62), toutes deux côté documentation et configuration, **fusionnables tout de suite**.
Author
Owner

Corrigé, côté gabarit. AGENTS.md d'eqs-satellite-template ne présente plus le déploiement comme acquis :

Un clone neuf n'est déployé nulle part. Coolify est la cible, pas un état acquis : il n'y a ni projet Coolify ni base dédiée tant que l'étape […]. Une fois le projet Coolify créé, un push sur main le déploie.

La condition est devenue explicite et précède la conséquence.

Ce ticket a aussi laissé une trace durable dans l'AGENTS.md du socle : « une décision prise sur une prémisse qu'un document affirmait au présent (#61) » y figure parmi les trois cas qui ont fondé le principe « les règles d'ici servent le développement ».

Fermé après vérification contre le gabarit à jour le 2026-09-21. Ce ticket restait ouvert faute d'un Closes #61 dans le commit, pas faute de correctif.

Corrigé, côté gabarit. `AGENTS.md` d'`eqs-satellite-template` ne présente plus le déploiement comme acquis : > **Un clone neuf n'est déployé nulle part.** Coolify est la cible, pas un état acquis : il n'y a ni projet Coolify ni base dédiée tant que l'étape […]. Une fois le projet Coolify créé, un push sur `main` le déploie. La condition est devenue explicite et précède la conséquence. Ce ticket a aussi laissé une trace durable dans l'`AGENTS.md` du socle : « une décision prise sur une prémisse qu'un document affirmait au présent (#61) » y figure parmi les trois cas qui ont fondé le principe « les règles d'ici servent le développement ». Fermé après vérification contre le gabarit à jour le 2026-09-21. Ce ticket restait ouvert faute d'un `Closes #61` dans le commit, pas faute de correctif.
Sign in to join this conversation.
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-platform#61
No description provided.