21:45:49.080 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractor -- [listing-extractor] portal=seloger outcome=EXTRACTED champs=18 par-couche={STRUCTURED=7, DESCRIPTION=11}
21:45:49.080 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractionApplier -- [listing-apply] 18 champ(s) comblé(s) (gap-filler, zéro écrasement): [prix←STRUCTURED, surface←STRUCTURED, ville←STRUCTURED, codePostal←STRUCTURED, adresse←STRUCTURED, type←STRUCTURED, nbPieces←STRUCTURED, dpe←DESCRIPTION, ges←DESCRIPTION, etage←DESCRIPTION, ascenseur←DESCRIPTION, anneeConstruction←DESCRIPTION, chargesCopro←DESCRIPTION, nbLotsCopro←DESCRIPTION, chauffage←DESCRIPTION, cave←DESCRIPTION, surfaceExterieure←DESCRIPTION, typeExterieur←DESCRIPTION]
21:45:49.102 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractor -- [listing-extractor] portal=lbc outcome=EXTRACTED champs=15 par-couche={STRUCTURED=15}
21:45:49.102 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractionApplier -- [listing-apply] 13 champ(s) comblé(s) (gap-filler, zéro écrasement): [prix←STRUCTURED, surface←STRUCTURED, ville←STRUCTURED, codePostal←STRUCTURED, type←STRUCTURED, nbPieces←STRUCTURED, dpe←STRUCTURED, ges←STRUCTURED, etage←STRUCTURED, anneeConstruction←STRUCTURED, chargesCopro←STRUCTURED, nbChambres←STRUCTURED, quartier←STRUCTURED]
21:45:49.103 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractor -- [listing-extractor] portal=preux outcome=NO_STRUCTURED_DATA champs=0 par-couche={}
===== BATTLE-TEST BASCULE — LLM vide (markdown tronqué) + apply déterministe =====
21:45:49.107 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractor -- [listing-extractor] portal=lbc outcome=EXTRACTED champs=15 par-couche={STRUCTURED=15}
21:45:49.107 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractionApplier -- [listing-apply] 13 champ(s) comblé(s) (gap-filler, zéro écrasement): [prix←STRUCTURED, surface←STRUCTURED, ville←STRUCTURED, codePostal←STRUCTURED, type←STRUCTURED, nbPieces←STRUCTURED, dpe←STRUCTURED, ges←STRUCTURED, etage←STRUCTURED, anneeConstruction←STRUCTURED, chargesCopro←STRUCTURED, nbChambres←STRUCTURED, quartier←STRUCTURED]
• lbc-blob-annecy.html [outcome=EXTRACTED]
AVANT (LLM tronqué) : 0 champ
APRÈS apply : 12 champs → [annee=1986, chargesCopro=948, codePostal=74000, dpe=C, etage=2, ges=B, nbPieces=4, prix=457600, quartier=Mandallaz - Prairie - Vovray, surface=83, type=Appartement, ville=Annecy]
21:45:49.108 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractor -- [listing-extractor] portal=seloger outcome=EXTRACTED champs=18 par-couche={STRUCTURED=7, DESCRIPTION=11}
21:45:49.108 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractionApplier -- [listing-apply] 18 champ(s) comblé(s) (gap-filler, zéro écrasement): [prix←STRUCTURED, surface←STRUCTURED, ville←STRUCTURED, codePostal←STRUCTURED, adresse←STRUCTURED, type←STRUCTURED, nbPieces←STRUCTURED, dpe←DESCRIPTION, ges←DESCRIPTION, etage←DESCRIPTION, ascenseur←DESCRIPTION, anneeConstruction←DESCRIPTION, chargesCopro←DESCRIPTION, nbLotsCopro←DESCRIPTION, chauffage←DESCRIPTION, cave←DESCRIPTION, surfaceExterieure←DESCRIPTION, typeExterieur←DESCRIPTION]
• seloger-t3-lyon.html [outcome=EXTRACTED]
AVANT (LLM tronqué) : 0 champ
APRÈS apply : 14 champs → [adresse=La Villette, annee=1980, ascenseur=true, chargesCopro=2520, codePostal=69003, dpe=D, etage=6, ges=D, nbPieces=3, nombreLots=180, prix=315000, surface=65, type=Appartement, ville=Lyon 3ème arrondissement]
🔑 nombreLots=180 (→ fingerprint RNC / résolution banId)
21:45:49.109 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractor -- [listing-extractor] portal=seloger outcome=EXTRACTED champs=19 par-couche={STRUCTURED=7, DESCRIPTION=12}
21:45:49.109 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractionApplier -- [listing-apply] 19 champ(s) comblé(s) (gap-filler, zéro écrasement): [prix←STRUCTURED, surface←STRUCTURED, ville←STRUCTURED, codePostal←STRUCTURED, adresse←STRUCTURED, type←STRUCTURED, nbPieces←STRUCTURED, dpe←DESCRIPTION, ges←DESCRIPTION, etage←DESCRIPTION, ascenseur←DESCRIPTION, chargesCopro←DESCRIPTION, nbChambres←DESCRIPTION, quartier←DESCRIPTION, cave←DESCRIPTION, parkingGarage←DESCRIPTION, surfaceExterieure←DESCRIPTION, typeExterieur←DESCRIPTION, anneeRenovation←DESCRIPTION]
• seloger-appartement-t3-paris.html [outcome=EXTRACTED]
AVANT (LLM tronqué) : 0 champ
APRÈS apply : 13 champs → [adresse=15 rue de la Roquette, ascenseur=true, chargesCopro=2400, codePostal=75011, dpe=E, etage=2, ges=D, nbPieces=3, prix=450000, quartier=Bastille, surface=65, type=Appartement, ville=Paris 11ème]
21:45:49.110 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractor -- [listing-extractor] portal=pap outcome=EXTRACTED champs=18 par-couche={STRUCTURED=8, DESCRIPTION=10}
21:45:49.110 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractionApplier -- [listing-apply] 18 champ(s) comblé(s) (gap-filler, zéro écrasement): [prix←STRUCTURED, surface←STRUCTURED, surfaceTerrain←STRUCTURED, ville←STRUCTURED, codePostal←STRUCTURED, adresse←STRUCTURED, type←STRUCTURED, nbPieces←STRUCTURED, dpe←DESCRIPTION, ges←DESCRIPTION, anneeConstruction←DESCRIPTION, nbChambres←DESCRIPTION, taxeFonciere←DESCRIPTION, quartier←DESCRIPTION, chauffage←DESCRIPTION, surfaceExterieure←DESCRIPTION, typeExterieur←DESCRIPTION, anneeRenovation←DESCRIPTION]
• pap-maison-bordeaux.html [outcome=EXTRACTED]
AVANT (LLM tronqué) : 0 champ
APRÈS apply : 12 champs → [adresse=12 rue du Général Thiébault, annee=1935, codePostal=33000, dpe=B, ges=A, nbPieces=5, prix=495000, quartier=Chartrons, surface=110, surfaceTerrain=320, type=Maison, ville=Bordeaux]
21:45:49.111 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractor -- [listing-extractor] portal=pap outcome=EXTRACTED champs=8 par-couche={STRUCTURED=7, DESCRIPTION=1}
21:45:49.111 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractionApplier -- [listing-apply] 8 champ(s) comblé(s) (gap-filler, zéro écrasement): [prix←STRUCTURED, surface←STRUCTURED, ville←STRUCTURED, codePostal←STRUCTURED, adresse←STRUCTURED, type←STRUCTURED, nbPieces←STRUCTURED, chargesCopro←DESCRIPTION]
• pap-studio-poitiers.html [outcome=EXTRACTED]
AVANT (LLM tronqué) : 0 champ
APRÈS apply : 8 champs → [adresse=Promenade des Cours, chargesCopro=950, codePostal=86000, nbPieces=1, prix=64000, surface=25, type=Appartement, ville=Poitiers]
21:45:49.112 [Test worker] INFO com.alertimmo.aiscraping.extraction.structured.ListingExtractor -- [listing-extractor] portal=preux outcome=NO_STRUCTURED_DATA champs=0 par-couche={}
• preux-va4736-annecy.html [outcome=NO_STRUCTURED_DATA]
AVANT (LLM tronqué) : 0 champ
APRÈS apply : 0 champs → []
=================================================================================