fokan/docs/pilier-logement.md
Gautier Stefanini 6870e027c0 Rejouer le quiz effaçait des contrats et un délai de travaux encore ouvert
Trois régressions silencieuses au rejeu, une par question posée.

Les contrats étaient remplacés comme les véhicules, au motif qu'une liste
rejouée n'a pas d'identité stable. C'est vrai d'une voiture, faux d'un
contrat : son type vient d'une énumération fermée. On appariait donc rien
alors qu'il n'y avait rien à deviner, et on payait l'état utilisateur de la
seule saisie opt-in du produit.

La déclaration de travaux ne gardait qu'un mois pour tout le logement. Une
piscine finie en juin et une véranda finie en août partageaient une date
limite — celle de la dernière déclarée, l'autre disparaissant avec son sujet.
Un mois par chantier, un sujet par mois, et deux chantiers du même mois
restent une visite unique au service des impôts. Le formulaire repart à vide
à chaque rejeu, parce que la question porte sur ce qui vient d'arriver ; le
logement, lui, accumule et oublie à treize mois.

Enfin, carte-grise-changement-adresse attendait depuis sa publication un
demenagement_recent que personne n'écrivait. On attendait un écran de
correction d'adresse pour le poser ; le rejeu du quiz le fait depuis le
28/07, il tient les deux adresses dans la même fonction. On pose le mois,
jamais un booléen — sans quoi la fiche annoncerait un mois pour la carte
grise à vie, ce que D-059 venait de corriger sur la piscine.

Vérifié sur une copie de la production : deux déclarations foncières
vivantes après rejeu, cinq contrats gardant leur identifiant, un second
rejeu qui ne bouge plus rien. 905 tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 13:37:33 +00:00

61 KiB
Raw Permalink Blame History

Pilier Logement — sources adressables et plan d'implémentation

Document de référence du pilier logement : ce qu'une adresse française permet de savoir gratuitement, ce qu'on en fait, et dans quel ordre. Le cadrage reste la source de vérité produit ; ce document le décline sur un pilier.

Statut des tests : toutes les API marquées ont été appelées réellement le 25 juillet 2026 et ont renvoyé une réponse exploitable, sans clé ni token. Les requêtes exactes sont reproduites pour ne pas avoir à les rechercher.

Adresse d'essai : 5 rue Lafayette, 31000 Toulouselat 43.604992, lon 1.444281, citycode 31555, banId 31555_4920_00005.

Mise à jour du 30 juillet 2026 (audit-2026-07-30.md) — trois choses ont changé depuis la rédaction de ce document, dont une erreur de fait :

Ce que ce document dit Ce qui est vrai depuis
Phases 0/1/2 livrées, phases 3 et 4 « à l'état de plan » Toujours vrai — mais une carte des périmètres réglementaires est entrée dans le produit (D-022 → D-030), avec cinq couches dont quatre viennent du pilier logement : nucléaire, sécheresse, PPRT, inondation. Le § 4 et le § 5 en portent les corrections (D-024 sur les rayons de PPI, D-027 et D-029 sur les zones d'eau)
Fermeture du cuivre : « non testé — pas d'API propre » (§ 2.6, § 6) Faux, et vérifiable en un appel — puis livré le 30/07/2026 (D-031) : table fermeture_cuivre recopiée chaque semaine, fiche fermeture-cuivre, et une question au quiz (fibre / ADSL / je ne sais pas), la seule chose du logement qu'aucune source publique ne sache dire
Deux couches de carte relèvent de ce pilier Trois depuis le 30/07/2026 : la couche inondation est entrée (D-031 § 5), et elle donne enfin un tracé à inondation-gestes, qui était muette depuis sa création
Le § 4 décrit un périmètre d'iode unique Corrigé par D-024 : un rayon par site, et un PPI n'implique pas la distribution de comprimés. Le § 9 en porte le détail

État d'avancement (25 juillet 2026)

