Repository navigation
feat(ventilation): ne reprendre la ligne q4pa_conv du DPE qu'en analyse de corpus (option compat_for_corpus_analysis) - #324
Merged
Conversation
…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
approved these changes
Oct 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Contexte
q4pa_convqui contredit l'isolation déclarée des parois ou les joints des menuiseries. Depuis Renouvellement d'air : ligne q4pa_conv du DPE incohérente avec l'isolation des parois (2287E1201982M, +12 % ep) #312 (c090c47 / b16eaca) et Renouvellement d'air : presence_joint absent sur toutes les menuiseries — reprendre la valeur du DPE (q4pa 2,5) en bug_for_bug #294 (0e8b1a2), le moteur reprend cette ligne (sousbug_for_bug_compat) : l'erreur du logiciel est masquée et ces DPE passent le contrôle.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_compatsont inchangées.Option
compat_for_corpus_analysiscalcul_3cl(dpe, { sanitize: true, compat_for_corpus_analysis: true })(idemcalcul_3cl_xml).false(défaut) :q4pa_convest toujours recalculé selon la méthode à partir des données d'entrée ; une ligne contradictoire est seulement signalée (console.error).true: reprise de la lignetv_q4pa_conv_iddu DPE (Renouvellement d'air : ligne q4pa_conv du DPE incohérente avec l'isolation des parois (2287E1201982M, +12 % ep) #312) et des joints quandpresence_jointn'est pas exporté (Renouvellement d'air : presence_joint absent sur toutes les menuiseries — reprendre la valeur du DPE (q4pa 2,5) en bug_for_bug #294), pour reproduire les DPE du corpus ADEME. À ne jamais utiliser pour le contrôle d'un DPE ni pour des scénarios.utils.js:compat_for_corpus_analysis/set_compat_for_corpus_analysis(), sur le modèle debug_for_bug_compat) est repositionné à chaque appel decalcul_3cl; seule la valeur booléennetruel'active.Sites conditionnés
src/4_ventilation.js(tv_q4pa_conv) : reprise de la ligne « surfaces isolées » (Renouvellement d'air : ligne q4pa_conv du DPE incohérente avec l'isolation des parois (2287E1201982M, +12 % ep) #312) et reprise des joints (Renouvellement d'air : presence_joint absent sur toutes les menuiseries — reprendre la valeur du DPE (q4pa 2,5) en bug_for_bug #294) → exigentcompat_for_corpus_analysis(en plus debug_for_bug_compat, qui encadre le bloc).src/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.js(q4paConv) : condition Renouvellement d'air : presence_joint absent sur toutes les menuiseries — reprendre la valeur du DPE (q4pa 2,5) en bug_for_bug #294 →bug_for_bug_compat && compat_for_corpus_analysis.src/engine.js: lecture de l'option + JSDoc ;README.md: tableau « Options de calcul » + exemple.Analyse de corpus mise à jour (option activée)
test/corpus/corpus_worker.mjs(rapportsnpm run test:corpus*) :{ sanitize: true, compat_for_corpus_analysis: true }.test/run_benchmark.js:{ sanitize: false, compat_for_corpus_analysis: true }(sanitisation inchangée).test/*.spec.js(+test/test/open3cl-coeff-1-7.spec.js) : constanteCORPUS_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.jsest 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()) parorigin/main(f9ac5d9,{ sanitize: true }), par la branche avec l'option et par la branche par défaut.ok= pour chacun des 4 postesconso_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_convet empreinte delogement.sortiecomplè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) :
q4pa_convmodifiéCes DPE sont précisément ceux dont la ligne
q4pa_convcontredit 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 : surorigin/mainactuel, 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
4_ventilation.spec.js(les deux valeurs de l'option pour Renouvellement d'air : ligne q4pa_conv du DPE incohérente avec l'isolation des parois (2287E1201982M, +12 % ep) #312 et Renouvellement d'air : presence_joint absent sur toutes les menuiseries — reprendre la valeur du DPE (q4pa 2,5) en bug_for_bug #294),deperdition-ventilation.service.spec.js(drapeau mocké par getter),engine.spec.js(défaut false, options sans le champ, valeur non booléenne, true + sanitisation conservée, réinitialisation entre deux appels, transmission parcalcul_3cl_xml),utils.spec.js(setter).src/4_ventilation.js,src/engine.js,src/utils.js(src/features/**est exclu de la mesure par la config).main(specs de corpus dépendant de fixtures absentes) ; aucune nouvelle régression.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(etsanitize: trueexplicitement, puisquesanitizevautfalsedès qu'un objet d'options est fourni).