Changelog
Toutes les modifications notables sont documentées ici. Format basé sur Keep a Changelog. Versionnement Semantic Versioning.
[Unreleased]
Changements
- Doc capabilities — passe de 78 à 117 capabilities documentées (FR + EN), 11 → 18 catégories. Ajout des sections : overlay & combinaison, manipulation d'attributs, pivot/unpivot, sélection ordonnée & échantillonnage, multipart & dimensions Z/M, transformations géométriques, frontière & projection, temporel, 3D pointcloud.
- Playground manifest — régénération avec les 6 scénarios réellement déployés (S1 flood-risk, S2 data-quality, S3 accessibility, S4 road-setback, S5 green-spaces, S6 real-estate). L'ancien manifeste ne listait que
road-setback. - Build playground idempotent —
scripts/build_playground_data.py: nouvelle fonction_entry_from_diskqui émet une entrée manifest depuis les fichiers existants quand le GPKG source est absent.
Corrections
- CHANGELOG v1.1.0 — corrigé : S5 décrit comme « Park accessibility » (et non « Canopy typology »), mention du « S7 / seven-scenario index » retirée car jamais livrée.
- Pages orphelines —
playground/environmental-ndvi.md(FR + EN) supprimées : redirections JS dépréciées, plus aucune référence source.
Suppressions
- Scénario S7 dvf-heavy-tail — spec retirée du build script ; le dossier de données orphelin a été supprimé. La page n'avait jamais été créée côté docs.
[1.1.1] — 2026-04-25
Ajouts
capabilities/vector/— le monolithevector.py(4 359 LOC, 43 capabilities) a été éclaté en un package de 32 sous-modules par domaine. La surface publique est préservée via shim de re-export ; tous lesfrom capabilities.vector import ...continuent de fonctionner.
Changements
gispulse/__init__.py—__version__fallback passe de"1.0.0"codé en dur à"unknown"quandimportlib.metadatan'est pas disponible.portal/package.json+docs-site/package.json— versions synchronisées sur1.1.1pour matcherpyproject.toml.
Corrections
- Accessibilité — navigation clavier sur
PipelinePanel, imports portail unifiés sur les tokens du design system.
[1.1.0] — 2026-04-25
Ajouts
- Playground scenarios — S5 Accessibilité aux parcs (Versailles, BD TOPO végétation ≥ 1 ha +
nearest_neighbor+classify, cron hebdomadaire) et S6 Carte du prix au m² DVF (8 étapes, fishnet 50 m, palette YlOrRd quintiles). - Capabilities — classification & stats —
head_tail_breaks(Jiang 2013),normalize(log1p / minmax / zscore),grid_create,hexgrid_create,spatial_aggregate,classify_categorical,bivariate_choropleth,graduated_size,continuous_ramp,kde_heatmap. Clustering :cluster_kmeans,cluster_dbscan,cluster_hdbscan,morans_i,getis_ord_g,nearest_neighbor,od_matrix,spatial_weights. - Capabilities — 3D pointcloud — sprint LAS / LAZ :
pointcloud_load_las,pointcloud_filter_classification,pointcloud_zonal_height,pointcloud_grid_summary. - Capabilities — manipulation de couches P0-P3 — overlay (
overlay_intersection,overlay_union,erase), sélection (sort,deduplicate,random_sample,top_n), shape ops, transformations (affine_transform,swap_xy,reverse_lines), Z/M (add_z,drop_z,add_m,drop_m), pivot/unpivot,classify_by_ring,merge_layers, attribute logic (add_field,drop_field,select_columns,rename_field,cast_field,attribute_join,lookup_table,coalesce_fields,case_when), temporal (temporal_filter,temporal_join). - Playground UX — dessin rubber band avec snap-to-close + raccourcis clavier + mesure live sur la carte ; styling intersection polygone côté client (S4 road-setback).
- DVF Etalab 2022-2024 — dataset bundlé dans
examples/prepare_playground_data.py --city versailles(couchedvf_ventes). - Style sidecars — fichiers
.style.qml/.style.sld/.legend.jsonémis à côté des sorties vecteur pour import direct dans QGIS / GeoServer. - SQL preview — gate d'authentification explicite + blocklist de capabilities sur la capability PostGIS SQL.
Changements
core/config.py— centralisation de toutes les variables d'environnement dans un module Pydantic Settings unique (13 groupes :engine,database,storage,s3,api,oidc,session,redis,logging,audit,stripe,telemetry,jobs). Rétro-compatible avec tous les nomsGISPULSE_*existants.- Moteur par défaut — passe de
duckdbàgpkg(mode portable GPKG / GeoPandas). - Suppression des
os.environ.get()éparpillés — routers, adapters, persistence : tout passe parsettings. - Playground S5 réécrit en accessibilité aux parcs par bâtiment — végétation BD TOPO ≥ 1 ha (SCoT IdF),
nearest_neighbordistance bâti → parc, classification contre les seuils OMS / SCoT / ADEME (300 / 600 / 1000 m). L'ancien trigger NDVI / canopée a été retiré. - Playground S6 étendu au fishnet 250 m puis resserré à 50 m pour une heatmap haute résolution.
- Playground S3 — pipeline 6 étapes ramené à 3 via
cost_budgets+classify_by_ring(4 isochrones concentriques 500 / 750 / 1000 / 1500 m). adapters/http— fork namespace résolu : arborescence legacy supprimée, entrypoints prod basculés surgispulse.adapters.http.app.- Sécurité —
MD5remplacé parBLAKE2b,evalsandboxé pournp,_ensure_validrestauré.
Corrections
- Capabilities — 4 P0 fermés :
force_geometry_type(cible GeometryCollection),attribute_joinsur DataFrame nu, NaN crash dansadd_z/add_mcheminfrom_column,singleparts_to_multipart(perte silencieuse sur types geom mixtes). - Capabilities — pointcloud grid 2D NaN, KDE grid blow-up, sandbox RCE de
Calculate. - Tests — 27 tests ressuscités après déblocage du CI,
__init__.pyshadow supprimé,asyncio_mode = "auto"activé, SyntaxErrorworkflows/ftth_network_analysis.pycorrigée. 3 600+ tests au vert. - Tests — isolation des mutations
GISPULSE_ENGINE; conftest auth-disabled-by-default. - Billing —
StripeSettingspar défaut + messages d'erreur actionnables quand les clés Stripe manquent. - Capabilities —
clip/intersects: évite la vérification truth-value surGeoDataFrame;spatial_predicatefallback rendu explicite. - Playground — S6
drop_price_outliersrenommédrop_value_outliers(filtre survaleur_foncierebrut, pas le prix au m²). - i18n — strings
PipelinePanel; alignement du moteur par défaut ; pipelinesref_layersplural. - Performance —
DualMapViewlazy-loadé. - Rules router — validation du payload avant persistance (400 avec erreurs structurées).
[1.0.2] — Sprint S1→S6 (2026-04-12)
Six sprints d'audit et hardening : securite, architecture, tests, observabilite, couverture routers, metriques Prometheus.
Ajouts
Architecture — Grammaire déclarative v2 (Sprint S1)
PipelineSpec/StepSpec/TriggerSpec— grammaire unifiée remplaçant 3 DSLs divergents (rules, triggers, graph)- Support DAG — les steps peuvent référencer d'autres steps via
step.input - Steps conditionnels — évaluation de prédicats
step.whensur le GeoDataFrame courant - Triggers inline — syntaxe
on/when/thendans le pipeline - Rétro-compatible — les pipelines v1 (flat rule lists) sont auto-convertis en v2
PipelineExecutor— exécuteur unifié (mode linéaire et mode DAG viaGraphExecutor), remplace le choix entreSessionManager/JobRunner/ScenarioRunnerPluginRegistry[T]— registre générique thread-safe avec découverte par entry pointsBoundedLayerCache— cache LRU extrait deapp.pyverscore/cache.pyProductionAuthMiddleware— extrait decreate_app()versmiddleware/production_auth.py
Pipeline v2 API (Sprint S2)
POST /api/pipelines/execute— exécution de pipelines v2 avecPipelineSpecJSONPOST /api/pipelines/validate— validation dry-run d'un pipelineGET /api/pipelines/examples— exemples de pipelines v2- CRUD
/api/triggers/{id}/operations— persistance des opérations spatiales dans les triggers SessionManager.run_pipeline_v2()— délègue nativement auPipelineExecutor- TypedDict pour 10 capabilities —
FilterParams,BufferParams, etc. danscore/capability_params.py - PipelineEditor — mode éditeur dans le Portal : import/export JSON v2, exécution via
/pipelines/execute
Portal — Décomposition et WebSocket (Sprint S3)
LayerItemButton(275L) etDatasetItem(150L) extraits deLeftPanel.tsx(1183→774 lignes)- WebSocket listener remplace le polling
setIntervaldanstransformStore - CI GitHub Actions — workflow
ci.ymlavec backend (pytest, ruff) et frontend (tsc, vite build)
Documentation et outillage (Sprint S4)
scripts/export_openapi.py— génèredocs/openapi.json+docs/API_REFERENCE.mdautomatiquement, commandemake docs- QUICKSTART.md, RULES_GUIDE.md, TRIGGERS_GUIDE.md, API_QUICKSTART.md — 4 guides utilisateur
docs/openapi.json— spécification OpenAPI 3.1 complète (88 endpoints)
Changements
Modèles (Sprint S1)
core/models.pyscindé (795→280L) en 6 modules :enums.py,conditions.py,predicates.py,graph.py,relations.py,session.pyRule.orderextrait du bagconfigvers un champ dédié- Réexports backward-compatible — zéro changement d'import dans le code existant
Portal (Sprint S3)
- Renommage types de prédicats — suppression du suffixe
*Node(AttrPredicateNode→AttrPredicate, etc.) - Forge operations connectées —
OperationExecutor→ ESB : actionsRUN_SQLexécutées end-to-end
Supprimés
- Stubs clients non fonctionnels —
clients/qgis/,clients/arcgis/,clients/desktop/(code conservé dans l'historique Git) - ESB
CircuitBreakeretDeadLetterQueuemarquésEXPERIMENTAL, lazy-import uniquement
Securite (Sprint S1)
- Patch de 13 vulnerabilites critiques (7 injections SQL, 2 RCE, 1 auth bypass)
- 114 tests de securite couvrant tous les vecteurs d'audit
hmac.compare_digest()pour toutes les comparaisons d'authentification (timing-safe)- Headers de securite Nginx — CSP, X-Frame-Options DENY, X-Content-Type-Options nosniff, Referrer-Policy
- Rate limiting sur
/api/filter/preview(30/min) et/api/filter/apply(20/min) pip-auditbloque maintenant le CI sur les CVEs connues (suppression du|| true)- Validation GISPULSE_MAX_UPLOAD_MB — gestion des valeurs invalides, cap a 5GB
Architecture (Sprint S2)
- Migration structlog — remplacement de
print()etloggingpar structlog dans ESB workers et pg_notify - Logging des exceptions silencieuses — 6 handlers
except: passremplacés parlog.debug()/log.warning() - Fix race condition jobs — vérification d'annulation AVANT persistance des résultats
- Timeout dataset loading — 300s max pour éviter les blocages sur gros fichiers
- Fix collision triggers — utilisation de l'UUID du trigger comme suffixe (supporte plusieurs triggers par table)
- Limite WebSocket — 1MB max par message sortant
Observabilite (Sprint S4 + S6)
MetricsMiddleware— métriques HTTP automatiques :gispulse_http_requests_total(par method/path/status),gispulse_http_request_duration_seconds,gispulse_http_requests_in_flight- Normalisation de chemin — remplacement des UUIDs et segments numériques pour réduire la cardinalité Prometheus
- Trace ID correlation —
_log.error("unhandled_exception", trace_id=...)dans le error handler - Migration jobs_router — stdlib
loggingremplacé par structlog avec keyword args - Docker non-root —
USER appuser(uid 1000) dans le Dockerfile .dockerignore— exclut .git, node_modules, tests, docs, .env, IDE files.pre-commit-config.yaml— ruff lint+format, trailing whitespace, YAML check, détection de clés privées
Tests (Sprints S3 + S5)
- 2 439 tests passent (contre 2 205 en v1.0.1), +234 tests ajoutés sur 6 sprints
- 106 fichiers de tests (unitaires + intégration + sécurité)
- Couverture routers : 85% (23/27 routers testés, contre 33% avant)
- Nouveaux fichiers :
test_rules_router,test_triggers_router,test_jobs_router,test_datasets_router,test_cli,test_persistence_io,test_auth_router,test_admin_router,test_scenarios_router,test_schedules_router,test_catalog_router,test_relations_router,test_filter_router,test_portal_datasets_router,test_esb_router,test_tiles_router - CI : mypy (type checking core modules) + ESLint/Vitest (frontend lint + tests)
- 90 fichiers de tests (unitaires + intégration + sécurité)
[1.0.0] — 2026-04-06
Release initiale publique. 27 capabilities, 1 836 tests, moteur multi-backend DuckDB/PostGIS.
[0.1.0] — 2026-03-31
Ajouts
Moteur central
- Moteur geospatial DuckDB avec modes portable SpatiaLite et persistant PostGIS
SessionManageravec pipeline E2E, patternExecutionStrategy, support session SpatiaLiteJobRunneravec exécution asynchrone et suivi de statut des jobs- Opérations cross-layer : spatial join, système de layer de référence, support multi-layer
- Pagination, association datasets, CRUD projets
- Migration PyOGRIO pour I/O multi-format
- Robustification edge cases : zones shadow, centroïde, capabilities surface/longueur
- Support GeoParquet et serveur OGC avec serveur de tuiles MVT
CLI
- Entry point CLI Typer (
gispulse) - Commandes :
init,validate,info,layers,formats,capabilities,serve,portal,doctor - Acceptance multi-format via la couche I/O intégrée
Capabilities vectorielles (10)
buffer— buffer métrique avec reprojection automatiqueunion— fusion de toutes les featuresreproject— reprojection CRSfilter— filtre attributaireclip— découpe par layer de référenceintersects— filtre par intersection spatialespatial_join— jointure spatialecentroid— extraction des centroïdesarea_length— calcul surface et longueurdissolve— dissolution par attribut- Registre de capabilities avec auto-découverte
- Injection de capabilities lifespan-managed
Règles
- Système rules-as-config avec définitions JSON
- Rule editor UI avec predicate builder
- Évaluation de règles basée sur triggers avec
auto_evalet SSE eval-stream
Persistence
- Mode PostGIS persistant avec live sync et intégration pg_notify
- Mode SpatiaLite portable (session niveau 2, serverless)
- Export GPKG depuis le catalogue
- Scene manager avec snapshot et restore
API REST (FastAPI)
- API REST complète : projets, datasets, features, sessions, règles, triggers, scénarios
- 14 routeurs, 100+ endpoints
- Mise à jour de features, exécution SQL, endpoints relations
- Endpoints d'ingestion OGC Features
- Streaming SSE pour les résultats d'évaluation de triggers
- Configuration hot-reload Docker pour API et Portal dev servers
- Error handlers globaux
{"error": {"code", "message", "detail"}}pour 400/404/422/500
Portal (React 19)
- Layout 5 workspaces : Explorer, Map, Workflows, Catalog, Data
- Layer tree avec groupes, color picker, légende et symbologie
- Layout de panneaux redimensionnables avec ActivityBar et Inspector
- Node editor (XyFlow/ReactFlow v12) avec 9 types de nœuds, NodePalette, inspector inline
- Trigger stepper, barre de scénarios, UI opérations spatiales
- Console SQL et inspecteur de features
- Workspace Catalog avec cartes, favoris, mini-map, filtrage domaine
- Dark mode avec tokens design OKLCH, police Geist, notifications toast
- Palette de commandes (Ctrl+K), raccourcis clavier (1–5, Ctrl+I/B/K/S/?)
- Upload drag-and-drop et import URL, export GPKG avec styles QML
Viewer
- Viewer spatial deck.gl embarqué servi via
gispulse serve
ESB / Triggers
- Bus d'événements avec pg_notify, routage, circuit breaker, dead letter queue
- Trigger Builder UI avec composition de prédicats
SessionProvisioneravecTriggerEvaluatoret SSE eval-stream
Catalogue
- Catalogue de données GIS : projections, fonds de carte, flux WMS/WFS, sources open data
Tests
- 46 fichiers de tests : unitaires et intégration
- Tests d'intégration E2E SpatiaLite
- Configuration pytest avec support async