Phase 0 : livrée, déployée, vérifiée en production. Voir le détail par item en § 3 (chaque case cochée renvoie au fichier réel). Résumé :

  • Adapter ADEME réparé (0.a) et renforcé au-delà du plan initial : jointure identifiant_ban, prise du DPE le plus récent en confiance haute pour une maison (peu importe le nombre de diagnostics à cette adresse — ce n'est jamais que le même logement au fil du temps), et enrichissement par unanimité pour les appartements en confiance basse (type, chauffage, periodeConstruction proposés seulement s'ils sont identiques sur tout l'échantillon DPE de l'immeuble — jamais l'étiquette ni la validité, qui restent propres à un logement précis). Voir src/adapters/adresse.ts.
  • Identifiants d'adresse conservés (0.b) — citycode/banId/lat/lon jusqu'à l'asset logement.
  • revision-loyer-irl corrigée (0.c) — v3, exclut les logements F/G confirmés.
  • Les 6 fiches calendaires (0.d) — livrées, validées par simulation (voir plus bas).
  • Au-delà du plan initial : le principe des trois niveaux de vérité (§ 1) est implémenté, pas seulement conçu — écran de confirmation DPE dans le quiz (src/app/quiz/quiz-client.tsx), avec bouton Annuler en cas de clic trop rapide, fonction pure testée (src/knowledge/dpe-confirmation.ts). Un bug de report (le chip visuel ne s'écrivait pas dans les réponses déclarées si l'utilisateur n'y touchait pas) a été trouvé et corrigé au passage, pour le type de logement et le chauffage.
  • Matrice de correspondance chauffage (au-delà du plan initial, demandée en cours de route) : src/knowledge/dpe-chauffage.ts remplace la détection par sous-chaîne par une correspondance exacte et exhaustive des 155 valeurs de générateur + 15 valeurs d'énergie principale publiées par l'ADEME — c'est elle qui distingue enfin une PAC d'un simple radiateur électrique (les deux affichaient "Électricité" côté énergie principale, seul le générateur les sépare).
  • Validation par simulation : 5 profils de quiz couvrant chaque branche d'applicabilité (positive et négative) + les 8 fiches contrat testées via l'opt-in — 50 fiches sur 51 déclenchées correctement. La 51ᵉ (carte-grise-changement-adresse, pilier véhicules) s'est révélée être une condition morte : rien dans l'application ne pose jamais demenagement_recent sur un asset véhicule — à corriger ou retirer, indépendamment de ce document.
  • Contrats intégrés au quiz (D-006, cf. docs/decisions.md) : décision cross-pilier, hors périmètre de ce document — mentionnée ici seulement parce qu'elle a été validée par la même méthode de simulation.

Phase 1 : livrée, déployée, vérifiée en production. Voir le détail en § 4. Résumé :

  • Adapter src/adapters/georisques.ts — quatre endpoints indépendants (rapport de risques, argile, radon, débroussaillement), aucun bloquant pour les autres, aucune clé.
  • Appelé pendant l'écran de fabrication qui suit le quiz, sous plafond de 8 s, avec repli sur une file pg-boss au-delà (src/jobs/enrichissement-georisques.ts). Le fond de tâche seul, tenté d'abord, faisait manquer la révélation : le hub se rendait 6 s avant que les risques n'existent — corrigé par D-009.
  • Les 6 fiches annoncées, toutes déclenchées sur des adresses réelles.
  • Arbitrage tranché en cours de route (D-008, docs/decisions.md) : un aléa du lieu est lu directement par le moteur, sans confirmation, contrairement à une donnée qui décrit le logement (le DPE). Demander à quelqu'un de valider le classement radon de sa commune serait une question mémoire posée à moins informé que la source.
  • Trois garde-fous ajoutés au plan initial, chacun né d'un relevé réel : seul le statut à l'adresse est lu ; une zone de débroussaillement n'est retenue que si son code commune est celui de l'adresse (l'endpoint renvoie volontiers celle du voisin) ; le volet technologique se limite aux installations classées, la pollution des sols et les canalisations étant « Concerne » à l'adresse dans la moitié des villes sans qu'aucun travail n'en découle.

Phase 2 : livrée, déployée, vérifiée en production. Voir le détail en § 5. Résumé :

  • La seule évolution du moteur de réconciliation depuis son écriture : la clé devient template × asset × sujet (§ 5.c). Sans elle, deux arrêtés CatNat sur la même commune se seraient écrasés l'un l'autre — le second aurait remplacé la date limite du premier, en silence, sur un délai d'assurance.
  • Deux adapters (catnat.ts, vigieau.ts), deux fiches, une table arretes_commune, une file quotidienne à 3 h.
  • Une limite mesurée qui conditionne la valeur réelle de 5.a : GASPAR recopie le Journal officiel par lots, avec une latence de plusieurs semaines que data.gouv.fr reconnaît lui-même. Un arrêté peut arriver après épuisement de ses 30 jours ; dans ce cas rien n'est annoncé.
  • Le garde-fou du § 5.e est livré côté filtrage, pas côté budget d'envoi — il n'y a pas encore de moteur de notification à contraindre.

Phases 3 et 4 : toujours à l'état de plan, non entamées.


1. Les trois niveaux de vérité

Règle fondatrice du pilier, posée avant toute implémentation. Elle découle de § 4.2 du cadrage (inférence > saisie) et de sa limite : un propriétaire fait des travaux sans refaire son DPE, un diagnostic de 2019 décrit un logement qui n'existe plus.

Niveau Origine Droits
déclaré le quiz, l'utilisateur crée des échéances
confirmé l'utilisateur a validé une proposition crée des échéances
dérivé DPE, Géorisques, Hub'Eau… peut seulement poser une question

Résolution : déclaré > confirmé > dérivé.

Invariant nouveau : une valeur dérivée ne produit jamais une échéance à elle seule. Elle produit une question modulaire, ou rien.

Précisé par D-008 (25/07/2026) à la livraison de la Phase 1 : l'invariant vise les valeurs qui décrivent le logement — celles qu'un chantier peut démentir sans que la source le sache. Une valeur qui décrit le lieu (zone de débroussaillement, potentiel radon de la commune, exposition du sol aux argiles, périmètre d'un PPI) n'est pas réfutable par l'occupant : il n'a pas de meilleure information que l'État, et lui demander de la confirmer serait une question mémoire posée à moins informé que la source. Ces attributs-là (risque_*, cf. § 4) sont donc lus directement par le DSL, sans passer par contexte.

Stockage, sans nouvelle table :

assets.attributes = {
  ...déclaré,                    // le quiz, inchangé
  contexte: { … },               // dérivé + horodaté, JAMAIS lu par applicabilite.when
  contexte_confirme: { … }       // validé par l'utilisateur, lu par le moteur
}
assets.provenance = "detection_adresse"   // valeur déjà prévue dans src/db/schema.ts

Conséquence : src/engine/applicability.ts et src/engine/reconcile.ts restent inchangés — le DSL ne lit que du déclaré et du confirmé.

Les questions modulaires

Une seule à la fois, jamais bloquante, « je ne sais pas » toujours de première classe.

Situation Comportement
type_batiment = maison et 1 seul DPE et statut_geocodage = "adresse géocodée ban à l'adresse" proposition pré-cochée : « Le diagnostic de ta maison date du 30/07/2024 : chauffage électrique, VMC simple flux. Toujours d'actualité ? »[oui] [j'ai changé le chauffage] [j'ai isolé] [je ne sais pas]
appartement, ou ≥ 2 DPE au même identifiant_ban on ne propose rien. Au mieux : « Plusieurs diagnostics à cette adresse — le tien, c'est lequel ? » (surface + étage), avec un « passer » visible
aucun résultat silence, le quiz continue
DPE de plus de 2 ans une question de fraîcheur : « Des travaux d'isolation ou de chauffage depuis ? »

Preuve par l'exemple : sur l'adresse d'essai, la jointure exacte renvoie 2 DPE — un appartement de 24,5 m² étage 4 étiqueté F, et un de 42,3 m² étiqueté D. Proposer une valeur ici serait faux une fois sur deux.

Le test du geste (risques)

Un risque a le droit d'être remonté — au même titre qu'un rappel constructeur : échéance dormante, personne ne surveille, forte valeur quand ça tombe. La règle n'est pas « pas de risques », c'est :

Un risque n'entre dans le hub que s'il produit un geste concret et réalisable. S'il n'y a rien à faire, il n'y a rien à dire.

Passe le test Ne passe pas
Zone inondable → surélever le tableau électrique, batardeau, ne pas stocker en sous-sol, connaître le point de coupure « Votre commune est en zone sismique 1 »
Argile → photographier et dater les fissures (c'est la preuve qui manque à l'expertise CatNat) Un score de risque global
Radon zone 3 → kit de dépistage 30 €, à poser pendant la saison de chauffe Une carte des aléas à consulter
Périmètre de distribution d'iode → pastilles gratuites en pharmacie Un compteur « 4 risques sur votre commune »

Et les interdits du cadrage tiennent : pas de dashboard à tenir, pas de rouge, pas de score, pas de comptabilité morale. Le ton reste déculpabilisant — on informe une fois, on propose un geste, on se tait.


2. Catalogue des sources

2.1 Socle d'identité

Source Appel État
BAN — géocodage, citycode, banId, lat/lon GET https://api-adresse.data.gouv.fr/search/?q=<adresse>&type=housenumber&limit=5 testé — déjà utilisé par src/adapters/adresse.ts

Le champ properties.id (ex. 31555_4920_00005) est la clé de jointure exacte avec le DPE. Il est aujourd'hui jeté — voir Phase 0.b.

2.2 Bâtiment et performance énergétique

Source Appel État
Observatoire DPE ADEME — logements existants (9,77 M lignes) GET https://data.ademe.fr/data-fair/api/v1/datasets/dpe03existant/lines?qs=identifiant_ban:"<banId>"&size=20&sort=-date_etablissement_dpe&select=<champs> implémenté (src/adapters/adresse.ts) — jointure exacte, size=20 (relevé depuis 5, cf. § 3.0.a)
Observatoire DPE ADEME — logements neufs .../datasets/dpe02neuf/lines testé (HTTP 200), non exploité
BDNB (CSTB) — données au bâtiment GET https://api.bdnb.io/v1/bdnb/donnees/batiment_groupe_complet?code_commune_insee=eq.<insee>&limit=1 testé — licence à vérifier avant usage
RNB — référentiel national des bâtiments GET https://rnb-api.beta.gouv.fr/api/alpha/buildings/?insee_code=<insee> testé — exige bbox, insee_code ou cle_interop_ban

Corrigé : le dataset dpe-v2-logements-existants (mort, HTTP 404) a été remplacé par dpe03existant dans src/adapters/adresse.ts.

Matrice de correspondance chauffage — implémentée (src/knowledge/dpe-chauffage.ts) : la détection par sous-chaîne initialement envisagée pour type_generateur_chauffage_principal/type_energie_principale_chauffage a été remplacée par une correspondance exacte et exhaustive, construite à partir du relevé réel des 155 valeurs de générateur + 15 valeurs d'énergie (GET .../values/<champ>?size=1000). Testée (10 cas) : distingue notamment une PAC d'une chaudière électrique, deux installations qui partagent pourtant la même énergie principale déclarée (« Électricité »).

Champs utiles retournés (tous vérifiés présents) :

etiquette_dpe · etiquette_ges · periode_construction · annee_construction (souvent null)
type_batiment · surface_habitable_logement · hauteur_sous_plafond · nombre_niveau_logement
type_energie_principale_chauffage · type_generateur_chauffage_principal · type_installation_chauffage
type_ventilation · type_energie_principale_ecs · zone_climatique (H1a…H3) · classe_altitude
cout_total_5_usages · date_etablissement_dpe · date_fin_validite_dpe
identifiant_ban · statut_geocodage · score_ban · complement_adresse_logement · id_rnb

⚠️ annee_construction est souvent nullmesuré le 26/07/2026 sur 500 DPE : renseignée à 57 %, contre 100 % pour periode_construction (tranche : « avant 1948 »). Ne pas convertir la tranche en nombre — ce serait inventer une donnée.

Implémenté (D-010) : les deux sont désormais reportées dans les réponses du quiz et résolues en un attribut unique epoque_construction (avant_1949 / 1949_1997 / apres_1997, cf. src/knowledge/construction.ts), lu directement par le DSL — la datation est la seule caractéristique du DPE qu'aucun chantier ne peut démentir, elle ne passe donc pas par l'écran de confirmation. Elle ouvre les fiches plomb-crep et amiante-etat. La tranche « 1989-2000 » chevauche le pivot amiante du 1er juillet 1997 et ne produit rien : c'est là que l'année exacte, quand elle existe, fait la différence.

2.3 Risques (Géorisques — API v1, sans token)

Endpoint Appel État
Rapport de risques à l'adresse GET https://georisques.gouv.fr/api/v1/resultats_rapport_risque?latlon=<lon>,<lat>&rayon=1000 implémenté (src/adapters/georisques.ts) — 12 risques naturels + 6 technologiques en un appel
Débroussaillement (OLD) GET .../api/v1/old?latlon=<lon>,<lat> implémenté — 404 propre hors zone ; ⚠️ peut renvoyer la zone d'une commune voisine, filtrage sur le code INSEE obligatoire
Arrêtés CatNat GET .../api/v1/gaspar/catnat?code_insee=<insee>&page_size=500 testé — données fraîches (dernier arrêté vu : 23/01/2026) ; Phase 2
Argile (RGA) à l'adresse GET .../api/v1/rga?latlon=<lon>,<lat> implémenté{"codeExposition":"2","exposition":"Exposition moyenne"} ; corps vide possible (relevé à Paris)
Radon GET .../api/v1/radon?code_insee=<insee> implémentéclasse_potentiel 1/2/3
Zonage sismique GET .../api/v1/zonage_sismique?code_insee=<insee> testé
Risques de la commune (GASPAR) GET .../api/v1/gaspar/risques?code_insee=<insee> testé
ICPE GET .../api/v1/installations_classees?code_insee=<insee>&rayon=1000 testé

Attention à l'ordre des coordonnées : latlon= attend en réalité <longitude>,<latitude>.

resultats_rapport_risque distingue, pour chaque risque, libelleStatutCommune et libelleStatutAdresse — c'est cette distinction qui rend l'info actionnable plutôt qu'anxiogène. Exemple réel sur l'adresse d'essai : inondation « Risque Existant » sur la commune mais « Risque non Connu » à l'adresse, alors que la remontée de nappe est « Risque Existant » à l'adresse.

Risques couverts : inondation · remonteeNappe · risqueCotier · seisme · mouvementTerrain · reculTraitCote · retraitGonflementArgile · avalanche · feuForet · eruptionVolcanique · cyclone · radon / icpe · nucleaire · canalisationsMatieresDangereuses · pollutionSols · ruptureBarrage · risqueMinier.

Réponse de old (testée sur Cassis et Bormes-les-Mimosas) : commune, coordonnées, URL de l'arrêté préfectoral, date d'approbation, et le flag zoneUrbaine qui détermine l'étendue de l'obligation.

⚠️ Les API v2 exigent un jeton (compte Cerbère ou FranceConnect, valable 1 an) ; la v1 reste libre mais l'État annonce une évolution. Quotas et SLA non documentés — à surveiller.

2.4 Eau

Source Appel État
VigiEau — restrictions en vigueur GET https://api.vigieau.beta.gouv.fr/api/zones?lon=<lon>&lat=<lat>&commune=<insee>&profil=particulier testé — niveau, arrêté (dates + PDF), usages restreints nominatifs
SANDRE — tracé d'une zone d'alerte GET https://services.sandre.eaufrance.fr/geo/zas (WFS 2.0, outputFormat=geojson, filtre OGC sur gid) testé — 334 ko et 0,7 s pour une zone (D-027)
Hub'Eau — dureté de l'eau GET https://hubeau.eaufrance.fr/api/v1/qualite_eau_potable/resultats_dis?code_commune=<insee>&code_parametre_se=TH&size=1&sort=desc testé — 7.3 °f, prélèvement du 26/05/2026
Hub'Eau — conformité, nitrates, pesticides même endpoint sans filtre code_parametre_se testé — conclusion_conformite_prelevement, nom_distributeur

VigiEau renvoie niveauGravite (vigilance / alerte / crise), l'arrêté avec dateDebutValidite / dateFinValidite et son PDF, et la liste des usages avec concerneParticulier. Testé : zone Garonne aval, niveau alerte, arrêté valable jusqu'au 31/10/2026.

Il n'en sert aucune géométrie, et c'est ce qui a longtemps coûté cher : le seul jeu national qui les porte pèse 399 Mo pour tout le pays. Mais VigiEau déclare idSandre, l'identifiant de la zone au référentiel SANDRE — dont le WFS, lui, rend un tracé à la demande. C'est cette jointure qui permet à la carte d'être complète dès le quiz (D-027).

⚠️ Le SANDRE ne publie que des zones SUP et SOU. Une zone « eau potable » de VigiEau pointe alors sur la géométrie de sa zone superficielle — vérifié à Tressin (2160393 SUP et 2160402 AEP renvoient toutes deux vers le SANDRE 1072). C'est une équivalence déclarée par VigiEau, pas une observation généralisée : c'est l'une des deux réserves qui justifient de garder le fichier national en filet.

⚠️ Ce serveur est un MapServer, comme celui de Géorisques, et il partage son travers d'annoncer application/json dans ses capacités tout en le refusant — c'est geojson. En revanche il honore les filtres d'attribut, là où Géorisques les ignore en silence. Deux serveurs de la même famille, deux comportements : rien ne se suppose.

2.5 Urbanisme, énergie, services

Source Appel État
API Carto / GPU — servitudes d'utilité publique GET https://apicarto.ign.fr/api/gpu/assiette-sup-s?geom={"type":"Point","coordinates":[<lon>,<lat>]} testé — 63 servitudes, dont ac1 « Périmètre des abords » (rayon 500 m, monument nommé)
API Carto / GPU — zonage PLU GET https://apicarto.ign.fr/api/gpu/zone-urba?geom=<point> testé
API Carto / GPU — prescriptions GET https://apicarto.ign.fr/api/gpu/prescription-surf?geom=<point> testé (0 résultat sur l'adresse d'essai)
France Chaleur Urbaine — éligibilité réseau de chaleur GET https://france-chaleur-urbaine.beta.gouv.fr/api/v1/eligibility?lat=<lat>&lon=<lon> testé — distance, gestionnaire, réseau futur, inPDP
Annuaire de l'administration — mairie, ARS, DDT GET https://api-lannuaire.service-public.fr/api/explore/v2.1/catalog/datasets/api-lannuaire-administration/records?where=code_insee_commune="<insee>" and pivot like "mairie" testé — horaires, site, SIREN
Annuaire RGE ADEME GET https://data.ademe.fr/data-fair/api/v1/datasets/liste-des-entreprises-rge-2/lines?q=<cp> testé — entreprise, domaine, lien_date_fin de qualification, géopoint

2.6 Jeux de données (pas d'API dédiée)

Donnée État
Zonage ABC (tension du marché) data.gouv — « Liste des communes selon le zonage ABC » jeu national identifié, non intégré
Communes « recul du trait de côte » data.gouv — liste nationale jeu national identifié
Base nationale consolidée des ZFE (BNZFE) transport.data.gouv.fr implémentée (D-011) — 35 périmètres, seuils Crit'Air, dates et arrêtés ; table zfe_zones rafraîchie par cron. Rien n'est gravé chez nous : une abrogation viderait la table et archiverait les fiches d'elle-même
Potentiel radon par commune (IRSN) data.gouv identifié — redondant avec l'API Géorisques
Fermeture du cuivre par commune GET https://data.economie.gouv.fr/api/explore/v2.1/catalog/datasets/fermeture-reseau-cuivre/records?where=code_insee%3D%22<insee>%22 testé le 30/07/2026 — 35 305 communes, indexé par code INSEE. Rend fermeture_commerciale, fermeture_technique, annee_fermeture_technique, lot et un message output_usager rédigé par l'État. Sur Toulouse : fermeture commerciale au 31/01/2027, lot 7 en présélection. 20 617 communes portent déjà une date technique — 766 en 2026, 2 155 en 2027, 6 824 en 2028, 10 702 en 2029. La ligne précédente (« pas d'API propre ») était fausse
Plans d'exposition au bruit (PEB/PGS) départemental uniquement, pas de jeu national non testé
Arrêtés termites départemental uniquement non testé
quefairedemesdechets (ADEME) https://quefairedemesdechets.ademe.fr/api/lieux?latitude=&longitude= ⚠️ testé — réponse vide, endpoint à confirmer

2.7 Ce qui n'existe pas au national

Jours de collecte des déchets · horaires de bricolage et bruit de voisinage (arrêtés préfectoraux) · communes à permis de louer · communes à ravalement obligatoire · barèmes d'encadrement des loyers. Se traitent par un lien vers la mairie via l'annuaire de l'administration — c'est du contenu, pas de la personnalisation.


3. Phase 0 — « zéro nouvelle source »

Valeur maximale, coût minimal. Rien à intégrer : on répare ce qui est cassé, on cesse de jeter ce qu'on possède, on ajoute des fiches purement calendaires.

0.a — Réparer et durcir l'adapter existant — LIVRÉ

src/adapters/adresse.ts :

  • dpe-v2-logements-existantsdpe03existant (le premier est 404).
  • Passer de ?q=<texte libre> à ?qs=identifiant_ban:"<banId>", tri -date_etablissement_dpe, size=20 (relevé au-delà de la cible initiale de 5 : un immeuble parisien testé aligne 232 logements sur le même banId — 5 était un échantillon trop mince pour que l'unanimité ci-dessous veuille dire quelque chose).
  • select élargi aux champs de 2.2.
  • Niveau de confiance implémenté (§ 1) — affiné en cours de route par rapport au plan initial :
    • Maison : confiance haute dès que le plus récent des DPE trouvés est géocodé exactement — peu importe leur nombre. Plusieurs DPE sur l'adresse unique d'une maison ne sont jamais que son propre historique de diagnostics.
    • Appartement (adresse partagée par plusieurs logements) : confiance basse, mais type, chauffage et periodeConstruction restent proposés s'ils sont identiques sur tous les DPE de l'échantillon (valeurUnanime, testé) — jamais l'étiquette ni la validité, qui créent une échéance et doivent rester propres à un logement précis.
  • Échecs journalisés (console.error) — le catch {} silencieux d'origine masquait une panne de source complète.
  • Chauffage : la détection par sous-chaîne initialement prévue a été remplacée par une vraie matrice de correspondance, voir src/knowledge/dpe-chauffage.ts et l'entrée correspondante en § 2.2.
Source État du test
ADEME dpe03existant + jointure identifiant_ban testé en production — maison multi-DPE (Sougé-le-Ganelon, PAC), appartement 232 logements (Paris 13ᵉ)

0.b — Cesser de jeter les identifiants de l'adresse — LIVRÉ

QuizAnswers.adresse porte désormais citycode, banId, lat, lon (src/engine/quiz-to-assets.ts), propagés jusqu'aux attributs de l'asset logement.

Même leçon que le champ K de la carte grise : « la perdre obligerait à la redemander pour tout enrichissement ultérieur ».

C'était la seule dette bloquante du pilier — elle ne l'est plus.

0.c — Correctif de justesse, coût nul — LIVRÉ

revision-loyer-irl (v3, knowledge/templates/logement.yaml) exclut désormais les logements avec dpe_etiquette confirmé F ou G, via un nouvel opérateur not_in ajouté au DSL d'applicabilité (src/knowledge/schema.ts, src/engine/applicability.ts). knowledge/pages/revision-loyer.md documente le gel des loyers F/G.

0.d — Fiches nouvelles, aucune source externe — LIVRÉ

Fiche Déclencheur Enjeu Source réglementaire Vérifié en simulation
dpe-fin-validite date_fin_validite_dpe (donnée exacte, stratégie dpe_validite dans windows.ts) administratif DPE valable 10 ans ; ceux d'avant juillet 2021 sont caducs
decence-energetique DPE confirmé F/G + statut propriétaire legal G interdit depuis le 01/01/2025, F au 01/01/2028, E au 01/01/2034
cheque-energie-guichet foyer argent Guichet 1ᵉʳ avril → 31 décembre pour les non-identifiés automatiquement. Sous plafond depuis D-051 : RFR/UC < 11 000 €, la fiche est retirée au foyer qui a déclaré une tranche au-dessus
spanc-controle-periodique equipements contains fosse_septique legal Arrêté du 27 avril 2012 — périodicité ≤ 10 ans ; rapport < 3 ans exigé à la vente
declaration-fonciere-90j equipements contains piscine legal Déclaration GMBI dans les 90 jours après achèvement + taxe d'aménagement
carnet-information-logement statut propriétaire administratif Décret n° 2022-1674 — obligatoire depuis le 01/01/2023, remis à l'acquéreur

Test prioritaire livré : la résolution déclaré > confirmé > dérivé a son propre module pur et testé (src/knowledge/dpe-confirmation.ts, 5 cas), au même niveau d'exigence que reconcile.test.ts.

Validation de bout en bout : 5 profils de quiz construits pour couvrir chaque branche d'applicabilité (positive et négative) du pilier logement — voir la session du 25/07/2026. Cas sensibles confirmés en production : revision-loyer-irl exclue pour locataire+G, réactivée pour locataire+D (non F/G) ; decence-energetique déclenchée uniquement propriétaire+F ; fin-offre-energie-prix-fixe correctement absente pour un chauffage pac seul (ni gaz ni électrique).


4. Phase 1 — Géorisques : un adapter, tout le rapport — LIVRÉE

Valeur très forte, coût d'un adapter et quatre endpoints, sans clé.

src/adapters/georisques.ts, même contrat que adresse.ts : timeout court, dégradation douce, jamais bloquant. Appelé pendant l'écran de fabrication, sous plafond de 8 s (src/jobs/enrichissement-georisques.ts), avec repli sur la file pg-boss enrichissement-georisques au-delà du plafond. L'onboarding reste borné quoi qu'il arrive côté source, et le relevé arrive à temps pour le premier rendu du hub — voir D-009, qui corrige le fond de tâche pur retenu à la livraison initiale.

Fiche Condition (attribut de l'asset logement) Enjeu Source API État
debroussaillement-old risque_debroussaillement: true legal+assurance — jusqu'à 50 €/m² non débroussaillé, contrôles satellite, saisonnier (mars-avril) /api/v1/old?latlon= livrée — déclenchée à Bormes-les-Mimosas
radon-depistage risque_radon: 3 securite — kit ~30 €, mesure pendant la saison de chauffe, seuil 300 Bq/m³ /api/v1/radon?code_insee= livrée — déclenchée à Bormes et Quimper
argile-fissures risque_argile in [moyenne, forte] argent — photographier et dater les fissures : c'est la preuve qui manque à l'expertise CatNat /api/v1/rga?latlon= livrée — déclenchée à Golfech et Feyzin
iode-pastilles risque_iode: true securitegratuit en pharmacie, 20 km autour des centrales EDF, 1 063 communes champ nucleaire du rapport croisé avec le drapeau iode du site (D-024) livrée — déclenchée à Golfech
inondation-gestes risque_inondation: true securite — surélever le tableau électrique, batardeau, ne rien stocker en sous-sol, connaître le point de coupure champs inondation / remonteeNappe du rapport livrée — déclenchée à Golfech
pprt-travaux-prescrits risque_technologique: true argent — travaux financés à 90 %, plafonnés à 20 000 € ou 10 % de la valeur du bien champ icpe du rapport livrée — déclenchée à Feyzin

Ce qui est complet dès le quiz, et ce qui attend un passage (D-027) : tout ce qu'un écran révèle après le quiz est relevé dans le passage d'enrichissement lui-même — risques Géorisques, ZFE, CatNat, restrictions d'eau, et depuis D-027 le contour de la zone d'alerte, moissonné au SANDRE en 0,7 s plutôt que lu dans un fichier national de 399 Mo. Les passages quotidiens veillent sur ce qui évolue ensuite ; ils ne finissent pas le travail du jour même. Seuls les périmètres de PPRT font exception, et c'est assumé : ils se moissonnent par emprise spatiale, sans identifiant à demander.

Formulation obligatoire pour iode-pastilles : la réponse de Géorisques dit qu'une adresse est dans un plan particulier d'intervention, pas qu'elle ouvre droit à des comprimés. Elle répond « Risque Concerne » au pied du CEA de Fontenay-aux-Roses (PPI de 2 km, sans iode) comme à Golfech. La condition croise donc deux sources, et risque_nucleaire seul ne déclenche plus rien — voir D-024.

Formulation obligatoire pour pprt : le rapport donne le risque, pas le périmètre de prescription. La fiche dit « vérifie si ton logement est en zone de prescription » avec le lien préfecture — jamais une affirmation. Même réserve que celle déjà en place pour les rappels constructeur (src/db/schema.ts : « on ne peut jamais affirmer que ta voiture est rappelée »).

Ce que l'implémentation a ajouté au plan

  • Le statut à l'adresse fait seul autorité. statutPositif() ne reconnaît que « Risque Existant » (avec ou sans intensité accolée) et « Risque Concerne », sur libelleStatutAdresse uniquement. Piège évité de justesse : « Risque non Concerne » — le statut le plus fréquent de toute l'API — contient le mot « Concerne », et une comparaison par sous-chaîne aurait inversé le sens par défaut.
  • old renvoie parfois la zone d'une commune voisine. Relevé : un point à Fréjus remonte Mandelieu-la-Napoule, un point à Porto-Vecchio remonte Cozzano. La zone n'est retenue que si son commune.code est celui de l'adresse — une amende à 50 €/m² ne s'affirme pas sur la foi du voisinage.
  • Le volet technologique se limite aux ICPE. pollutionSols et canalisationsMatieresDangereuses ressortent « Concerne » à l'adresse dans la moitié des villes (relevé à Toulouse) sans qu'aucune prescription de travaux n'en découle : les inclure aurait allumé la fiche PPRT pour la moitié des foyers urbains.
  • « Pas de réponse » n'est jamais « pas de risque ». Chaque appel distingue « la source a répondu, il n'y a rien ici » (le 404 de old hors zone, le corps vide de rga à Paris) de « la source n'a pas répondu » — dans le second cas, aucun attribut n'est écrit, et la fiche est simplement absente.
  • Régime de vérité tranché : les attributs risque_* sont lus directement par le DSL, sans confirmation — voir D-008 dans decisions.md et le § 1 ci-dessus.

Rafraîchissement périodique livré (26/07/2026) : rafraichirRisquesTousFoyers rejoue le relevé de tous les foyers en quatrième segment du passage hebdomadaire (dimanche 0h30), après les zones à faibles émissions dont le croisement dépend. Mesuré : 23 foyers, 7 enrichis, 0 échec, 40 s. Une seconde d'écart entre deux foyers — Géorisques n'a ni quota documenté ni SLA. Un foyer dont l'exposition change (la carte des argiles a été refondue en janvier 2026) voit sa fiche apparaître ou s'archiver au passage suivant, en silence.

Reste ouvert : pas de compte Cerbère — l'API v1 suffit, et le jour où elle ferme, seule la fonction appel() de l'adapter est concernée.


5. Phase 2 — La veille événementielle — LIVRÉE

Le meilleur cas d'usage de l'audit, et la seule évolution structurelle du moteur. Jusqu'ici le cron recalculait ; ici il observe le monde extérieur. Voir D-012 dans decisions.md.

5.a — Alerte CatNat — LIVRÉE

Un sinistre n'est indemnisable qu'après un arrêté interministériel, et l'assuré a 30 jours à compter de la publication au JO pour déclarer. Personne ne surveille le JO.

Source État
GET https://georisques.gouv.fr/api/v1/gaspar/catnat?code_insee=<insee>&page_size=500 implémenté (src/adapters/catnat.ts) — pagination suivie, dates JJ/MM/AAAA converties, déduplication sur code_national_catnat

Fiche catnat-declaration-sinistre, stratégie de fenêtre catnat_declaration, un sujet par arrêté.

⚠️ Limite mesurée le 26/07/2026, et c'est le facteur limitant de la phase. La source n'est pas le JO mais le jeu GASPAR, qui le recopie par lots : l'arrêté publié au JO le 12/06/2026 y est (Amigny-Rouy), celui du 17/07/2026 n'y est pas (Saint-Louis-et-Parahou), et data.gouv.fr date la dernière mise à jour du fichier au 08/07/2026 en signalant que « la fréquence de mise à jour n'est pas respectée ». Un arrêté peut donc arriver après épuisement de ses 30 jours — auquel cas rien n'est annoncé, plutôt qu'un rappel arrivé trop tard. Basculer sur le JORF en open data (DILA) est la sortie, au prix d'un appariement nom de commune → code INSEE ; le reste de la chaîne ne bougerait pas.

5.b — Restrictions d'eau — LIVRÉE

Source État
GET https://api.vigieau.beta.gouv.fr/api/zones?lon=&lat=&commune=&profil=particulier implémenté (src/adapters/vigieau.ts) — niveau, arrêté daté + PDF, filtrage sur concerneParticulier

Fiche restriction-eau-usages, stratégie restriction_eau. La fenêtre démarre à la prise d'effet de l'arrêté, pas à sa fin : une contrainte en vigueur aujourd'hui doit se ranger en tête, et un début calé sur « maintenant » aurait fait réécrire la ligne à chaque nuit. Trois garde-fous, chacun né d'un relevé réel : la vigilance ne déclenche rien, une zone sans usage domestique visé est ignorée, et c'est le niveau le plus strict qui s'impose quand plusieurs zones se superposent (relevé à Nantes : alerte renforcée sur l'eau potable, alerte sur la Loire).

5.c — L'évolution du moteur — LIVRÉE

src/engine/reconcile.ts clé désormais sur templateId::assetId::sujet. Rétrocompatible par construction (sujet absent = sujet vide = comportement d'avant), vérifié en base avant déploiement : les 423 échéances existantes portent toutes un sujet vide et ne bougent pas à la réconciliation suivante.

Le DSL d'applicabilité n'a pas changé d'un caractère : il répond toujours « cette fiche concerne-t-elle cet asset », et c'est un module pur séparé (src/engine/sujets.ts) qui répond « combien de fois ». Mettre le comptage dans le DSL aurait fait entrer une notion de cardinalité dans le langage des fiches, pour deux fiches sur soixante-quatre.

Six tests ajoutés à reconcile.test.ts, dont l'inviolabilité de l'état utilisateur avec sujets (un arrêté mis en sourdine n'est jamais réveillé par l'arrivée d'un autre arrêté) et l'idempotence du rejeu.

5.d — Stockage et cron — LIVRÉS

Table arretes_commune (indexée par code INSEE, rétention 12 mois, purge par commune, zéro donnée personnelle) et colonnes deadlines.sujet / deadlines.sujet_label.

File pg-boss veille-arretes-quotidienne à 3 h, une heure avant la réconciliation. Quotidienne et non hebdomadaire : sur un délai de 30 jours, un passage hebdomadaire en consommerait jusqu'à un quart avant de prévenir. Expiration portée à 45 min — le piège des 15 min par défaut, déjà rencontré sur le passage hebdomadaire.

5.e — Garde-fou notifications — LIVRÉ

Le filtrage est en place et il est structurel (§ 5.b ci-dessus) — c'est lui qui empêche le pilier de devenir bavard, et il se lit dans la fiche, pas dans l'adapter.

Le budget d'envoi n'est pas implémenté : il n'existe encore aucun moteur de notification à contraindre. Comblé le 26/07/2026 par D-013 : le scheduler de notifications existe (src/engine/notifications.ts, module pur, 18 tests), avec deux envois par mois et par foyer, trois échéances par envoi, priorité légal > confort, et l'envoi immédiat hors budget pour la reconnaissance CatNat — réservé au couple (enjeu assurantiel, date certaine), donc jamais à une restriction d'eau ni à une fenêtre estimée.

Vérification

Passage quotidien réel : 3 communes, 24 foyers, 0 échec, 14,3 s, dont un foyer en restriction d'eau alerte. Aucune des trois communes réelles n'ayant d'arrêté CatNat ouvert, la chaîne CatNat a été éprouvée sur un foyer de test avec trois arrêtés injectés (deux ouverts, un expiré) : deux échéances distinctes avec leurs sujets et leurs dates limites, l'expiré ignoré, rejeu idempotent, retrait d'un arrêté suivi de l'archivage de la seule échéance concernée. Foyer de test et arrêtés injectés supprimés.


6. Phase 3 — Personnalisation fine

Bonne valeur, mais améliore l'existant plus qu'elle n'ajoute. Sources simples.

Item Ce que ça change Source API État du test
Dureté de l'eau adoucisseur-entretien et chauffe-eau-detartrage tournent sur une fréquence par défaut. À 7 °f l'adoucisseur est inutile et le détartrage s'espace ; au-delà de 25 °f il se resserre Hub'Eau code_parametre_se=TH testé — 7,3 °f
Zone climatique Cale les saisons du moteur : mise en chauffe, hivernage piscine, fenêtre ramonage. Amélioration silencieuse, zéro contenu champ zone_climatique du DPE (déjà récupéré en Phase 0) testé — H2c
Fermeture du cuivre ADSL et ligne fixe coupés par lots : lot 3 janvier 2027, lot 4 en 2028, lot 5 en 2029. Emporte téléalarme, ascenseur, alarme reliée, terminal de paiement jeu fermeture-reseau-cuivre sur data.economie.gouv.fr testé le 30/07/2026 — voir § 2.6. Ce n'est plus un item de Phase 3 mais le meilleur rapport valeur/effort du pilier (audit du 30/07 § 4.2) : la mécanique existe déjà à l'identique — une table indexée par code INSEE, mutualisée entre foyers, rafraîchie au passage hebdomadaire, c'est-à-dire arretes_commune au mot près. Une fiche, un adapter, zéro question au foyer
Réseau de chaleur Se greffe sur chaudiere-gaz-entretien / chaudiere-fioul-entretien au moment du remplacement — pas une fiche autonome France Chaleur Urbaine /api/v1/eligibility testé
Annuaire RGE Alimente les slot_affiliation existants avec des entreprises réellement qualifiées à proximité ADEME liste-des-entreprises-rge-2 testé
MaPrimeRénov' Rendez-vous France Rénov' désormais obligatoire avant dépôt pour la rénovation d'ampleur, réservée aux E/F/G aucune (calendaire + DPE Phase 0)

Effort : ~4-5 jours.


7. Phase 4 — ROI dégressif

Valeur réelle mais effort disproportionné, ou donnée absente au national.

Item Blocage
Aide à l'insonorisation (PGS, 11 aéroports) Très forte valeur individuelle, taux de recours dérisoire — mais les PEB/PGS ne sont publiés qu'au niveau départemental. Il faudrait agréger 11 périmètres à la main
Servitudes ABF / abords de monument historique Testé et disponible (assiette-sup-s, type ac1, rayon 500 m). Mais ce n'est pas une échéance : c'est un avertissement au moment d'un projet de travaux. À réserver au jour où la notion de « projet » existe
Moustique tigre, chenilles processionnaires, ambroisie Gestes simples et peu faits (83 des 96 départements colonisés au 01/01/2026), mais le département suffit — l'adresse n'apporte rien. Bon rapport contenu/effort, faible rapport personnalisation/effort
Copropriété (DPE collectif ≤ 50 lots au 01/01/2026, PPPT) Bloqué sur le nombre de lots, qu'on n'a pas et qu'on ne veut pas demander. Traitable seulement en fenêtre « libre » avec une question opt-in
Termites, permis de louer, ravalement, collecte des déchets, horaires de bricolage Aucune donnée nationale (cf. § 2.7)
ZFE Traité par D-011 (26/07/2026) Le statut reste instable — suppression votée en avril 2026, censurée le 21/05/2026 pour cavalier législatif, donc sur la procédure et non sur le fond. Le blocage n'était pas le sujet mais le fait d'en graver les règles : elles viennent désormais toutes de la base nationale, et le croisement adresse × véhicule se fait à la frontière (src/jobs/enrichissement-zfe.ts), pas dans le DSL

8. RGPD, transverse

  • Stocker les résultats dérivés (classes, booléens, dates), jamais les payloads bruts, jamais l'historique des appels. Cohérent avec « on indexe, on n'archive pas ».
  • banId + lat/lon sont de la localisation précise : même régime que le reste du foyer, purgés avec lui.
  • Les tables de référence externes (arretes_commune) sont indexées par code INSEE — aucune donnée personnelle, purgeables librement, mutualisées entre foyers.

9. Références réglementaires

Textes à reporter dans le champ source: des fiches.

Sujet Texte / source officielle
Débroussaillement (OLD) Code forestier art. L131-10 à L131-16-1 ; loi du 10 juillet 2023 ; information acquéreur/locataire obligatoire depuis le 01/01/2025 ; Service-Public F33298
Décence énergétique Loi Climat & Résilience ; décret n° 2023-796 ; G au 01/01/2025, F au 01/01/2028, E au 01/01/2034 ; ecologie.gouv.fr
Gel des loyers F/G Depuis le 24/08/2022 — ni révision IRL, ni renouvellement, ni relocation ; ecologie.gouv.fr
CatNat — délai de déclaration 30 jours après publication de l'arrêté au JO ; Service-Public F3076 ; economie.gouv.fr
Retrait-gonflement des argiles Décret n° 2019-495 ; arrêté du 22 juillet 2020 ; carte actualisée par arrêté du 9 janvier 2026 (55 % du territoire en zone moyenne ou forte) ; ecologie.gouv.fr
Radon Zone 3 = potentiel significatif, 12,2 M d'habitants, 72 départements ; niveau de référence 300 Bq/m³ ; obligation d'information (IAL) ; ASNR/IRSN
Pastilles d'iode Extension du PPI de 10 à 20 km autour des centrales EDF, 1 063 communes, 2,2 M de personnes ; campagne 10-20 km prévue 2026 ; ASNR
PPI — rayon par site Il n'y a pas un rayon : 20 km autour des 18 centrales EDF en service, 10 km à Marcoule, 5 km à La Hague et Cadarache, 2,5 km au CEA Saclay, 2 km à Fontenay-aux-Roses, 600 m à Romans-sur-Isère ; 56 installations sur 85 n'ont aucun PPI, et un PPI n'implique pas la distribution d'iode. Publié installation par installation par Géorisques (ppi, risque_iode, rayon_ppi, regle_georisques, site) — voir D-024
PPRT — travaux prescrits Loi du 16 juillet 2013 ; aide jusqu'à 90 % (crédit d'impôt + 25 % industriels + 25 % collectivités) ; plafond 20 000 € ou 10 % de la valeur ; ecologie.gouv.fr
Assainissement non collectif Arrêté du 27 avril 2012 — contrôle périodique ≤ 10 ans ; rapport < 3 ans à la vente ; portail interministériel ANC
Carnet d'information du logement Décret n° 2022-1674 du 27 décembre 2022 ; CCH art. L126-35-2 et s. ; Service-Public F36759
Déclaration foncière / taxe d'aménagement 90 jours après achèvement, service GMBI ; impots.gouv.fr ; economie.gouv.fr
Chèque énergie Campagne 2026 : envois automatiques 1ᵉʳ-20 avril, guichet de demande 1ᵉʳ avril → 31 décembre ; economie.gouv.fr
MaPrimeRénov' Guichet rouvert le 23/02/2026 ; isolation des murs et chaudières biomasse exclues depuis le 01/01/2026 ; rénovation d'ampleur réservée E/F/G, RDV France Rénov' obligatoire ; mode d'emploi Anah, mars 2026
DPE collectif / PPPT DPE collectif ≤ 50 lots au 01/01/2026 ; PPPT ≤ 50 lots depuis le 01/01/2025 ; Service-Public F37504 et F36760
Zone tendue Décret n° 2025-1267 du 22 décembre 2025 ; préavis 1 mois, TLV, encadrement ; simulateur Service-Public
Puits, forage, eau de pluie CGCT art. L2224-9 ; arrêté du 17 décembre 2008 ; Cerfa 13837*03 ; télédéclaration DUPLOS depuis le 01/02/2024 ; Service-Public F172
Permis de louer CCH art. L635-1 et s. ; amende jusqu'à 5 000 €, 15 000 € en récidive
Ravalement CCH art. L132-1 à L132-5 — au moins tous les 10 ans sur injonction municipale, dans les communes couvertes par arrêté ; Service-Public F640
Termites Déclaration en mairie sous 1 mois ; zones délimitées par arrêté préfectoral ; Service-Public F285
Insonorisation aéroports Dispositif PGS, 11 aéroports ; plafonds relevés par arrêté publié au JO du 05/01/2024 ; ecologie.gouv.fr
Fermeture du cuivre Fermeture technique du lot 2 le 27/01/2026 ; lot 3 janvier 2027 (2 097 communes), lot 4 en 2028 (6 843), lot 5 en 2029 (10 488) ; Arcep
Moustique tigre 83 des 96 départements métropolitains colonisés au 01/01/2026 ; actif mai-novembre ; sante.gouv.fr
Chenilles processionnaires, ambroisies Décret n° 2022-686 du 25 avril 2022 — espèces dont la prolifération menace la santé humaine
Biodéchets Tri à la source généralisé depuis le 01/01/2024 (obligation portée par la collectivité) ; ecologie.gouv.fr

10. Décisions à trancher

  1. Périmètre de la Phase 0 — tranché : tout livré, y compris 0.b et 0.c.
  2. Forme de la confirmation modulaire — tranché : écran dédié dans le quiz (screen chauffage), pas une question différée dans le hub.
  3. Ordre Phase 2 / Phase 3 — tranché par les faits le 26/07/2026 : la Phase 2 est passée d'abord. reconcile.ts n'a bougé que de sa clé, l'extension est rétrocompatible et vérifiée en base sur les 423 échéances existantes. Nouveau point ouvert à la place : la latence de GASPAR (§ 5.a) est le facteur limitant de la valeur réelle de l'alerte CatNat — basculer sur le JORF en open data (DILA) est la sortie connue, non chiffrée à ce jour.
  4. Jeton Géorisques — tranché à la livraison de la Phase 1 : on reste sur l'API v1 libre. Les quatre endpoints répondent sans clé, et le jour où la v1 ferme, seule la fonction appel() de src/adapters/georisques.ts change (un en-tête d'authentification). Ouvrir un compte Cerbère maintenant aurait coûté une dépendance administrative pour une échéance sans date.
  5. Licence BDNB — toujours ouvert. À vérifier avant tout usage (les autres sources sont en Licence Ouverte / Etalab).
  6. Nouveau, découvert en simulationcarte-grise-changement-adresse (pilier véhicules, hors périmètre maison) est une condition morte : demenagement_recent n'est posé nulle part dans l'application. À traiter séparément.
  7. Rafraîchissement des risques — tranché et livré le 26/07/2026 : hebdomadaire plutôt qu'annuel, en dernier segment du passage du dimanche 0h30. Le job était déjà idempotent, il n'y avait qu'à le rejouer.

Trois points ouverts ajoutés le 30/07/2026 (audit-2026-07-30.md) :

  1. Une couche « inondation » sur la carte — livrée le 30/07/2026 (D-031 § 5). Deux réglages ont dû être corrigés après mesure, et ils valent d'être retenus : la simplification à l'ingestion des PPRT (~20 m) réduisait les fragments urbains à cinq points, or ce contour n'est pas seulement dessiné — c'est lui qu'on interroge pour répondre « suis-je dedans ? » ; et une garde de proximité à 500 m ratait Nîmes de 52 mètres. La garde est passée à un kilomètre, et elle est désormais la même que la marge d'affichage de la couche. Le raisonnement d'origine, conservé ci-dessous, reste juste : c'est l'application la plus nette du critère de D-022 (« une couche se justifie quand la frontière EST la règle ») : dedans, le PPRi prescrit des travaux, l'assurance change, et les gestes de inondation-gestes deviennent concrets. La fiche existe déjà et est aujourd'hui muette et sans tracé. Le WFS de Géorisques publie ms:PPRN_PERIMETRE_INOND, ms:PPRN_COMMUNE_RISQINOND_APPROUV/_PRESCRIT et ms:LIMITETRI_* — relevé dans les capacités le 30/07/2026, même famille de couche que le PPRT_PERIMETRE_RISQIND que src/carte/couches/pprt.ts exploite déjà (moissonnage spatial, calcul de ton, réserve « le périmètre n'est pas la zone de prescription » : tout se recopie). La récupération effective des géométries reste à faire depuis le code : les deux GetFeature tentés en ligne de commande — sur la couche inondation et sur la couche PPRT en production — ont rendu HTTP 200 avec content-length: 0. Comportement identique sur la couche qui marche, donc artefact d'appel et non verdict sur la source.

  2. Deux fiches sans slot_affiliation, alors qu'il y a un artisan au bout : vmc-nettoyage et piscine-securite-dispositif. Le § 10.4 du cadrage fait de ces slots le gisement d'affiliation, et ce sont deux lignes de YAML. (Les cinq autres fiches maison sans actionsredevance-ordures, spanc-controle-periodique, declaration-fonciere-90j, carnet-information-logement — n'ont personne à appeler, et c'est juste.)

  3. fosse-septique-vidange et spanc-controle-periodique portent freq: custom sans interval_years : le libellé de fenêtre retombe sur "récurrent" (windows.ts:430), un mot qui ne dit rien, là où les deux fiches connaissent leur vraie cadence (~4 ans, ≤ 10 ans). Une ligne par fiche.


11. Les fiches sans date, triées — et pourquoi l'iode n'a pas de déclencheur

Ajouté le 07/08/2026 (D-059). Quinze fiches de ce pilier et des autres n'ont jamais de date : leur fenêtre est libre, donc AVANCE_JOURS.libre === null, donc elles n'envoient aucun mail et restent affichées en permanence. Elles ne sont pas de même nature, et le tri se fait sur ce qui les ferait revenir — pas sur leur sujet.

Famille Fiches Ce que « c'est fait » y fait
① Fait une fois, fait à vie plomb-crep, amiante-etat, recensement-jdc, critair-vignette, pprt-travaux-prescrits clôt définitivement — leur fenêtre ne bouge jamais, donc D-058 ne les rouvre jamais
② Un événement du foyer la ramène declaration-fonciere-90j, carte-grise-changement-adresse, fin-offre-energie-prix-fixe clôt cette occasion ; le sujet porte l'occasion, donc la suivante est une ligne neuve
③ Un savoir qui ne se fait pas inondation-gestes, decence-energetique, zfe-restriction-actuelle, courroie-humide-prise-en-charge, chaine-aac-dv5-prise-en-charge, iode-pastilles riencomportement_fait: aucun, l'écran n'affiche aucun geste

Pourquoi iode-pastilles est rangée en ③ alors que c'est un acte

Retirer les comprimés EST une chose qu'on fait. Mais les boîtes périment (« la péremption se compte en années », dit la page, sans pouvoir dire combien — c'est imprimé sur la boîte, et ça dépend du lot), et aucune source publique ne donne le calendrier des campagnes de distribution ASNR. Laisser un foyer clore la fiche lui ferait croire l'affaire réglée jusqu'à une péremption que rien ne peut lui rappeler. On ne veut pas non plus la lui faire déclarer. La ligne reste donc affichée : ça coûte une ligne, là où se taire coûterait la boîte au moment où elle sert.

Le flux d'avis d'incidents de l'ASNR — cherché, trouvé, écarté

Recherche du 07/08/2026, à ne pas refaire. Le jeu data.gouv « Avis d'incidents dans les installations nucléaires » est mort (2014, « tentative d'aspiration » par une organisation inconnue, URL classique.asn.fr disparue). Le vrai flux, lui, est vivant :

https://www.asn.fr/rss/avis-incidents-INB
→ 301 → reglementation-controle.asnr.fr/rss/avis-incidents-INB
HTTP 200 · 44 ko · 50 items · mars → août 2026 · déclaré horaire

Écarté pour trois raisons, chacune suffisante :

  1. Aucune clé de rattachement. Les champs sont title, description, link, pubDate, guid, author — pas un champ de localisation. Mesuré sur les 50 items : 1 seul porte un n° INB, 0 un code INSEE. Le nom du site (Golfech, Chooz B, Cattenom) est en prose libre dans la description. L'extraire au motif serait deviner le rattachement d'une fiche de sécurité.
  2. Ce n'est pas un signal de danger public. Ce sont des non-conformités d'exploitation déclarées par l'exploitant — détection tardive d'un système indisponible, contamination externe d'un intervenant, non-respect des règles de manutention. Une dizaine par mois sur tout le parc. 49 items sur 50 n'annoncent aucun niveau INES. Aucun n'appelle à prendre de l'iode, qui ne se prend que sur consigne du préfet.
  3. Le produit est un batch quotidien. Une urgence radiologique se joue en minutes, par FR-Alert et les sirènes. Un mail à J+1 arriverait après tout le monde — et ferait croire à une veille qui n'existe pas.

C'est le miroir de la leçon de D-024 : là-bas la source publiait plus que ce qu'on en lisait ; ici elle publie moins que ce qu'on espère, et la tentation serait de compléter au jugé.

Cherché aussi, sans résultat : distribution+iode+comprimes → 0 jeu sur data.gouv ; les 86 résultats de campagne+iode sont des campagnes d'irrigation. Le seul jeu « iode » publié est un périmètre communal de Brest métropole.

12. La déclaration de travaux (07/08/2026)

declaration-fonciere-90j se déclenchait sur equipements contains piscine — c'est-à-dire posséder une piscine, pas venir d'en construire une. Un foyer qui a la sienne depuis dix ans lisait « 90 jours pour déclarer » à vie, sans date, donc sans qu'aucun mail ne parte. Le déclencheur n'était pas approximatif, il était faux.

Le quiz collecte désormais les travaux terminés, sur l'écran des équipements — pas d'écran de plus, et le mois n'apparaît qu'une fois quelque chose de coché. Stratégie declaration_travaux : fenêtre = 1er du mois + 90 jours, confiance connue, avance de 90 jours pour que le rappel parte à l'ouverture du délai.

Deux choix à connaître : le 1er du mois plutôt que le jour réel avance la limite d'au plus trente jours, donc on prévient trop tôt et jamais trop tard sur un délai dont le dépassement coûte l'exonération de taxe foncière puis une amende ; et le sujet est le mois, sans quoi la clôture d'un chantier vaudrait pour le suivant.

carnet-information-logement n'a pas bougé : il s'applique déjà à tout propriétaire, indépendamment de tous travaux. Lui ajouter un sujet sur la déclaration produirait une seconde carte pour la même obligation.

Un mois par chantier, et une mémoire qui n'est pas le formulaire (D-063, 07/08/2026)

La première écriture gardait un seul travaux_mois pour tout le logement. Deux constructions finies à trois mois d'écart n'avaient donc qu'une date limite — celle de la dernière déclarée —, et le délai encore ouvert de la première disparaissait avec son sujet, sans un mot. Les travaux sont maintenant une liste de couples { type, mois } :

Deux chantiers, deux mois deux sujets, deux échéances, deux dates limites
Deux chantiers, un mois un seul sujet, libellé « piscine et abri de jardin de juin 2026 » — c'est une visite au service des impôts, pas deux
Un chantier sans mois sujet vide, fenêtre libre, libellé « extension — mois non précisé ». On ne dit jamais qu'une date manque à l'affichage quand c'est la réponse qui manque
Isolation, chauffage aucun sujet : ils ne créent pas de surface, donc n'ouvrent aucun délai foncier. Ils restent déclarables pour le carnet d'information

Le rejeu du quiz repose la question à vide et le logement accumule — c'est le point qui demande le plus d'attention. Ramener les cases cochées ferait redéclarer une piscine de mars huit mois plus tard sans que personne ne le remarque ; mais remettre l'asset à zéro effacerait un délai qui court encore. Le formulaire est un message daté, le logement est la mémoire. Elle s'oublie à treize mois, la profondeur de la liste de mois proposée : au-delà, le délai de 90 jours ne peut plus rien ouvrir, et sans borne la liste grossirait à chaque passage.

Une duplication assumée, tenue par un test. Le DSL d'applicabilité sait dire contains_any sur un tableau de chaînes, pas fouiller des objets. quizToAssets pose donc deux écritures de la même vérité : travaux (les couples, que lisent les sujets et les fenêtres) et travaux_recents (les types seuls, dérivés, que lit la fiche). La liste des quatre types fonciers vit dans src/engine/travaux.ts, la fiche garde la sienne en YAML, et un test vérifie qu'elles disent la même chose — sans quoi ajouter un type produirait une fiche qui ne s'applique pas, ou pire, une fiche qui s'applique sans qu'aucun sujet ne la date.

Une migration de reprise (0024) convertit l'ancienne forme sur les logements déjà déclarés. Sans elle, leur échéance datée aurait été archivée au profit d'une échéance sans date au premier passage de réconciliation.