Toutes les sorties et tous les événements du Québec, un seul endroit — 7 connecteurs, fiches SSR, design Groupe KA.
-
Wed, Aug 26, 2026 1
-
feat(ka-id v2): personnalisation Groupe KA — sortika/kaid.py (canonique ka-ui.git/kaid), journal serveur (search/detail_view/favorite), mode annotation (ordre chronologique préservé, blend=0 : badge « Recommandé pour vous » + exclusion des masqués), routeur /api/kaid, SDK ka-id.js
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Tue, Aug 25, 2026 8
-
Barre de navigation mobile commune Groupe KA (KA Tabbar v1)
…
Pilule flottante fixe en bas (standard ka-ui/nav, version vanilla inline) : Découvrir · Recherche · Carte · Favoris, accent magenta signature, safe-area iOS, micro-interactions. Recherche = retour accueil + focus du champ central ; Carte = toutes les sorties sur la carte (drapeau state.mapAll one-shot dans isFiltering, remis à zéro à toute navigation hors tabbar). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Vague connecteurs 2026-08-25 : +26 sources actives (10 ATR, 15 municipales, 6 billetteries/agrégateurs), 20 connecteurs enrichis (prix/heures/adresses/images), +13 salles JSON-LD, +8 tenants — 61 sources actives, 22 310 événements actifs
…
- ATR : cotenord, abitibi, ilesdelamadeleine, charlevoix, eeyouistchee, tourismelaval, quebeccite, mtlorg + réhabilitation mauricie (XHR acolyte) et laurentides (Scrapfly) - Municipal : gatineau, levis, terrebonne, troisrivieres, rimouski, victoriaville, drummondville, granby, saintjerome, sainthyacinthe, rouynnoranda, shawinigan, joliette, magog, soreltracy - Billetteries/agrégateurs : showpass (API publique), zeffy (pages orgs __NEXT_DATA__), signelaval, quoifaire, evenementsattractions, banq ; weezevent/accesculture écartés documentés (accesculture retiré : domaine squatté, contenu 2015) - Enrichis : ticketpro prix 0→93 %, ticketacces adresses+prix, tuxedobillet fiches Scrapfly (+71 evts janv-fév), lavitrine v3 (GPS/prix JSON-LD des représentations), lepointdevente adresses, quebecanimee heures/adresses, sitq og:image/description, montreal images 100 %, bandsintown images, atuvu heures/prix, cantonsdelest 25→596 (pagination AJAX CSRF), 7 autres ATR fiches détail - sallesjsonld : 17 salles (+13 : Denise-Pelletier, MBAM, MNBAQ, MCQ, Pointe-à-Callière, Cinémathèque, TOHU, Spect'Art, Hector-Charland, Cogeco, Premier Acte, Maison littérature, Chasse-galerie), Trident réparé - Registre sources.json : 68 entrées, docs/connecteurs régénérés, 131 tests verts Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Nav mobile v2 : hamburger + panneau plein écran fixed (standard KA 2026-08-25)
…
Les liens de nav wrappaient dans le header sur mobile. Remplacés sous 760px par un hamburger 44px + panneau position:fixed inset:0 (z-modal) — visible peu importe la position de scroll, verrou de scroll, fermeture lien/✕/Escape. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mon, Aug 24, 2026 5
-
Sun, Aug 23, 2026 4
-
favoris ♥ « Mon univers Ka » (KA ID) : hub groupe-ka.com magasin central
…
- sortika/hubfav.py : client HMAC du hub (patron food-ka) — toggle synchrone, lecture avec cache mémoire 30 s invalidé au toggle, aucun stockage local - API : GET /api/favorites + POST /api/favorites/toggle (session KA ID, 401 sinon ; 403 compte non relié ; 502 hub injoignable) - frontend : cœur ♥ sur les cartes et la fiche (non connecté -> connexion KA ID), page /favoris + entrée de nav, toggle optimiste avec rétablissement - SSR : route /favoris (noindex, hors sitemaps) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
stats v3 : rapports PDF personnalisés (catalogue de blocs, rendu au choix, constructeur + modèles)
…
- kapdf.py v3 : catalog(dash), mode 'personnalise' (spec title+blocks, rendu par bloc avec conversions tableau, heatmap calendrier vectorielle) - web.py : GET /api/stats/catalog + POST /api/stats/report/custom - frontend : constructeur vanilla (modal 2 colonnes, ordre ↑↓, sélecteur de rendu, modèles localStorage, téléchargement blob) - SPEC.md v3 (§3bis)
-
SEO : pages programmatiques régions + catégories rendues en HTML
…
- sortika/seo.py : /regions, /region/{slug}, /categories, /categorie/{cat} (SSR complet : ItemList + BreadcrumbList, 100 fiches liées par page), liens régions/catégories dans l'accueil SSR, sitemap-pages enrichi - frontend/index.html : routeur SPA étendu — /region/{slug} et /categorie/{cat} ouvrent la recherche filtrée correspondante (kaSlug miroir du slugify serveur) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sat, Aug 22, 2026 6
-
Phase 5 (suite) — registre : 4 billetteries sondées et écartées avec preuves (Zeffy, Showpass, Weezevent, Accès culture)
…
- zeffy : sitemap 547 834 URLs /ticketing/ sans lastmod/date/géo — découverte impraticable - showpass : aucun filtre géo serveur + inventaire 0,3 % QC (échantillon 1 000 évts) — ROI nul - weezevent : sitemap slugs relatifs sans lieu, quasi tout France - accesculture : billetterie déléguée à La Vitrine (déjà couverte) — doublons > gain - docs/connecteurs régénérés (44 sources) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Phase 5 — billetterie Ticketpro (API JSON multi-tenants : St-Denis, Fun Nation, ExpoCité, PdC, SAG…) + salle Odyscène (Ste-Thérèse, Laurentides) via sallesjsonld
…
- ticketpro.py : API /api/v1/pages publique par tenant (aucun anti-bot), 1 Event par (spectacle, date à venir), lieu complet avec GPS, tags, cancelled/soldout, image ; 6 tenants QC (data/ticketpro_tenants.json), restauration/musée à créneaux exclus — 361 séances actives au 1er sync - salles_jsonld.json : + Odyscène (TheaterEvent JSON-LD, robots ouvert) → 33 événements Laurentides au 1er passage - docs/connecteurs régénérés (40 sources) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
SEO : SSR de l'accueil (title avec stats, canonical, OG fr_CA, JSON-LD WebSite/Organization, contenu essentiel) + hreflang/og:locale/BreadcrumbList sur les fiches, /contact et /stats ; lang fr-CA
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
connecteurs: chaine de fetch anti-bot resiliente (Oxylabs->Scrapfly->Bright Data)
…
Auto-escalade de BaseConnector.get() sur blocage (403/429/503/challenge CF) ou coupure reseau, via connectors/_resilient.py. Cles lues de l env avec repli sur ~/.claude/.env (accepte SCRAPFLY_KEY et SCRAPFLY_API_KEY). Reponse compatible requests.Response; coupe-circuit par hote. Aucun connecteur modifie. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
-
Fri, Aug 21, 2026 1
-
Phase 4 — 7 nouveaux connecteurs : régions manquantes (Montérégie, Centre-du-Québec, Chaudière-Appalaches, Gaspésie via Scrapfly) + billetteries QC (TicketAcces, Réseau Ovation, Tuxedo via acteur Apify ka-tuxedo)
…
- ATR : monteregie (WP REST cpt_event + JSON-LD fiche), centreduquebec (SSR), chaudiereappalaches (SSR paginé, JSON-LD Event complet), gaspesie (RÉACTIVÉE — WAF contourné via Scrapfly consigné et budgété) - Billetteries : ticketacces (calendrier agrégé, 47 orgs QC dont 14 en Abitibi, ~1 320 séances, Crawl-delay 120 honoré PAR HÔTE + TTL 6 h), ovation (26 orgs 100 % QC, artistes/adresses/heures, Crawl-delay 30 honoré + TTL 20 h), tuxedobillet (RÉACTIVÉE — 29 tenants QC, SPA Firebase rendue par l'acteur Apify maison gorgeous_thistle/ka-tuxedo, code versionné dans apify/ka-tuxedo/) - Configs annuaires : data/ovation_orgs.json, data/tuxedo_tenants.json - Registre 39 sources, CONFORMITE.md (robots.txt lus, crawl-delays honorés), fiches docs régénérées, 10 nouveaux tests sur fixtures réelles (69 verts) - Couverture : +1 900 séances futures ; Abitibi +312, Gaspésie réamorcée, Centre-du-Québec première source Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Wed, Aug 19, 2026 10
-
Phase 3 — registre (34 sources), conformité et crédits
…
- data/sources.json : 9 nouvelles sources actives avec fiche d évaluation datée (accès constaté, volume mesuré, robots.txt lu, effort) + 5 écartements consignés avec raison (mauricie JS, laurentides/gaspesie WAF, tuxedo en panne, clubs pros doublons) - docs/CONFORMITE.md : tableau licences/robots.txt/crédits/fréquences de TOUTES les sources + données transversales (MAMH, OSM/ODbL, Nominatim) - frontend + seo.py : étiquettes SRC_LABELS des 9 nouvelles sources (+ 3 anciennes manquantes) ; pied de page d attribution enrichi, dont « lieux : © contributeurs OpenStreetMap (ODbL) » exigé par l annuaire - docs/connecteurs : fiches régénérées (34 sources, INDEX) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Phase 3 — 9 nouveaux connecteurs + déroulage des périodes SITQ (fiches d évaluation avant connexion)
…
- lavalweb : calendrier VIVANT laval.ca (SSR paginé, ~470 fiches — remplace le jeu Données Québec mort à la source, consigné Phase 2) - saguenaysorties : portail sorties.saguenay.ca (ajax/plus + ajax/details, 445 séances horodatées — remplace le CSV mort de 2022) - lhjmq : API HockeyTech modulekit (matchs à domicile QC, 12 villes/10 régions) - placedesarts : fiches Craft (eventbannerdata/eventGTM + représentations) — une fiche PAR séance avec heure et PRIX RÉELS - sallesjsonld : moteur générique schema.org/Event configurable (data/salles_jsonld.json — amorce Grand Théâtre/Trident/Capitole ; heures UTC du Grand Théâtre converties en heure locale) - quebecanimee : activités gratuites Ville de Québec (attributs data-*) - lanaudiere : ATR via sitemap (Crawl-delay 2 s et Disallow /*? respectés) - outaouais : calendrier complet dans les props de l îlot Astro (1 GET) - bassaintlaurent : ATR SSR + GPS exact des fiches - sitq : PeriodeOuvertures[] déroulées en occurrences datées (cap 24, 1re période = identifiant historique) — 1 599 → 1 803 fiches - tests : 46 → 59 verts (fixtures réelles pour chaque connecteur + annuaire) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Phase 3 — annuaire de salles : table venues (appris/OSM/Nominatim), matching par alias, plages de dates FR
…
- sortika/venues.py : annuaire de salles QC — auto-apprentissage des salles géocodées par les sources, extrait Overpass des lieux culturels (import par fichier si le nœud n atteint pas overpass-api.de, échec mémorisé 3 j), géocodage Nominatim des salles récurrentes (plafonné) ; matching nom normalisé + alias de segments + « Salle X » → « X » (ville obligatoire), match sans ville seulement si clé unique ≥ 8 car. — jamais de GPS inventé - scripts/build_venues.py : amorçage one-shot de l annuaire - ingest.py : venues.run à chaque cycle (après le géocodeur) - normalize.py : parse_date_range_fr (« Du 4 juin au 22 août 2026 »…) - GPS des « à venir » : 64,9 % → 76,4 % (+3 264 fiches localisées) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
docs: fiches connecteurs régénérées (Phase 2) + registre — laval morte-à-la-source
…
- data/sources.json : laval passe à « morte-a-la-source » avec décision consignée (jeu ouvert figé, EventDate max 2025-12-09, 41 runs verts sans aucun futur) ; le connecteur reste branché (archivage naturel + réveil automatique si la Ville republie) ; remplacement prévu en Phase 3 (calendrier vivant laval.ca / Tourisme Laval). - Générateur : end_time et statut ajoutés aux champs documentés et aux métriques clés ; note ticketmaster mise à jour (repli scraping sain, TICKETMASTER_API_KEY à fournir pour prix/statuts/visuels HD) ; historique Phase 2 consigné. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Phase 2 — affichage & API : bandeaux statut, heures de fin, quarantaine, santé par source
…
- Frontend : badge Annulé/Reporté/Complet sur les cartes, bandeau de statut sur la fiche, plage horaire « 19 h 30 – 21 h 30 » quand end_time est connue, heure 00:00 affichée « heure non confirmée » (jamais un minuit menteur). - SEO/SSR : eventStatus schema.org (EventCancelled/EventPostponed), offers availability SoldOut, endDate horodatée (endDate + end_time + fuseau), bandeau statut dans le HTML SSR ; sitemaps sans les événements en quarantaine. - API : /api/events, /api/stats et le tableau de bord excluent la quarantaine ; /api/stats expose « quarantined » ; /api/sources expose upcoming_events par source + future_alerts (canal de supervision — une source verte sans futur est morte en silence). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Phase 2 — connecteurs : heure+description La Vitrine, statuts, end_time, offres, taxonomies
…
- lavitrine (plus grosse source, 5 087 à venir) : capte l HEURE de la slide (« 15:00 HNE », start_time 0 % → 51 % dès le 1er lot de 1 100 fiches) et la DESCRIPTION (accroche courte + début du texte À propos, desc≥200 0 % → 50 %) ; re-visite versionnée v2 du cache (montée progressive, ~400 fiches/sync). - eventbrite : end_time (98,8 %), full_description>JSON-LD>summary, organisateur via le JSON-LD de la fiche déjà visitée pour le prix (0 % → 67 % et montant), statut is_cancelled CONSERVÉ (bandeau) + urgency_signals sold out → soldout. Les séries (series_id) ne sont PAS déroulées : 0 série observée sur les pages découverte sondées. - atuvu : og:description enfin affectée à l événement (payée en crédits Scrapfly, elle était jetée) — SAUF le gabarit marketing « trouvez des billets… » constaté sur fiche réelle, jamais publié ; backfill au fil des re-scrapes lastmod, aucun crédit supplémentaire. - evenko : supports (premières parties) ajoutés aux artistes, door_time et tour_name en description (« Tournée : … · Portes : … »), representation_status → statut (soldout/cancelled). - bandsintown : offers[] type Tickets → lien billets direct + « sold out » → statut soldout. - brossard : taxonomie type-event résolue (1 requête WP REST, vraies catégories) ; description INTÉGRALE (fin de la coupe à 600 caractères) ; heure de fin de la bannière « de 15 h 00 à 16 h 00 » et du JSON-LD biblio. - longueuil : image captée dans l état Nuxt (mediaImages front_*_16_9/21_9) ; heure de fin des cartes <time>. - laval : préfixe « ANNULÉ - » du titre → statut cancelled, titre nettoyé. - ticketmaster (repli sans clé) : les annulés sont conservés avec statut ; mode API (si TICKETMASTER_API_KEY fournie) : dates.status.code → statut, end localTime → end_time. - montreal : heure de FIN du JSON-LD des fiches (endDate), backfill progressif sous le même plafond MTL_IMG_MAX. - sherbrooke : heure de fin des périodes UTC → locale. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Phase 2 — noyau : archivage des passés, statut, end_time, quarantaine, séances, villes MAMH
…
- Règle d ARCHIVAGE temporel : un événement terminé passe active=0 à chaque cycle (jamais supprimé) ; un passé archivé n est plus réactivé par un sync « unchanged » (backfill immédiat : 3 745 passés actifs → 0). - Colonnes additives events.end_time (HH:MM), events.status (cancelled/postponed/soldout, NULL = prévu) et events.quarantine (raison, NULL = publiable) + migration auto à la connexion. - dedup_key inclut désormais l HEURE de début : même titre/ville/jour à des heures différentes = séances distinctes (661 groupes → 259 ; les 11 séances d un même parcours redeviennent visibles). Deux fiches sans heure fusionnent toujours ; une fiche avec heure ne fusionne qu à heure égale (règle consignée dans schema.py). - Quarantaine qualité : date passée aberrante (< 2000), début à plus de 2 ans, ville hors Québec — non publiée, comptée (/api/stats), réintégrable à chaque sync dès que la donnée redevient saine. L heure 00:00 est affichée « heure non confirmée » ; l image 404 n est pas vérifiée (coût réseau), le frontend retire les images cassées. - Alerte « source qui meurt en silence » : événements FUTURS par source à chaque cycle (data/future_counts.json) — alerte si 0 futur ou chute > 80 % (le cas Laval : 41 runs verts, max(date)=2025-12-09). - Géocodage par ADRESSE CIVIQUE prioritaire (Nominatim, même cache, 1 req/s) : Brossard 0,7 % → 94 % de GPS, Longueuil 0 % → 75 %. - Villes normalisées au Répertoire MAMH (data/villes_canon.json, généré de MUN.csv + ARR.csv) : « Montreal » 375, « Quebec » 166, 75 graphies, 804 événements backfillés — facettes ville unifiées. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
tokens.css : overflow-x clip aussi sur html (quirk WebKit iOS — le clip sur body seul laisse défiler le viewport)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Correctifs front-end mobile : viewport-fit=cover, champs 16 px, blur header desktop seulement, socle mobile ka-ui
…
- index.html : meta viewport avec viewport-fit=cover (safe-area iOS) - .header : backdrop-filter limite a >=768px, fond quasi opaque rgba(245,243,238,.95) sur mobile (evite les descendants fixed pieges par le blur WebKit + perfs de scroll) - champs input#q / select#region / select#period a 16 px sous 760px (evite le zoom auto iOS au focus) - a.brand : extension tactile ::after inset -8px (cible >=44px), nav deja >=44px - frontend/src/ka/tokens.css : section SOCLE MOBILE OBLIGATOIRE (z-index unifies, --vh100 dvh, verrous de scroll, filet anti-zoom 16 px, extension tactile gk-badge) - frontend/ka-agent.js : agent corrige (safe-area, textarea 16 px, plein ecran <=640px + verrou scroll) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Tue, Aug 18, 2026 5
-
docs: fiches connecteurs régénérées (vague 3 — 4 sources actives de plus)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Vague 3 : Ticketmaster SANS clé + Eventbrite + Longueuil + Cantons-de-l'Est
…
- ticketmaster : mode principal sans clé — scraping des pages découverte publiques (montreal, quebec-city, gatineau ; état Next.js cityEvents, 20 év./page, date UTC→locale, salle géolocalisée, plafond 360/sync, Scrapfly ASP sans render_js en secours) ; repli automatique sur la Discovery API officielle dès que TICKETMASTER_API_KEY existe (mêmes ids, zéro doublon). 330 événements, 100 % GPS, 96 % heure. - eventbrite (nouveau) : pages découverte /d/<lieu>/all-events (7 villes QC, __SERVER_DATA__, 20 rés./page) + prix réels par fiche JSON-LD AggregateOffer (cache incrémental, 150 fiches/sync, re-visite 7 j). 426 événements, 100 % GPS+heure, filtre region=QC strict. - longueuil (nouveau) : portail vivant longueuil.quebec/fr/evenements (cartes SSR <time datetime> + adresse par fiche via l état Nuxt) — remplace le jeu Données Québec périmé (2017). - cantonsdelest (nouveau) : calendrier officiel de l ATR Estrie (JSON-LD Event + GPS data-lat/lng, images Tourinsoft, cache incrémental). - tests : parse du mode scraping Ticketmaster (UTC→locale, dédup par id, annulés exclus, heure TBA nulle) ; 33 tests verts. - correctif commun : raw_decode tolère l espace avant le JSON-LD. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
docs: documentation standardisée des connecteurs (générateur rejouable)
…
- scripts/gen_connector_docs.py : générateur rejouable qui croise data/sources.json, l introspection des connecteurs (endpoints, pagination, backend, plafonds env, en-têtes) et la BD live (volumétrie, complétude GPS/prix/heure/artistes/image/salle, exemples réels, sync_log) - docs/connecteurs/ : INDEX.md + 18 fiches (sections fixes : Description, Accès, Champs récupérés → schéma, Fréquence & budgets, Volumétrie & complétude live, Erreurs & dépannage, Licence/attribution avec mentions requises CC BY Montréal / CC 4.0 SITQ & Laval, Historique incl. vagues d enrichissement 2026-08-18 7d9d1b0 et 65d2d33) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs
…
- Colonnes additives events.start_time (HH:MM locale QC) et events.artists (JSON) + migration auto à la connexion ; Event.finalize normalise l'heure (parse_time) et déduplique les artistes. - Heure captée partout où la source la publie : lepointdevente (cartes de liste « 17 août 2026, 20h00 » + fiches), evenko (show_time epoch → America/Montreal, respect hide_show_time), Laval et Sherbrooke (flux UTC → date+heure locales, minuit local = toute la journée), Montréal (JSON-LD des fiches pendant l'enrichissement og:image, cache rétro-compatible), atuvu. - Artistes : headliners evenko (explicite), lineup Bandsintown, attractions Ticketmaster, et extraction conservatrice des titres lpdv (patrons sûrs « Artiste - Salle » / « X en concert/rodage », liste de mots interdits). - Nouveau connecteur Ville de Brossard (API REST WordPress city-event + bannière/JSON-LD des fiches, cache incrémental) — 251 événements. - Nouveau connecteur Bandsintown (dates QC des artistes connus de la base, rotation 100 artistes/sync, app_id js_www.sorti-ka.com testé accepté) — 108 concerts géolocalisés avec heure. - Nouveau connecteur Ticketmaster Discovery API, complet mais « prêt — clé requise » (TICKETMASTER_API_KEY absent de .env ; skip propre + .env.example). - Gatineau, Trois-Rivières, Lévis, Terrebonne : étudiées et documentées « abandonnée » dans sources.json (aucun flux exploitable, vérifié 2026-08-18). - Dédup à l'affichage : rang prix > GPS > image > description ; /api/stats expose « sources » (10 actives) pour le hub groupe-ka ; SSR : heure dans le JSON-LD (offset québécois) + performer ; frontend : heure sur les cartes et fiches, « À l'affiche », libellés des nouvelles sources. - Tests : 22 → 32 (parse_time, utc_to_local, artistes, migration, TM/BIT/ Brossard sur structures réelles). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Enrichissement des connecteurs + géocodage des salles
…
- geocode.py (nouveau) : géocodeur Nominatim des salles — cache disque data/geocode_cache.json, throttle 1,1 s, UA SortiKaBot identifié, plafond SORTIKA_GEOCODE_MAX=120 req/cycle, garde-fous bbox Québec + ville dans la display_name, repli sur segment de nom composé ; branché dans ingest.run() - lepointdevente : enrichissement incrémental par fiches /billets/<id> (cache, LPDV_DETAIL_MAX=150/sync, re-visite 7 j, throttle 0,8 s) — description og:description (boilerplate filtré), heure précise (cache), tarifs réels via /plugins/rates/<id> → price_min/price_label/is_free - sitq : contacts Tourinsoft (TelephonePrincipals/Courriels) → description « Renseignements : … » (le flux ne publie ni Descriptions* ni tarifs) - montreal : venue = emplacement (si vrai nom de lieu — aujourdhui la ville ny publie que le mode En salle/À lextérieur/En ligne) ou titre_adresse ; address complétée par adresse_secondaire - evenko : champ free sondé null sur 100 % des hits — détection gratuité par étiquettes explicites event_tag/promotional_tag en complément - sources.json : registre des champs extraits à jour Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-