Journal Nest structuré, conformité, lint sans cache (#171, #159, #154, #155, #167) #172

Merged
nicolas-fryder merged 6 commits from nicolas-fryder/dev into main 2026-10-17 13:37:44 +00:00 AGit

#171 journal Nest JSON + request_id (non additif : LOG_FORMAT= dans .env.example). #159 valider strict. #154 baseline du dispositif. #155 coolify.builds-paralleles-secret. #167 pts 7-8. Lint sans --cache + testing.lint-en-cache (chasse 58). pnpm check vert. 🤖 Generated with Claude Code

#171 journal Nest JSON + request_id (non additif : LOG_FORMAT= dans .env.example). #159 valider strict. #154 baseline du dispositif. #155 coolify.builds-paralleles-secret. #167 pts 7-8. Lint sans --cache + testing.lint-en-cache (chasse 58). pnpm check vert. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
L'audit porte tests.checkSequentiel (schéma 1.2.0, facultatif). Le delta
range à part une durée mesurée autrement des deux côtés : la baseline de
poste (69 s, parallèle) face à la CI (397 s, séquentielle) affichait un
« changement » à chaque run. La source de hooks.* précise qu'en CI elle
prouve que le dépôt branche ses hooks, pas que les postes les ont.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`docker compose build` construit les services en parallèle ; deux builds
qui montent le même secret de build (`npmrc`, la forme de D-033/D-036)
peuvent faire lâcher la session BuildKit : « only one connection
allowed », build annulé, `exit code 255` sans erreur de compilation.
Mesuré chez ATLAS (Coolify 4.1.2, app + worker), intermittent.

La règle (écart) signale chaque paire de services qui partagent un
secret de build sans que l'un attende l'autre par `additional_contexts`
`service:`, directement ou transitivement. `depends_on` et les contextes
non `service:` ne comptent pas pour un ordre. Le `faire` donne la parade
d'ATLAS.

Au passage : les `build.secrets` en forme longue (`{ source, target }`)
sont lus, au lieu de passer pour un secret non défini.

Doc §13 : la règle, et où lire un 255 sans erreur (journalctl -u docker).
Chasse 54 : le compose par défaut du gabarit (api + web) et sa variante
une-adresse sont signalés par la règle, à corriger dans le gabarit.

Closes #155

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`routesDeConformiteNext` déclarait le corps de `POST __eqs/conformite/valider`
sans `.strict()` : `next.validation` envoie un champ inconnu, exige 422, et la
route du socle rendait 200. La règle ne pouvait passer chez aucun satellite
next-fullstack qui s'appuie sur ces routes, et son `faire` l'envoyait
corriger son propre `withApi`.

- `.strict()` sur le corps ;
- `conformite-routes-du-socle.test.ts` joue `next.validation`, et le groupe
  `errors` qui vise ces routes, par `demarrerRoutes` dans un dépôt sans
  route, sans `routeValidation` fournie : rouge avant, vert après ;
- `imputerAuSocle` : dans `runNextConformance`, un problème relevé sur une
  route `__eqs/conformite/*` dit que le défaut est au socle.

Chasse 54.

Closes #159

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(testing): les contrôles du dispositif appliquent eqs-baseline.json (#154)
All checks were successful
ci / porte (push) Successful in 5m43s
ci / secrets (push) Successful in 8s
ci / vulns (push) Successful in 42s
ci / sast (push) Successful in 42s
ci / workflows (push) Successful in 8s
ci / securite (push) Successful in 0s
20f33ee51e
Depuis #149, les harnais de profil appliquent les dispenses aux problèmes
réels ; le groupe « dispositif de test » de `runConformance` levait sur
tout problème. `testing.check-budget` dispensé restait rouge dans la suite
et couvert sous `eqs doctor`.

- `jouerControleDuDispositif` : le corps de chaque cas, sorti du `it` pour
  être éprouvé sans framework, filtre par `sansDispenses` depuis `root` ;
  une dispense échue ne couvre plus ;
- `dispensesEnVigueur` (dispenses.ts) : la seule définition d'une dispense
  qui couvre. `sansDispenses` et `reglesDispensees` y passent ; la seconde
  relisait le fichier à part, retenait une dispense sans auteur et la
  gardait le jour même de sa revue.

Tests rouges puis verts : rapport-conformite.test.ts (dispensé, échu,
autre règle), conformance.test.ts (sans auteur, jour de la revue).
Chasse 55.

Closes #154

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
createEqsApp() pose par défaut EqsLogger (@eqs/telemetry/nest) : le Logger
de Nest écrit les lignes JSON de creerLogger() (masquage, OTLP), contexte
en `contexte`, message en `message`, au niveau de LOG_LEVEL (debug = tout,
info = log compris, défaut info). LOG_FORMAT=texte (nouveau, baseSchema,
défaut json) rend le ConsoleLogger de Nest pour un poste. L'option
`logger` accepte un LoggerService ; une liste de niveaux marche encore.

request_id sur chaque ligne émise pendant une requête : un
AsyncLocalStorage sous Symbol.for('eqs.contexte-requete'), posé par
requestIdMiddleware (run, jamais enterWith) et par withApi côté Next, lu
par creerLogger — sans nouvelle dépendance entre @eqs/errors et
@eqs/telemetry. Le filtre d'erreurs écrit sa 5xx en `requete.erreur` à
champs au lieu de la phrase `[req:…]`.

Documenté : le nommage d'un worker (SERVICE_NAME distinct, et son préfixe
Redis). D-085, chasse 54. Non additif : chaque satellite ajoute
`LOG_FORMAT=` à son .env.example.

Closes #171

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(testing): la porte lance ESLint sans --cache ; testing.lint-en-cache le garde
All checks were successful
ci / porte (push) Successful in 5m40s
ci / secrets (push) Successful in 7s
ci / vulns (push) Successful in 18s
ci / sast (push) Successful in 41s
ci / workflows (push) Successful in 7s
ci / securite (push) Successful in 0s
ci / porte (pull_request) Successful in 5m41s
ci / secrets (pull_request) Successful in 7s
ci / vulns (pull_request) Successful in 42s
ci / sast (pull_request) Successful in 40s
ci / workflows (pull_request) Successful in 8s
ci / securite (pull_request) Successful in 0s
63f28bd178
Le cache d'ESLint n'est invalidé que par le contenu du fichier et la config,
jamais par les types qu'il importe, et la config du socle est typée. Mesuré :
a.ts inchangé, b.ts qui se met à rendre `any` — avec --cache, ESLint rend 0 ;
sans, no-unsafe-assignment refuse. Dans `eqs check` d'un satellite, c'est un
faux vert à chaque montée du socle ; dans le hook de pré-commit, un refus
périmé qui pousse au --no-verify (vu en intégrant #171).

- `eqs check` : la tâche lint perd --cache (Prettier garde le sien).
- `.githooks/pre-commit` : idem.
- `testing.lint-en-cache` (écart) : script de package.json ou ligne de hook
  qui lance ESLint avec --cache. Socle 0, gabarit 0 (corrigé), eqs-demo 1,
  ATLAS 2.

Chasse 58.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
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!172
No description provided.