JulesandClaude Fable 5.1 4f593d2edf Épingles : écarts correctifs face à l'épingle d'origine, écarts d'harmonisation refigés (05/10)
L'épingle d'origine (fixtures/sorties-origine-2026-09-28.json, générée depuis
le code d'astro-pro) porte les défauts corrigés par 91c755f (eg_phytostation ×3
sur C/eau, basse_planche_bec ×2 sur B et C/alim, lignes forcées orphelines,
FORCE ×4 dans le journal, A/eau par axe en INSUFFISANT). La regénérer depuis
astro-pro reproduirait les défauts ; la regénérer depuis ce paquet en ferait
une épingle sur soi-même. Elle reste donc telle quelle, et :

- scripts/ecarts-correctifs.mjs + fixtures/ecarts-correctifs-2026-10-05.json :
  chaque cellule (profil × mode × axe × champ) qui s'écarte de l'origine est
  figée, avec le détail des lignes ; une cellule absente doit rester identique.
- test/decoupage.test.mjs : test 1 compare aux écarts figés (et vérifie qu'un
  correctif n'introduit jamais un INSUFFISANT ni un total hors ±5 % en global ;
  budgets alloués et poids des axes inchangés) ; test 2 vérifie la propriété du
  découpage contre selectionner() de ce paquet ; test 3 inchangé dans l'esprit.
- Écarts d'harmonisation REFIGÉS (npm run ecarts -- --ecrire 2026-10-05) après
  relecture de docs/CONSTANTES.md : neuf lignes au lieu de onze. Les deux lignes
  perdues (A énergie global 22 → 6 %, C énergie par axe 10 → 3 %) étaient des
  taux calculés sur des kWc fantômes hérités par une batterie ; la couverture y
  est null avec les deux tables. Aucun coefficient ne change. Note datée posée
  dans CONSTANTES.md §1. (La suppression du fichier du 28/09 est partie par
  erreur dans 8465bf7, avec la version : même intention, deux commits.)
- fixtures/README.md et AGENTS.md (règles 6 et 8) : l'épingle d'origine ne se
  regénère pas pour absorber un correctif ; invariants tenus depuis v0.1.1.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tgtn7bJxTLiL2fRCkQMgtR
2026-10-05 16:39:51 +02:00
2026-10-05 16:39:16 +02:00
2026-10-05 16:39:16 +02:00

@transformer/moteurs

Moteurs de calcul purs pour la rénovation et l'autonomie d'une maison, partagés par calculs.trans-former.fr et plateforme.trans-former.fr. Un moteur reçoit des entrées et des données, rend des sorties avec ses sources et ses avertissements, et ne lit rien d'autre : ni réseau, ni disque, ni horloge. Jamais de prix dans le paquet : les prix, barèmes et tables sont des données publiées ailleurs et injectées.

Licence MIT (le contenu de la plateforme reste sous sa propre licence).

Ce que le paquet contient (v0.1.0)

Moteur (id) Entrées Données injectées Sorties
commun.contexte code postal france_climat département (Corse 2A/2B, DOM 97x), zone RT, zone biogéographique, pluviométrie, DJU
commun.geometrie emprise, niveaux, hauteur, pente, mitoyenneté, SHAB connue (facultatif) — murs extérieurs et opaques, vitrage, toiture, plancher bas, SHAB estimée, volume
autonomie.eau · autonomie.energie · autonomie.alimentation autodiag, budget d'axe, contexte postes, options, algo_config postes retenus (typologie, dimension, coût), alternatives, statut, journal des couplages, taux de couverture de l'axe
autonomie.integrateur autodiag, budget total, mode global (= calculs) ou par_axe (= plateforme), axes actifs idem + france_climat contexte, poids d'axes, budget par axe, sélection par axe, total, statut, taux par axe

Plus, dans commun : la table des coefficients (COEFFICIENTS), valider(table, json), les helpers d'argent (fourchettes, mensualité, annuité) ; dans autonomie : le noyau V2 complet (autonomie.noyau.selectionner), les taux de couverture et les prix d'options (prixOption, prixPreset).

Consommer

"dependencies": {
  "@transformer/moteurs": "git+https://git.trans-former.fr/jules/moteurs.git#v0.1.0"
}

Toujours une étiquette (#vX.Y.Z), jamais une branche : deux sites qui ne calculent pas pareil sans que personne ne le sache est exactement le risque à éviter. Le dépôt est public, dist/ est committé : l'installation ne demande aucune étape de build, seulement git sur la machine qui fait npm ci (piège connu : node:22-alpine n'a pas git → apk add --no-cache git).

import { contexte, eau, integrateur, valider } from '@transformer/moteurs'

// 1. les données viennent de l'extérieur (URL publiée, instantané daté…) et se valident à la frontière
for (const [table, json] of Object.entries(donnees)) {
  const v = valider(table, json)
  if (!v.ok) throw new Error(v.erreurs.join('\n'))
}

// 2. contexte depuis le code postal
const ctx = contexte.calculer({ code_postal: '31170' }, { france_climat: donnees.france_climat }).sorties

// 3. un moteur d'axe sur son budget
const r = eau.calculer(
  { autodiag: { nb_personnes: 4, surface_toit_m2: 80, surface_parcelle_m2: 800, orientation_toit: 'sud-est', temps_dispo: 2 }, budget_axe: 14000, contexte: ctx },
  { postes: donnees.postes, options: donnees.options, algo_config: donnees.algo_config },
)
r.sorties.postes            // typologies retenues, dimensions, coûts
r.sorties.taux_couverture   // % du besoin substituable couvert
r.sources                   // chaque coefficient et chaque prix utilisés, avec source et date
r.avertissements            // chaque défaut appliqué, chaque donnée manquante
r.version                   // '0.1.0'

Le mode global de l'intégrateur reproduit exactement le simulateur de calculs (pipeline complet, couplages et réajustement entre axes) ; le mode par_axe calcule chaque branche du menu sur son budget et additionne.

Sous-chemins : @transformer/moteurs/commun, /autonomie, /autonomie/eau, /autonomie/energie, /autonomie/alimentation, /autonomie/integrateur, /autonomie/noyau, /schemas/<table>.schema.json, /fixtures/<fichier> (algo-config.json, profils-reference.json).

Les coefficients

Chaque grandeur physique existe une fois, dans src/commun/coefficients.ts, avec sa source et sa date ; la version lisible est docs/CONSTANTES.md (ancienne valeur → retenue, source, ce que ça change). Les heuristiques de conception du simulateur (poids d'axes, matrices, tolérances) sont des données : fixtures/algo-config.json, injectées.

Développer

npm install          # typescript seulement
npm test             # build (tsc → dist/, schémas) puis node --test test/ — hors ligne
npm run ecarts       # table des écarts origine → harmonisée sur les trois profils de référence

Règles du dépôt et carte détaillée : AGENTS.md. Jeux de données figés : fixtures/README.md.

Publier une étiquette

npm test vert → git commit (avec dist/ et schemas/ reconstruits) → git tag vX.Y.Z → git push && git push --tags → monter la version chez les consommateurs le même jour. Patch = correction de formule ; mineur = nouvelle sortie ou nouveau moteur ; majeur = entrée modifiée.

S
Description
@transformer/moteurs — moteurs de calcul purs (autonomie, isolation, estimatif) partagés par calculs.trans-former.fr et plateforme.trans-former.fr. Jamais de prix dans le paquet.
Readme MIT
270 KiB
Languages
TypeScript 66.4%
JavaScript 33.6%