Skip to content

Rétrospective — Epic CVN-N014-ED · Inter-task data transport

Rétrospective de clôture de l'Epic CVN-N014-ED (4 Stories : S01–S04, toutes Closed). Input obligatoire de la clôture d'Epic (ADR-69 §14, OPERATIONS §16.4) — résumée et liée par la note de clôture, jamais remplacée par elle.

0. Contexte

L'Epic naît de l'incident fondateur s43 (CVN-N001-EI-S05) : une tâche écrivait ses prédictions via np.savez dans un /tmp local au pod, une autre tâche tournait dans un autre pod, lisait un /tmp vide → cohorte vide → verdict INCONCLUSIVE_TOOLING. Cause racine : aucun standard de transport inter-tâches — chaque DAG improvisait son stockage intermédiaire. L'Epic devait : (S01) poser le standard, (S02) le valider sur s43, (S03) solder les workarounds, (S04) le défendre contre la régression.

1. Hypothèses falsifiables — tenues / infirmées

Hypothèse Verdict
S01 — un flip global du backend object-storage XCom suffit (pas de store bricolé) tenue — flip live + validé, working-set XCom offloadé observé
S01 — XComObjectStorageBackend sérialise nativement numpy (Epic §2) INFIRMÉE (finding v4) → Route Y (XCom = références), Epic §2 corrigé
S02 — s43 en pass-by-référence S3 résout le cross-pod tenue — smoke 5/5 pods distincts, verdict science (C_FRAGILE_TO_SELECTION) et non la signature du bug (INCONCLUSIVE_TOOLING)
S03 — il reste des workarounds large-data à étrangler INFIRMÉE — inventaire vide (s43 conformant, s18 single-pod borné, launchers JSON-FP)
S04 — un gate dags/** suffit à défendre le standard INFIRMÉE au plan_review — le code de transport vit dans src/ ; gate étendu à src/commun/finetune/** + scripts/**

2. Planifié vs réel

  • Planifié : 4 Stories séquentielles, standard → validation → cleanup → fence.
  • Réel : séquence respectée ; deux re-cadrages majeurs pilotés par les findings (numpy non-natif en S01→S02 ; périmètre du gate en S04). Aucun dérapage de scope ; S03 a fermé « non-rolling » (inventaire vide) plutôt que de rester ouvert.

3. Garde-fous déclenchés

  • S01 cut-over : échec au 1er essai sur l'encodage de section dottée (common.ioAIRFLOW__COMMON_IO__) → RCA + fix-forward (PRs #1118/#1119), kill-switch revert+re-trigger répété.
  • S04 plan_review : blocker load-bearing (gate dags/**-only aurait raté l'incident fondateur) → périmètre corrigé avant impl. check-yaml a bloqué le mirror prompt-library (frontmatter multi-doc) → exclude documenté (corrige un gap latent).
  • CI : mkdocs --strict, G1–G4 guardrails, CodeRabbit — tous verts au merge de chaque Story.

4. Ce qui a marché

  • Recon avant build (S01 Route A recon-fondée) : l'audit statique a prouvé un parc near-inert → blue/green Tier-1 évité.
  • Preuve in-vivo (S02 smoke 5/5) : valider le cross-pod sur de vrais pods distincts, pas en unit-test (qui ne voit pas la frontière de pod).
  • Fermer sur l'évidence (S03 inventaire vide publié) plutôt que d'inventer du travail.
  • Le plan_review comme filet de conception (S04) : a attrapé le périmètre faux du gate avant une ligne de code.

5. Enseignements durables → mémoire

  • Vérifier la résolution d'une config, pas sa présence (conf.get/valeur effective), section dottée Airflow → env underscore. → [[feedback_verify_resolution_not_presence]].
  • Un gate doit couvrir la surface runtime du risque, pas seulement le fichier d'orchestration : le bug vivait dans src/, pas dans le DAG.
  • La classe de bug « transport bricolé » est invisible au test unitaire (tmp_path passe au vert en échouant cross-pod) → enforcement à la review, pas au runtime.
  • git add <glob> en zsh sans match abort la commande → fichiers silencieusement non-stagés (a coûté un hub). → git status après add.

6. Follow-ups / hand-off

  • Standard défendu en continu : le gate CodeRabbit (dags/** + src/commun/finetune/** + scripts/**) + la checklist comité pr_review sont actifs ; une fixture de régression du gate reste un follow-up (P1, S04 §4.5).
  • Limite résiduelle connue : un step-script KPO via image custom hors des globs n'est pas couvert → check CI statique = extension future possible (hors Epic).
  • Lifecycle S3 : xcom-objectstorage-7d-retention + s43-predictions-7d-retention actifs sur cvntrade-artifacts.
  • Méta : l'Epic est le premier dogfood de la skill epic-close (CVN-N014-EC-S18) — sa clôture exerce les 7 gates.

7. Outcome

Les 4 Stories Closed, le bug « transport bricolé par-tâche » corrigé (S01–S03) et structurellement dissuadé / review-gated (S04). L'Epic atteint son critère d'acceptance qualitatif : le bug fondateur ne peut plus revenir silencieusement. Prêt pour la note de clôture + fermeture de version.