Skip to content

Assets substitues & acces manquants

Registre vivant. Toute substitution (police, media, service tiers) ou dependance externe non resolue s'inscrit ici. Mise a jour obligatoire dans le meme commit que la substitution.

Contexte : les sites gilliard.ch, chevaliers.ch, portedenovembre.ch et gilliarday.ch sont reconstruits a partir du site live uniquement — pas de base de donnees, pas de dossier de theme WP, pas d'export Wix. Le client possede le contenu ; on le reprend tel quel. Ce fichier liste ce qu'on n'a pas et ce qu'on a mis a la place.

1. Polices sous licence

Les polices d'origine sont commerciales et non fournies. Chaque site ship un substitut libre, derriere une seule variable — la bascule sera une ligne, sans toucher aux composants.

SitePolice liveRoleSubstitut livreLicenceFichiersVariable a changerJustification metriqueStatut
gilliardGothamProcorps + titresMontserrat 400-800SIL OFLwwwroot/fonts/montserrat/themes/gilliard/_bootstrap_variables.scss -> $font-family-basegeometrique americain, x-height haute, ouvertures larges, cap-height/chasse prochessubstitue
chevaliersTw Cen MT Std Light (Monotype)corpsAUCUN — police reelle reutiliseeMonotype (licence client)wwwroot/fonts/twcen/TwCenMTStd-Light.woffthemes/chevaliers/_bootstrap_variables.scss -> $font-family-basesans objet — voir §1bisNON substitue
pdnGothamProcorps + nav + CTAAUCUN — police reelle (.otf du live, self-hostee, partagee gilliard wwwroot/fonts/gothampro/)commerciale (licence client presumee)wwwroot/fonts/gothampro/*.otfthemes/pdn/_bootstrap_variables.scss -> $font-family-base + $font-family-nav + _fonts.scssmesure 2026-07-27 sur noeuds peints : GothamPro = corps 25/400, nav 16/700, CTA vin/hero 13-14/700 (l'ancienne note « corps = Kumbh Sans » etait fausse). Yeseva One (display + titres carte) et Krona One (boutons sc_button) restent des faces reelles self-hostees.NON substitue (config.js pdn fontMap -> gothampro identite)
gilliardayChunko BolddisplayArchivo BlackSIL OFL(a livrer)themes/gilliarday/... -> $font-family-displaydisplay large/lourd, grotesque geometrique ; Archivo Black colle sur graisse, chasse, cap-height. ⚠ substitution la plus risquee du projet (face la plus visible) -> faire valider par capture avant de construire le reste du themea livrer
gilliardayGotham BookcorpsMontserrat 400SIL OFL(partage)-> $font-family-base⚠ Book ≠ Pro : cut plus leger/etroit. Prevoir une compensation de letter-spacing vs pdn. Ne pas supposer la meme licence.a livrer
gilliardayTT Chocolates DemiBoldPoppins 600SIL OFL(a livrer)-> $font-family-altgeometrique humaniste, trace monolineaire ; le squelette prime sur la rondeur pour la fidelite de mise en pagea livrer
gilliardayCentury Gothic BoldJost* 700SIL OFL(partage chevaliers)-> $font-family-geometricclone Futura de Monotype, meme lignee que Tw Cen MTa livrer
gilliardaygaude??⚠ NON IDENTIFIEE — recon a faire (quels elements, combien)a investiguer

Procedure de bascule (invariant) : deposer les woff2 licencies -> mettre a jour themes/<site>/_fonts.scss -> changer uniquement les $font-family-* dans themes/<site>/_bootstrap_variables.scss. Aucune edition de composant.

Le harnais de fidelite connait ces substitutions : tools/fidelity/config.js -> fontMap mappe police live -> substitut. Une paire mappee passe ; une police non mappee ou inattendue echoue, donc un changement de police accidentel reste detecte. Garder fontMap synchronise avec ce tableau et retirer les entrees au fur et a mesure des livraisons.

1bis. chevaliers — Tw Cen MT n'est pas substituee (decision utilisateur 2026-07-16)

Le plan classait Tw Cen MT en « police licenciee dont nous n'avons pas l'acces ». C'est faux : elle est auto-hebergee sur le serveur du client et repond 200 — chevaliers.ch/wp-content/themes/aa-base-theme/assets/fonts/TwCenMTStd-Light.woff (25 Ko). L'acces n'etait pas le probleme ; le droit l'etait. Arbitrage utilisateur : on reutilise la police du client (meme client, meme site, meme domaine -> usage identique a ce qui est deja deploye).

Cout mesure de la substitution qu'on evite (chaines identiques, Chrome reel, @40px) :

Facex-height / capEcart de chasse vs Tw Cen
Tw Cen (verite du live)0.635
Jost*0.657+8.7 % a +11.9 %
Montserrat0.757+19.9 % a +38.6 %
Arial0.722+14.5 % a +21.8 %

Le raisonnement du plan etait bon (Jost* est bien le meilleur des trois, rejeter Montserrat etait correct) — mais « le meilleur » restait ~10 % plus large a chaque ligne, sur chaque page, ce qu'aucun reglage ne rattrape. Avec la vraie police : 20/20 mesures identiques au live a 0,01 px pres (5 chaines x 4 corps).

⚠️ Une seule face, en 300 — c'est voulu. Le live declare trois @font-face (TwCenMTStd-Light 300, TwCenMT-Bold 700, Tw Cen MT Std 500) mais son CSS ne demande queTwCenMTStd-Light, et la trace reseau confirme qu'un seul woff part. Quand le live stylise un h1 en font-weight:600, le navigateur synthetise le gras a partir du 300. Livrer la vraie Bold nous eloignerait donc du live au lieu de nous en rapprocher.

Si le juridique revient dessus : substitut = Jost* 300 (surtout pas Montserrat), une seule variable a changer ($font-family-base) + _fonts.scss. La procedure de bascule ci-dessous reste valable a l'identique, dans l'autre sens.

2. Services tiers / cles / comptes manquants

SiteServiceIdentifiant connuCe qui manqueImpactContournement actuel
gilliardayWeezevent billetteried7537276-f611-4beb-a0ab-3196f3c29cd2 (data-type=neo)— (embed public)bloc embedconsentement functional + placeholder opt-in
gilliardayWeezPay cashlessorg 235937, widget 7818e4c1-baca-43fd-8948-084938af0ad8bloc embedidem
chevaliersAirbnb widget (/fr/logement/)AUCUN — le widget n'existe pasLigne caduque (2026-07-17). Le plan avait suppose un widget Airbnb : le live n'a que des liens Booking/Airbnb en texte riche dans les mediaText. Son seul vrai widget est Seekda, que le live masque (display:none, 0 px) -> non porte (§6). Chevaliers n'utilise aucun bloc embed ; ni airbnb ni seekda ne sont dans Core - Embed Provider.
chevaliers / pdnContact Form 7endpoint d'envoiformulaires non fonctionnelsformBlock front-only (decision : envoi = tache ulterieure, cf. gilliard)
pdnMailchimpu=bcb498878fd45b1172b59f30e&id=4a7eefbc87— (POST direct possible)newsletterfront-only pour l'instant
gilliard / pdnInstagram (Smash Balloon)token APIfeed non temps reelmediaGallery seede manuellement
tousGoogle Mapscle APIembed sans cle (maps.google.com/maps?q=...&output=embed)

3. Contenu manquant / introuvable

SiteElementProbleme
gilliarday/programmationdans la nav, absent du sitemap (la page repond 200 — le contenu est accessible ; corriger le sitemap a la migration)
gilliarday/artistes-1/mimaalie depuis l'accueil mais non indexe
gilliarday/destub non traduit -> hors scope, FR uniquement

4. Derive du live (attendue, PAS une regression)

Le live bouge sous nous. Un diff contre le live est un diff contre le live d'aujourd'hui.

SiteElementNature
gilliardHero (promos)Le hero live est une composition libre Smart Slider, refaite a chaque campagne. Mesure 2026-07-16 : ses deux slides ne s'accordent pas entre elles (titre 35px/w600 vs 25px/w700 + 24px/w300 ; pastille 58px vs 36px ; visuel 335x383 vs 270x426). Un bloc a CSS fixe ne peut pas matcher les deux au pixel, et exposer les reglages par slide reviendrait a mettre le design dans le contenu. Decision (utilisateur, 2026-07-16) : on reproduit le contenu promo du live sur une seule echelle typographique coherente, et on masque le hero dans la porte pixel (tools/fidelity/config.js). Tout le reste de la page tient le 0-diff.
gilliardBanner-juillet-2026*.pngArtwork date (campagne de juillet 2026). Ces medias 404eront a la fin de la campagne : /seed-home echouera a les importer. C'est de la derive, pas un bug — mettre a jour les URLs ou basculer les slides en layout=photo.
chevaliersSlider home_gilliard- Copiememe mecanique promo (20% Sherpa) — meme traitement attendu

5. Liens hors perimetre (pointent vers le live)

L'e-commerce est hors scope (decision utilisateur) : ces liens restent des URLs absolues vers le site live, meme apres mise en ligne.

SiteCibles
gilliard/fr/vins/, /fr/promos/, Valloton, Chevaliers, coffrets
chevaliers/fr/vins/, product-category x3, panier, checkout, mon-compte, Saferpay
pdn44 boutons d'achat -> gilliard.ch/fr/vins/... (pas de boutique sur pdn)

6. Contenu volontairement NON migre

SiteElementRaison
chevaliers/home-2/, /fr/home/, /woo_spgw_iframe/orphelins / plomberie
pdnmenu mobile ThemeREX (« Have a Project? », info@website.com, /buy-tickets/ 404)contenu de demo du theme jamais nettoye
pdnGSAP, Google Fonts (Krona One, Lora, Kumbh Sans...)cruft de theme, charge mais inutilise
chevaliersage gate (.loading-page .age-restrict)present en CSS, non rendu sur le live
chevalierswidget de reservation Seekda (.tkw-seekda-container, .skd-widget)charge sur toutes les pages (~10 hotes tiers : cloud/static/ibe/cm/switch/quality/hbe-api/widget-bf.seekda.com) mais masque globalement par .section-form.tkw-seekda-container{display:none} (commentaire du live : « cacher la reservation sur logements »). Mesure : conteneur 0x0, display:none, les deux .skd-widget a 0x0. Rend zero pixel. Ne pas porter — on y gagne la suppression de ~10 hotes tiers charges pour rien sur chaque page.
chevaliers.section-agenda (/fr/logement/)dans un commentaire HTML <!-- ... -->, et ne contient qu'un <h3 class="title"> vide. Rend zero pixel. C'etait la « section que le plan n'arrivait pas a mapper » (risque #7) : elle n'existe pas.
chevaliersfancyBox / lightboxaucune occurrence sur les pages FR. Le plan demandait de confirmer avant de porter une lightbox : rien a porter.
chevaliers.logo-big vide sur la 2e rangee de l'accueil (« Notre Vinothèque »)le live emet bien le conteneur d'emblème mais avec data-src="" — champ image vide cote WP. Il rend une boite d'alt cassee (~160x48). Artefact d'edition, pas un choix graphique : l'extracteur renvoie icon = None (donc aucun emblème seede) et on ne reproduit pas la boite cassee. La 1re rangee, elle, a un vrai emblème (cropped-ms-icon-310x310-1.png, 160x160).
gilliardbadge d'avis eKomi (« ★ 4,74 / 433 avis ») dans la colonne « Sur les reseaux » du pied de pagewidget MARKETING tiers injecte par JS : absent du DOM au chargement (aucun <iframe>, aucun [class*=ekomi/review/avis] mesure 2026-07-25), le compte d'avis est dynamique (change dans le temps). Meme traitement que le feed Instagram : on ne le porte pas en statique (consent-gate eventuel plus tard si demande). Le diff de pixels du pied de page ne sera jamais a zero sur ce fragment.

2026-07-17 — l'entree Seekda ci-dessus a ete re-confirmee (a mes depens). En relisant le DOM de /fr/logement/ j'ai « decouvert » le moteur Seekda, declare la cartographie fausse, fait trancher l'utilisateur, remplace la liste des fournisseurs embed, construit et seme le bloc — avant de tomber sur cette ligne, qui avait deja tout mesure et tranche. Verification refaite : la regle non qualifiee .section-form.tkw-seekda-container{display:none} est bien dans le CSS inline de la page -> zero pixel. Tout est revert : chevaliers n'a aucun bloc embed, et Core - Embed Provider ne contient ni airbnb (jamais existe) ni seekda. Regle : presence dans le DOM ≠ visible. Lire le CSS, et lire ce §6, AVANT de proposer.

6bis. Deviations assumees (chevaliers)

DeviationDetailStatut
Icones en ligne encore hotlinkees vers le liveLes .contact-info-box du live ont des icones telephone/email dans le texte riche (<img src="http://chevaliers.ch/wp-content/uploads/2020/10/icon-{phone,email}-300x300.png">), pas dans un champ. Le texte riche est seme tel quel -> nos pages chargent 2 fichiers depuis chevaliers.ch. 8 occurrences, 2 fichiers distincts. L'icone de tete de carte (.icon > img), elle, est bien importee dans le champ icon.ouvert — le generateur les signale a chaque run (HOTLINKED ...). A resoudre en reecrivant les src du texte riche vers les medias importes avant la mise en ligne : tant que ca reste, le site depend du live.
CGV / Politique de confidentialiteRESOLU (2026-07-21). Elles n'ont jamais eu besoin du client : la copie legale est deja redigee et publiee sur le live, et elle ne change pas. La traiter comme un placeholder « a fournir » etait une erreur de lecture du perimetre, pas une contrainte. Le texte reel est desormais repris du live pour les deux marques — chevaliers via l'extracteur (bands.json._legal, donc reproductible), gilliard en dur dans son seeder (pas d'extracteur). Le titre en tete du corps est retire : TextPage.cshtml rend deja @Model.Name. Resultat : alignement DOM ~45% -> ~85% sur les 4 pages, pixels 41.9->16.4 / 41.2->18.8 (chev) et 29.4->16.9 / 28.2->21.0 (gill).resolu
Credit d'agence : Spektrum, pas « tokiwi SA »Les deux sites du live creditent leur agence precedente en bas de page (chevaliers : tokiwi SA ; gilliard : by tokiwi SA). Decision utilisateur (2026-07-17) : on garde le credit Spektrum Media. C'est donc un ecart volontaire et permanent, pas un oubli — l'extracteur ne lit pas cette valeur, et le diff de pixels de la barre du bas ne sera jamais a zero sur ce fragment. La ligne de copyright, elle, est bien alignee sur le live (voir ci-dessous).assume — ne pas « corriger »
Slide 2 du hero (accueil)Banniere promo juillet 2026 (Banner-Juillet-2026-e1782388849546.png), meme campagne que gilliard.ch (le slider du live s'appelle litteralement home_gilliard- Copie).transitoire — re-semer quand la campagne se termine (cf. §4)

6ter. Deviations assumees (les deux marques)

DeviationDetailStatut
Pastille DE -> le site allemand du clientLe live affiche deux pastilles de langue (fr + de) sur les deux marques. Nous n'hebergeons que le FR : la pastille DE pointe donc vers le site allemand existant du client via siteSettings.deSiteUrl (https://gilliard.ch/de/, https://chevaliers.ch/ — hrefs mesures sur le live). Editable, jamais code en dur dans _header.cshtml (partial partagee par les 4 marques) ; vide = pas de pastille.assume jusqu'a ce que le contenu DE soit migre — a ce moment-la, vider le champ et laisser le selecteur de culture faire son travail
Emblème de tete de section = asset de theme, pas du contenuLe mark dore 64x64 au-dessus des titres de section gilliard (live .section-main-info > .logo-wrap) est servi depuis images/gilliard/emblem.svg et pose par CSS, comme le logo d'en-tete. Mesure avant de decider : il est present sur 2 tetes de section sur 2 sur l'accueil, il n'existe aucun .section-main-info ailleurs sur le site (8 pages balayees), c'est le meme fichier a la meme taille aux deux endroits, et chevaliers n'en a aucun. « Toutes les tetes de section gilliard » est donc la regle exacte.assume — si une bande doit un jour s'en passer, c'est le moment de le promouvoir en propriete de cardCollection

6quater. Assets PDN — glyphe d'icone substitue + overlay importe (2026-07-23)

AssetDetailStatut
Glyphe « Decouvrir » de la carte teaser (accueil)Le lien de la carte teaser du live est icone seule : l'ancre mesure 16.8x20, le mot « Decouvrir » est en width:0/opacity:0, seul un glyphe fontello 11px (police d'icones sous licence, codepoint prive) est visible. Substitue par un chevron SVG en ligne de meme boite 11px dans _listCard.cshtml, avec le mot conserve dans le DOM (masque) pour l'accessibilite.substitue — remplacer par le vrai glyphe si la police fontello est livree
Fleche de la carte d'archive (cards-archive)Le lien « lire la suite » des listings PDN est glyphe seul : a.post-more-link 18.2x20.3, Krona One 13px, le <span>Read More</span> en display:none. Le glyphe est un codepoint prive fontello dessine en fleche droite longue (capture a 768 et 1440). Substitue par &rarr; dans la meme boite, mot conserve dans le DOM pour l'accessibilite. Le &rsaquo; d'abord pose dessinait un chevron de 8px, deux fois trop court.substitue — remplacer par le vrai glyphe si la police fontello est livree
grappe-bg-right.svg (overlay de la bande vins)La bande vins de l'accueil peint un plant de vigne (grappe_bg_right-1.svg, 305px, ancre 100% 0%) par-dessus le panneau degrade — c'est la « bande overlay elementor » longtemps restee ouverte. Importee dans wwwroot/images/pdn/grappe-bg-right.svg (asset du client, pas hotlinkee).importe — pose par CSS (card-collection--bottles), pas par le contenu

7. Bugs du live NON reproduits (corriges chez nous)

SiteBug liveTraitement
pdnlien footer « CGV » pointe vers la politique de confidentialitecorrige
gilliarday« 2025 TOUS DROITS RESERVES » sur un site 2026annee dynamique
chevaliers« Sur les reseaux » (accent manquant)corrige
chevalierslien /gammes sans prefixe /fr/corrige
chevaliers@font-face : ../../onts/ (typo) et ../fonts/ (mauvaise profondeur) ; aucun woff2non reproduit — on ship du woff2 propre
gilliard (le notre)la carte Google du contact se chargeait avant tout consentement (breche regle #5)corrige — la carte passe par js-embed + <template> : zero requete vers Google avant acceptation

7bis. ✅ RESOLU — le popup de consentement n'a JAMAIS ete casse (faux positif de mesure)

Ouvert le 2026-07-16, clos le 2026-07-17. Le popup fonctionne, et fonctionnait deja. Le bug n'existait que dans l'outil de mesure.

Cause racine : vanilla-cookieconsent a hideFromBots: true par defaut, et son test de bot est (v3.1.0, dist/cookieconsent.esm.js) :

js
!0===c.hideFromBots && u && (r.G = u.userAgent && /bot|crawl|spider|slurp|teoma/i.test(u.userAgent)
                                  || u.webdriver)

Le || u.webdriver est decisif : Playwright met navigator.webdriver = true, y compris en « vrai Chrome ». La librairie nous classait donc en bot et n'affichait rien — sans erreur, sans rejet de promesse, sans #cc-main. Exactement les symptomes constates. Le diagnostic « le site n'a aucun mecanisme de consentement » etait un artefact de l'automatisation.

Preuve (meme page, meme build, seule navigator.webdriver change) :

navigator.webdriver#cc-mainbanniere visible
true (Playwright par defaut)0non
masquee (comme un vrai navigateur)1oui — titre « Cookies »

Confirme independamment par l'utilisateur, qui voit dans son navigateur reel <div class="cm cm--box cm--bottom cm--right">exactement notre configuration (guiOptions.consentModal = { layout: 'box', position: 'bottom right' }). Ce n'est pas un autre CMP qui « prendrait le dessus » : c'est bien le popup du template, pilote par scripts/modules/cookiesConsent.js.

La chaine complete est verifiee de bout en bout sur /contact/ (webdriver masquee) :

banniereiframeshotes tiers contactes
avant consentementaffichee0aucun
apres « tout accepter »fermee (cc_cookie pose)1maps.google.com, www.google.com, maps.gstatic.com, maps.googleapis.com, fonts.googleapis.com

Donc : regle #5 respectee (zero requete tierce avant consentement) et la liberation apres consentement fonctionne. La categorie functional est acceptable, la carte du contact se charge. Rien n'est bloque.

⚠️ Consequence permanente pour toute verification automatisee

Sous Playwright, le popup n'apparait jamais et aucun embed ne se libere. Ce n'est pas une panne — c'est hideFromBots qui fait son travail. Pour tester le consentement ou un embed :

js
chromium.launch({ args: ['--disable-blink-features=AutomationControlled'] })
await ctx.addInitScript(() => Object.defineProperty(navigator, 'webdriver', { get: () => undefined }))

Ne pas « reparer » le consentement parce qu'un script headless ne le voit pas : c'est precisement l'erreur commise ici. Pour le harnais de fidelite c'est plutot commode — la banniere est de toute facon une zone masquee du diff pixel — mais tout controle d'un bloc embed doit masquer navigator.webdriver, sinon il mesure le placeholder.

Anomalie reelle trouvee en chemin (mineure, non bloquante) : css/cookiesConsent/main.css est genere par Vite et n'est reference nulle part dans _MasterLayoutmais il est bien charge (trace reseau : /css/cookiesConsent/main.css 200), Vite l'injectant via le chunk JS. La piste « CSS non reference » de la v1 etait donc, elle aussi, sans objet.

7ter. ✅ PORTE (2026-07-28) — le portail d'age (loading-page age-restricted) — gilliard ET chevaliers

Construit le 2026-07-28 (commit b18500c). Overlay .loading-page.age-restricted rendu par Views/Partials/layout/_ageGate.cshtml depuis _MasterLayout (toutes marques), styles dans base/sections/_age-gate.scss, comportement dans scripts/modules/ageGate.js (cookie age-verified, #age-yes ferme, garde html.age-ok anti-flash). Texte EDITABLE via 5 champs types sur siteSettings (ageGateHeading/Question/YesLabel/NoLabel/Disclaimer), seedes par marque (gilliard avec mention legale ; chevaliers sans). Logo = le logo.svg d'en-tete (le crest anime SVGator de gilliard est approxime, comme le permet le spec). @use ajoute pour gilliard+chevaliers ; pdn/gilliarday restent a faire dans leur chantier. Voir content-model.md section "Controle d'age".

(Historique : trouve le 2026-07-17, initialement differe.)

C'est un composant PARTAGE, identique sur les deux sites — a construire une fois :

html
<div class="loading-page age-restricted">          <!-- position:fixed; z-index:99999; bg #fff; display:flex -->
  <div class="logo"> … </div>
  <div class="age-restrict">
    <div><h3>Bienvenue au Domaine Chevaliers</h3>
         <p>Comme notre site traite de vin, avez-vous l'age legal pour consommer de l'alcool
            dans votre pays?</p></div>
    <div class="btn-wrap">
      <button id="age-yes" class="btn btn-fill">Oui</button>
      <button id="age-no"  class="btn">Non</button>
    </div>
  </div>
</div>
gilliardchevaliers
Classe racineloading-page age-restrictedidentique
position / z-index / fondfixed / 99999 / #fffidentique
LogoSVG inline ANIME (<svg id="e0hkukraut4351">, ids de paths e0hkukraut435N = export SVGator)<img src=".../chevaliers-logo-1.svg"> statique, width:250px
Boutons#age-yes.btn.btn-fill / #age-no.btnidentiques

L'animation dont parlait l'utilisateur : la classe est loading-page — c'est un splash de chargement qui sert aussi de portail d'age ; l'animation est le logo SVG anime de gilliard (le trace se dessine). Mesure faite : pas de SMIL (<animate> absent) et aucun <style> dans le SVG -> les keyframes viennent du CSS du theme, cible sur les ids de paths. A faire au moment de la construction : curl le style.min.css de gilliard et grepper e0hkukraut (+ .loading-page) pour recuperer les @keyframes exacts et la transition de sortie. Ne pas deviner l'animation — c'est la barre du harnais (animation/transition sont dans le set de styles compares).

Note : le <h3>Bienvenue au Domaine Chevaliers</h3> du portail explique le heading orphelin « Bienvenue au Domaine Chevaliers » du premier scrape aplati (content.json) : ce n'etait pas une bande de la page, c'etait le portail d'age.

A trancher a la construction : persistance du choix (cookie ? localStorage ?), comportement du « Non », interaction avec le consentement cookies (deux overlays), et le fait que le portail doit etre invisible aux bots ou non (le live ne l'est pas — le HTML complet est servi derriere).

8. Deferred — a ne pas oublier

  • Re-baseline 1:1 de gilliard. Les pages gilliard ont ete acceptees a l'ancienne barre (« ~3% / proche »), avant le harnais. La passe de fidelite est faite mais pas sur toutes les pages (dernier commit connu : ec350c6). A faire : passer chaque page gilliard au harnais (tools/fidelity) et amener chaque rapport au vert, comme pour les deux autres sites. Objectif : les 3 sites a la meme barre. Etat au 2026-07-16 sur l'accueil @1440 (hero masque) : hauteur de page 5864 (live) vs 4978 (local) — l'ecart restant est le corps de page, pas le hero.

9. Deviation assumee — corps de texte des pages legales

Les pages CGV et Politique de confidentialite rendent leur corps de texte a 12px sur le live (petits caracteres legaux ; mesure gilliard 2026-07-27 : p = 12px / lh 18 / marges 12/12). Notre rebuild garde le corps a 16px (taille body lisible). Choix utilisateur 2026-07-27 : priver la lisibilite sur ces deux pages a faible visibilite plutot qu'un 1:1 pixel avec un texte minuscule. C'est la SEULE page ou l'on s'ecarte volontairement de la taille du live. Si un jour on veut le 1:1 strict, il faut baisser l'echelle de prose de _text-page.scss (par marque : le live chevaliers peut differer de gilliard) — sinon, laisser tel quel.

9bis. Deviation assumee — le tableau d'inventaire des cookies (PDN, mesure 2026-08-01)

La page portedenovembre.ch/politique-de-confidentialite/ rend, sous « Comment puis-je controler les preferences des cookies ? », un tableau d'inventaire de 209 mots genere par le plugin WordPress GDPR Cookie Consent : pll_language (Polylang), cookielawinfo-checkbox-necessary, cookielawinfo-checkbox-non-necessary, _ga, _gid, _gat_gtag_UA_6881176_1. Il est en anglais, et il documente des plugins que notre stack ne fait pas tourner (nous utilisons vanilla-cookieconsent, pas Polylang ni GDPR Cookie Consent, et le GA du live est de l'Universal Analytics deja mort).

Nous ne le reproduisons pas : porter ce tableau reviendrait a publier une documentation fausse sur les cookies reellement deposes par notre site. Un inventaire correct devra decrire NOS cookies, et c'est une decision de contenu du client, pas une tache de migration.

⚠️ Consequence pour toute mesure de volume de texte sur cette page : le live compte 1006 mots rendus, nous 732 - mais le corps reel est a parite (731 contre 732). Ces 209 mots plus 66 mots de pied de page expliquent tout l'ecart. Deux passes d'audit successives ont conclu a tort a « 21 % de texte manquant » sur ce seul artefact. Detail : fidelity-defect-ledger.md §C3.

10. Decisions de contenu (choix utilisateur 2026-07-28)

Arbitrages sur les differences de CONTENU (pas de style) entre le live et notre rebuild, tranches par l'utilisateur le 2026-07-28. Traite / aligne sur le live :

  • emploi (gilliard) : on GARDE la 3e offre "Chef(fe) de Bar" (seedee). Le live n'en montre que 2, mais l'offre reste (des offres seront ajoutees plus tard).
  • domaines (chevaliers) — offres d'emploi : le live affiche "Notre equipe est actuellement complete" (aucune vacance). Le local fait PAREIL (etat vide) tout en gardant le MECANISME : le bloc childListing layout links liste les enfants vacancy ; il suffira d'en ajouter le jour venu.
  • Libelles de formulaires + consentements = alignes sur le live : bouton du formulaire d'activite Envoyer (pas "Envoyer mon message") ; consentement newsletter chevaliers ... confirme etre majeur (chevaliers est 18+), gilliard reste ... avoir 16 ans ou plus. Le bouton contact reste "Envoyer mon message" (identique live). (commit 242529b)

Reste tel quel (derive assumee, NON corrige — a garder en tete) :

  • Titre d'entete des pages legales (les 2 marques) : le live rend un titre de section stylise in-page (ex. "Preambule") ; notre rebuild affiche un <h1> titre-de-page noir. Choix conserve (editabilite / SEO). Le <h1> reste.
  • Guillemets du nom "Le QG" (lieux gilliard) : le live utilise des guillemets droits "Le QG", notre contenu seede utilise les guillemets francais « Le QG » dans le corps RTE. Conserve (typographie francaise).
  • Case de consentement du formulaire d'ACTIVITE : le live affiche une case "J'accepte les CGV et confirme etre majeur" sous les formulaires d'activite ; chez nous showConsent ne s'active que pour contact/inquiry, donc les formulaires d'activite n'ont pas de case. Difference structurelle non signalee a l'audit ; laissee telle quelle pour l'instant.

11. Widget tiers du pied de page - badge Trusted Shops (gilliard, mesure 2026-08-01)

Le pied de gilliard.ch porte, dans sa colonne « Sur les reseaux », un badge Trusted Shops (<minimized-trustbadge-inline-horizontal>, 37px de haut avec margin: 40px 0 20px, soit 97px). C'est lui qui fixe la hauteur de rangee du pied du live a 1440 (273.5 contre 266 chez nous).

Non reproduit : c'est un widget d'un service tiers auquel nous n'avons pas de compte, et il afficherait une note d'avis client qui ne nous appartient pas.

⚠️ Consequence pour la porte de hauteur : le pied de gilliard mesurera toujours environ -7.5px @1440/1920 et davantage a 375. Ce residu est du 1:1 atteint, pas un defaut a corriger. Detail et decomposition complete : fidelity-defect-ledger.md §C5.

12. Deviations assumees - l'arbre allemand (2026-08-17)

Schema d'URL normalise, decision utilisateur du 2026-08-13. Racine -> fr, /de -> de sur les trois marques. Cela DEVIE du live sur deux d'entre elles, volontairement :

marqueFR liveDE livechez nous
Gilliard/fr//de/racine -> fr, /de -> de
Chevaliers/fr/racineracine -> fr, /de -> de
PDNracine/de/racine -> fr, /de -> de

Gilliarday reste FR, sans domaine DE.

Segments d'URL allemands qui different du live, tous mesures :

  • chevaliers /de/aktivitaeten/ contre le live /aktivitaten/. Les doctypes de Chevaliers ne composent pas umbracoUrlName (seuls activity, contentPage, pdnArticle, pdnContentPage et product le font), donc Umbraco derive le segment du nom allemand et rend le trema par ae. Y remedier voudrait dire ajouter une propriete a quatre doctypes ; le segment est le seul ecart.
  • chevaliers /de/domaines-chevaliers/ contre le live /domaines-chevaliers-2/. Le -2 est un artefact de slug duplique cote WordPress, pas une URL choisie.
  • PDN pose bien ses segments exacts (/de/weine/, /de/der-club/, /de/goodies-2/), parce que pdnContentPage compose umbracoUrlName.

Pages allemandes qui n'existent pas sur le live et ne sont donc pas seedees : news et evenements de PDN (/de/news/ redirige, /de/events/ renvoie 404). Leurs equivalents /de/cocktails-2/ et /de/news-veranstaltungen/ existent bien, eux, et sont portes - leur appariement Polylang manquait dans l'export, la page pas.

Contenu allemand de Gilliard : absent. Ses 39 pages allemandes existent dans l'export, mais ses pages francaises sont composees a la main en C# (DevSeedPagesController), sans scrape ni generateur - il n'y a donc aucun chemin mecanique vers l'allemand. L'arbre DE de Gilliard route et sert le chrome allemand ; son corps de page reste a construire.

Contributors

No contributors

Changelog

No recent changes