Dérivation d'importance ; mise en page en couches ; sémantique de versionnage ; limites connues.
La taille de la station est pilotée par un score d'importance dans [0..1] calculé à partir du nombre de profils attachés (40 %), du nombre de votes de panel (30 %, lecture M19.5), du nombre de parrainages (20 %, lecture M19.7) et de la récence (10 %). Avant M19.5 / M19.7, la formule se dégrade gracieusement — les LEFT JOIN retournent zéro et le score reflète la densité actuelle du corpus.
Nous calculons la mise en page en couches à la main plutôt que d'ajouter `d3-dag`. Les stations sont assignées aux couches par la profondeur du plus long chemin de prédécesseurs ; à l'intérieur de chaque couche, elles sont ordonnées par barycentre (priorité y moyenne des prédécesseurs) avec un départage stable sur l'id de station. `roles.metro_layout_hint` issu de la curation admin en production remplace les deux coordonnées, si présent.
La version est un hachage FNV-1a 64 bits sur une sérialisation déterministe de (discipline, juridiction, locale, identité-archétype de rôles, drapeaux de barrière des IU, liaisons de matériel). Même contenu → même hachage. Quand vous intégrez une carte avec une version épinglée, l'iframe reste stable malgré les futures modifications.
Les exports statiques utilisent `@resvg/resvg-js` (SVG → PNG raster) et `pdf-lib` (PNG → PDF d'une page). Pas de Chromium headless — garde le contexte Docker léger et les démarrages à froid Cloud Run rapides. Trois tailles (petit/moyen/grand) ; trois formats (svg/png/pdf).
Citez une carte par son lien permanent : /[lang]/transformations/[discipline]/v/[version]?jurisdiction=ISO3. Le lien permanent épingle la version par hachage de contenu ; même si le corpus évolue, l'URL citée reste stable.