Skip to content

feat(ventilation): ne reprendre la ligne q4pa_conv du DPE qu'en analyse de corpus (option compat_for_corpus_analysis) - #324

Merged
michaeldesigaud merged 1 commit into
mainfrom
feat/compat-corpus-q4pa
Oct 28, 2026
Merged

michaeldesigaud merged 1 commit into
mainfrom
feat/compat-corpus-q4pa

Conversation

@elliot-redfroggy

Copy link
Copy Markdown
Collaborator

Contexte

Décision : la reprise n'est conservée que pour l'analyse de corpus, derrière une option explicite. Les ~75 autres conditions bug_for_bug_compat sont inchangées.

Option compat_for_corpus_analysis

calcul_3cl(dpe, { sanitize: true, compat_for_corpus_analysis: true }) (idem calcul_3cl_xml).

Sites conditionnés

Analyse de corpus mise à jour (option activée)

  • test/corpus/corpus_worker.mjs (rapports npm run test:corpus*) : { sanitize: true, compat_for_corpus_analysis: true }.
  • test/run_benchmark.js : { sanitize: false, compat_for_corpus_analysis: true } (sanitisation inchangée).
  • Specs de corpus test/*.spec.js (+ test/‎test/open3cl-coeff-1-7.spec.js) : constante CORPUS_ANALYSIS_OPTIONS (test/test-helpers.js) = { sanitize: true, compat_for_corpus_analysis: true }, soit la sanitisation par défaut qu'ils utilisaient déjà. test/open3cl-sanitize.spec.js est laissé tel quel.
  • test/open3cl-q4pa-ligne-dpe.spec.js : 2287E1201982M avec l'option → q4pa_conv 2 (DPE) ; par défaut → 4,6 (méthode) ; option non conservée d'un appel à l'autre ; scénario 2469E2650374G murs isolés → q4pa_conv 2, classe E.

Mesures (corpus complet : corpus_immeuble + corpus_autres, 89 972 DPE)

Harnais : chaque DPE est calculé (entrée clonée, logs coupés, set_tv_match_optimized_version()) par origin/main (f9ac5d9, { sanitize: true }), par la branche avec l'option et par la branche par défaut. ok = pour chacun des 4 postes conso_ch, conso_ecs, ep_conso_5_usages (ou _m2), emission_ges_5_usages (ou _m2), écart relatif ≤ 5 % au DPE ADEME (coeff_2_3_… pour l'EP des DPE antérieurs au 01/01/2026).

(1) Branche option activée vs main : 0 différence sur 89 972 DPE (Cep, classes énergie/GES, ok, erreurs, q4pa_conv et empreinte de logement.sortie complète).

(2) Branche par défaut vs main (89 921 DPE calculés par main, 51 en erreur/null des deux côtés, aucune nouvelle erreur) :

Indicateur Valeur
Conformité 79,621 % (71 596) → 79,276 % (71 286), −310
OK→KO / KO→OK 342 / 32
q4pa_conv modifié 918 DPE (principales transitions 2,5→4,6 : 295 ; 2→4,6 : 213 ; 1,9→2 : 197)
Cep modifié 850
Classe énergie modifiée 187 (D→E 57, E→F 53, F→G 43, C→D 32, B→C 1, A→B 1) ; classe GES : 118
|Cep−Cep_ADEME|/Cep_ADEME ≤ 5 % → > 5 % : 351 ; > 5 % → ≤ 5 % : 44
OK→KO par logiciel LICIEL 205, puis versions 3.0.5 (20), 3.1.1 (17), 3.0.4 (13), 3.0.3 (11), 2.0.4 (11)…
OK→KO par corpus autres 257, immeuble 85

Ces DPE sont précisément ceux dont la ligne q4pa_conv contredit les données saisies : c'est le coût attendu, que le contrôle client doit faire apparaître.

(3) Scénario Kardino réel (2469E2650374G, murs isolés, calcul_3cl_xml) : par défaut, q4pa_conv 2, Cep 324 kWh/m²/an, classe E. Avec l'option, le résultat est identique (2 / 324 / E), et non 4,6 / 402 F : sur origin/main actuel, b16eaca (reprise « sens unique ») protège déjà ce cas (ligne « non isolée » contredite par des parois isolées → pas de reprise). Le DPE d'origine (non modifié) donne 4,6 / 533 G dans les trois configurations.

Tests

Note de version

Changement de comportement par défaut (q4pa_conv recalculé sans reprise) → montée de version mineure + entrée de changelog. Les intégrateurs qui reproduisent le corpus ADEME doivent passer compat_for_corpus_analysis: true (et sanitize: true explicitement, puisque sanitize vaut false dès qu'un objet d'options est fourni).

…se de corpus

Un client contrôle les DPE soumis en les recalculant avec le moteur : un écart de plus de 5 %
entraîne un rejet. Certains logiciels (LICIEL notamment) retiennent une ligne q4pa_conv qui
contredit l'isolation déclarée des parois ou les joints des menuiseries ; en la reprenant
(#312, #294) le moteur masquait l'erreur. Les scénarios de travaux (Kardino) propageaient aussi
une ligne devenue obsolète.

Nouvelle option `compat_for_corpus_analysis` de calcul_3cl / calcul_3cl_xml (défaut false) :
- false : q4pa_conv est toujours recalculé selon la méthode, une ligne contradictoire est
  seulement signalée ;
- true : reprise de la ligne du DPE (#312) et des joints quand presence_joint n'est pas exporté
  (#294), en legacy comme dans la nouvelle architecture, pour reproduire le corpus ADEME.

Le drapeau est repositionné à chaque appel. Les specs de corpus, le worker du rapport de corpus
et le benchmark activent l'option : leurs résultats sont inchangés.
Changement de comportement par défaut sur q4pa_conv : montée de version mineure.
@michaeldesigaud
michaeldesigaud merged commit 09f6122 into main Oct 28, 2026
12 of 16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants