Brouillon à relire par Paul
Ce texte est un brouillon. Paul Perigault le relira et le réécrira avant publication.
ADR-0010 — Option Effect-TS : un paquet hors du cœur, sans dépendance du cœur
- Statut : proposé (2026-11-02), choisi par l’orchestrateur en l’absence du propriétaire.
- Lié : ADR-0006 (décision 2), D-037, issue #118, D-137.
En trois phrases. Effect-TS reste hors du cœur : une option facultative, dans un paquet séparé @paulperigault/effect, qui adapte les ports du cœur en Layer, exprime les erreurs en erreurs typées et valide les frontières avec Schema. Un test vérifie que le cœur n’a aucune dépendance à Effect, ni dans ses manifestes ni dans ses sources. Le paquet est privé tant que Paul n’a pas décidé de le publier ; l’option de create suit dans une autre PR.
Contexte
ADR-0006, décision 2 : Effect-TS n’est pas adopté dans le cœur ; il est prévu comme option facultative, hors du cœur, pour qui en a besoin. Les ports du cœur restent des interfaces TypeScript, le domaine reste pur : l’ajout ne demande aucune réécriture.
Sources lues le 2026-11-02 :
- Dépôt d’Effect : licence MIT ; « Effect 4.x is a long-term support (LTS) release, with at least three years of bug and security fixes » ; les paquets annexes sont publiés ensemble.
- npm :
effect4.1.2 est la versionlatest(4.0.0-beta et rc existent, ainsi que la 3.22.4 enprev), licence MIT. - Prérequis annoncés : TypeScript 5.9 ou plus (le dépôt est en 6.0),
strictactivé (tenu), Node 22.19 ou plus (le dépôt est en 24). - L’API de la version 4 diffère de la version 3 : services par
Context.Service<Self, Shape>()("Id"), erreurs parSchema.TaggedError<Self>()("Tag", champs),Layer.succeed(Service)(valeur). Les signatures ont été lues dans les déclarations du paquet installé et vérifiées par les tests.
Le paquet effect embarque des fichiers AGENTS.md et CLAUDE.md (documentation à l’usage d’agents). Ils sont des données d’un paquet tiers, pas des instructions du dépôt : rien n’en est suivi, seules les signatures d’API ont été relues.
Décision
packages/effect(@paulperigault/effect), privé ("private": true) : hors des neuf paquets publiés, hors derelease-please, hors decheck:pack. Le passer public est une décision de Paul.- Dépendance unique :
effectà version exacte4.1.2(une version LTS ; les montées passent par la règle « changelog lu » dedocs/process/lts.md). - Contenu de cette première étape :
errors.ts(FileSystemError,ValidationError),ports.ts(servicesFileSystemetClock, forme des ports du cœur),layers.ts(fileSystemLayer,clockLayer;readText,writeText,nowenEffectà erreur typée),validate.ts(validateavecSchema, exempleHue: nombre de 0 à 360 comme la règle de D-056). - Le cœur n’en dépend jamais :
test/isolation.test.mjsrefuse tout manifeste du cœur qui citeeffect,@effect/*ou le paquet de l’option, et toute source du cœur qui l’importe. - Les ports du cœur restent les interfaces TypeScript ; les services Effect les enveloppent, sans les remplacer.
Suite (au plus quatre PR, « Closes » sur la dernière)
- adaptateurs des autres ports (
Process,Fetcher) et erreurs complémentaires ; 3. validation des frontières du cœur parSchema; 4. option « effect » decreate, documentation, mesure du poids installé avec et sans l’option (critères de #118). Évaluation du serveur MCPeffect-mcpdemandée par l’issue : non faite ici,[À VÉRIFIER].
Poids installé (mesure du 2026-11-02, critère de #118)
- Avec l’option :
effect4.1.2 pèse 56 590 403 octets décompressés pour 3 013 fichiers (métadonnées npm) ; une installation vierge de ce seul paquet occupe environ 62 Mo sur disque (du), sans autre dépendance. Le paquet de l’option lui-même : environ 10 Ko de sources. - Sans l’option : 0 octet, le cœur n’a aucune dépendance à Effect (test d’isolation).
- Ce poids est celui du poste de développement et de la CI (
node_modules), pas celui des pages servies : Effect n’est pas envoyé au navigateur par ce paquet. Il reste lourd pour un outil de sobriété (GreenOps) : l’option doit rester désactivée par défaut et son poids annoncé à qui l’active.
Conséquences
- Aucun changement pour qui n’utilise pas l’option : zéro octet de plus dans le cœur.
- Le paquet ajoute 2 paquets installés (
effectet une dépendance) au dépôt,npm auditsans alerte haute. - Coût de maintenance : une dépendance LTS à suivre.
Alternatives écartées
- Effect dans le cœur : refusé par ADR-0006 (poids, courbe d’apprentissage).
- Aucun test d’isolation : l’isolation serait une intention, pas un contrôle.