feat(contracts): déclarer silver.observation_v2 et sa quarantaine MF (#27) - #28
Conversation
…27) infoclimat-labs/chom-poc-data#178 (merge d0be025c) débloque la migration temporelle Silver #79/#176 mais le runbook exige les contrats ODCS gouvernés avant toute mutation de production. - contracts/silver.observation_v2.odcs.yaml : dataset Iceberg canonique (draft, v0.1.0), extension additive jour_climatologique_local + tz_iana ; aucune table observation_v3, versionnement ODCS existant (v3.0.2) conservé, format aligné sur silver-ref-station/gold-*. - contracts/silver.observation_v2_quarantine.odcs.yaml : dataset interne hors serving/Gold pour les stations sans_controle (#176), provenance complète (quarantine_reason, decision_id, quarantined_run_id, quarantined_at), aucun consommateur déclaré (never_served). - lineage/jobs.yaml : jobs batch.silver_v2_temporal_backfill et batch.catchup_silver_delta, entrées bronze.mf_horaire/mf_infrahoraire/ mf_quotidienne + dim.station (iceberg://warehouse, noms de table réels du code chom-poc-data), sorties silver.observation_v2 et silver.observation_v2_quarantine — lineage minimal, sans consommateur inventé pour la quarantaine. - tools/tests/test_silver_observation_governance.py : valide la structure ODCS des deux contrats, l'absence de consommateur de la quarantaine, et la cohérence exacte lineageJob ↔ lineage/jobs.yaml (mêmes assertions que test_station_reference_governance.py pour le référentiel station). Le bucket S3 physique de iceberg://warehouse n'est pas documenté ailleurs dans le dépôt ; les contrats référencent le namespace de lineage (iceberg://warehouse/<table>) plutôt qu'un chemin S3 non vérifié — à ajuster si un chemin concret existe déjà côté infra. Refs #27, infoclimat-labs/chom-poc-data#79, #83, #176, #178. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
CHANGES_REQUESTEDRevue indépendante du SHA exact Bloquant — lineage inexact et faux « aucun consommateur » de la quarantaine
Bloquant — serveur/localisation S3 non sourcésLes deux contrats déclarent Important — statut et clé du contrat ne matérialisent pas l'autorisation demandéeLes deux fichiers restent Important — consommateurs Gold et tests incompletsLe Validations rejouées sur ce SHA
Décision : CHANGES_REQUESTED. |
… observation_v2 (#27) Correction round 1 pour la revue CHANGES_REQUESTED de la PR #28 (SHA 19415b6), contre infoclimat-labs/chom-poc-data@d0be025c : - lineage/jobs.yaml : sépare batch.silver_v2_temporal_backfill (aucun Bronze lu, auto-lecture silver.observation_v2 + silver.observation_v2_quarantine) de batch.catchup_silver_delta (bronze.mf_horaire/mf_infrahoraire/mf_quotidienne par famille mf-h/mf-i/mf-q + dim.station + auto-lecture Silver/quarantaine), déclare les 5 jobs Gold consommateurs réels (gold_dataclimat, gold_v2, gold_ic, gold_statIC, gold_canicule), vérifiés dans le code producteur. - Les deux contrats : status draft -> active (gate réel post-fusion, cohérent avec silver-ref-station) ; server s3/location fictif remplacé par une identité logique du catalogue REST Lakekeeper (chom/ic), aucun bucket S3 inventé ; primaryKey explicite (station_uid, dh_utc, parametre, source) sur le canonique ; quarantaine : consumers reflète les deux auto-lectures Silver réelles, never_served clarifié comme "aucun Gold/serving" plutôt que "zéro lecteur". - tools/tests/test_silver_observation_governance.py : remplace l'oracle auto-référentiel par des assertions fidèles au code producteur (types de schéma comparés à SILVER_SCHEMA_TEMPOREL, arêtes de lineage par job, jeu de consommateurs Gold réel, absence de bucket S3 inventé). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Correction round 1 — réponse à CHANGES_REQUESTED (#pullrequestreview-comment 5273874282)SHA de correction : Bloquant — lineage inexact et faux « aucun consommateur » de la quarantaineConfirmé en lisant le code producteur ligne à ligne :
Correction (
Bloquant — serveur/localisation S3 non sourcésVérifié Correction : les deux Important — statut et clé du contrat
Important — consommateurs Gold et tests incompletsVérifié dans le code producteur que
Validations rejouées sur
|
CHANGES_REQUESTED — re-revue indépendanteRevue du SHA exact Bloquant —
|
…tirer les primaryKey non établies Corrige les 3 points bloquants de la revue indépendante round 2 (github.com//pull/28#issuecomment-5274009493), vérifiés contre infoclimat-labs/chom-poc-data@d0be025c : - batch.catchup_silver_delta déclare maintenant les quatre entrées Bronze IC (bronze.synop, bronze.static, bronze.metar, bronze.bouees) en plus des trois Bronze MF : main() exécute par défaut run_ic() ET run_mf() sous une seule identité de job, sans sélecteur en invocation de production (deploy/catchup_all.sh:59-66). - batch.gold_qc_pics est déclaré comme job consommateur direct de silver.observation_v2 et producteur de gold_qc.pic_temperature (gold_qc_pics.py:151-229), et ajouté aux consommateurs du canonique. - Les primaryKey des deux contrats (canonique et quarantaine) sont retirées : aucun writer ne prouve l'unicité de ligne à ce SHA (version_obs=1 partout, doublons connus signalés par gold_v2_journaliere.py:46-54). Une règle de qualité identity_and_uniqueness_not_established documente explicitement ce POC append-only. La règle never_served de la quarantaine cite désormais dh_source_local, son seul champ d'horodatage réel, au lieu de dh_utc. Les tests recopiaient un oracle incomplet plutôt que de couvrir toute la source autoritative ; ils sont mis à jour pour vérifier ces faits exacts (edges physiques exactes, absence de primaryKey, champ réel de quarantaine) sans promettre de découverte dynamique. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Correction round 2 — réponse au commentaire indépendantRéponse à #28 (comment), à jour au commit Cause de non-convergence identifiée : les tests locaux recopiaient un oracle incomplet au lieu de couvrir toute la source autoritative, donc une CI verte ne détectait pas les omissions. Les 3 points bloquants/importants sont corrigés : 1.
|
CHANGES_REQUESTED — validation finale cibléeRevue du SHA exact Bloquant —
|
Correction finale ciblée — réponse à CHANGES_REQUESTEDCorrection mécanique du SHA revu
Validations rejouées : |
APPROVE — revue finale indépendante (Claude Opus 5, provider croisé)Revue du SHA exact Finding bloquant précédent —
|
Résumé
infoclimat-labs/chom-poc-data#178 (merge
d0be025c) débloque la migration temporelleSilver #79/#176, mais le runbook exige que les contrats ODCS correspondants soient
versionnés dans ce dépôt gouverné avant toute mutation de production.
contracts/silver.observation_v2.odcs.yaml— dataset Iceberg canonique(
draft,v0.1.0), porte l'extension additivejour_climatologique_local+tz_ianade #79. Aucune tableobservation_v3n'est créée ; le versionnementODCS existant du dépôt (
apiVersion v3.0.2) est conservé, format aligné sursilver-ref-station.odcs.yaml/gold-*.odcs.yaml(schéma de table imbriqué,customProperties.lineage+lineageJob).contracts/silver.observation_v2_quarantine.odcs.yaml— dataset interne horsserving/Gold pour les observations des stations
sans_controle(#176) : provenancecomplète (
quarantine_reason,decision_id,quarantined_run_id,quarantined_at), aucun consommateur déclaré (never_served).lineage/jobs.yaml— deux jobsbatch://chom-poc-data:batch.silver_v2_temporal_backfill(rétro-remplissage borné) etbatch.catchup_silver_delta(writer incrémental), entréesbronze.mf_horaire/bronze.mf_infrahoraire/bronze.mf_quotidienne+dim.station(namespaceiceberg://warehouse, noms de table réels vérifiés dansle code
chom-poc-data@d0be025c), sortiessilver.observation_v2etsilver.observation_v2_quarantine. Lineage minimal et exact : aucunconsommateur inventé côté quarantaine.
tools/tests/test_silver_observation_governance.py— valide la structure ODCSdes deux contrats, l'absence de consommateur de la quarantaine, et la cohérence
exacte
lineageJob↔lineage/jobs.yaml(même schéma d'assertions quetest_station_reference_governance.pypour le référentiel station).Décisions non bloquantes (documentées, pas d'exécution requise)
status: draftpour les deux contrats — cohérent avec l'ensemble des contratsIceberg POC-lakehouse déjà déclarés (
gold-ref,gold-ic,gold-climato-v2, etc.,tous
draft), bien quesilver.observation_v2soit décrit comme « réellementservi » côté chom-poc-data.
iceberg://warehousenon documenté ailleurs dans cedépôt (seul
dim.stationy était référencé jusqu'ici, sans chemin S3 concret).Les deux contrats déclarent
location: iceberg://warehouse/<table>(identité delineage) plutôt qu'un chemin S3 non vérifié — à ajuster si un chemin concret existe
côté infra.
batch.silver_v2_temporal_backfilletbatch.catchup_silver_deltaécrivent tous deux danssilver.observation_v2et laquarantaine, selon le code réel) :
lineageJobutilise une clé"producers"(liste)plutôt que
"producer"(singulier, utilisé par les contrats du référentielstation) — ce format n'est pas encore standardisé dans le dépôt, testé
explicitement par le nouveau fichier de tests plutôt que réutilisé tel quel depuis
test_station_reference_governance.py.Hors périmètre (volontaire)
Aucune infra ni déploiement : pas de migration réelle, pas de runbook data-platform
(le runbook opérationnel reste côté
chom-poc-data), pas de mise à jour deGOVERNANCE.md(le pôle Iceberg lakehouse POC n'y est pas encore représenté pour lescontrats sœurs
silver-ref-station/gold-*non plus) ni decatalog/catalog.yaml(ce catalogue ne couvre aujourd'hui que les datasets TimescaleDB/MariaDB, pas la
couche Iceberg).
Tests
Closes #27
Refs infoclimat-labs/chom-poc-data#79, #83, #176, #178.