Skip to content

Architecture — CVN-N014-EC-S16 : dev-productivity tooling

Réfs : plan · runbook · test strategy · process docs XCom reader + worktrees. Tooling Story — deux outils indépendants ; "architecture" = leur construction + les patterns porteurs.

1. airflow_xcom_pull.py — lecteur XCom read-only in-pod

laptop ──kubectl exec──► scheduler pod ──in-pod SELECT──► Airflow metadata DB (private VPC)
   │                          │
   │   (embedded _REMOTE_PROBE: SELECT only, JSON out)        no creds leave the cluster
read-only guard: every statement must begin with SELECT, no DDL/DML verb (fail-fast)

Pattern porteur : la DB de métadonnées est sur un VPC privé inatteignable du laptop ; le pod scheduler, lui, a la conn string + la reachability. L'outil embarque une sonde Python exécutée dans le pod via kubectl exec. Miroir de scripts/loki_query.py (CVN-N014-EC-S02). Read-only par construction (committee Q2) : la sonde n'émet que des SELECT, et un garde (assert_select_only host-side + _guard runtime in-pod) refuse tout verbe DDL/DML — verrouillé par 23 tests.

2. new_worktree.sh — bootstrap « second développeur »

new_worktree.sh <branch> [dir] [base]
  ├─ git worktree (shared .git, no second clone)
  ├─ symlinks: .venv_airflow · .env · .claude/settings*.json
  ├─ symlink: ~/.claude/projects/<wt>/memory → primary memory (shared handoffs)
  └─ per-worktree git identity (extensions.worktreeConfig + git config --worktree)   ← committee Q4

Pattern porteur : un git worktree partage l'object-store .git (pas de second clone, pas de dérive au fetch) ; les symlinks rendent l'environnement local-only (venv/secrets/réglages/mémoire) commun → le second workspace est un vrai clone fonctionnel. L'identité git est per-worktree (committee Q4) pour éviter la fuite via le .git/config partagé.

3. Foot-guns encodés (iron rules)

  • git stash = pile partagée entre worktrees → ne pas stash dans un worktree (réalisé en vrai cette session : git stash -u a avalé le symlink venv de dev2). Mitigation : guidance « Parking WIP without git stash » + identité per-worktree.
  • Sérialiser les runs cluster (DAG/FTF) entre les deux devs (max_active_runs=1, pool + ftf_config partagés).
  • Brancher depuis origin/main après fetch (le main local peut être périmé).

4. Conformité ADR

  • ADR-25 (no silent fallback) : le lecteur fail-fast (pas de pod / non-JSON / verbe interdit → erreur explicite, jamais un résultat vide inventé).
  • Read-only : aucune écriture en base ; aucun credential ne quitte le cluster.
  • ADR-0101 : S16 porte le set documentaire universel complet (dogfood d'une Story tooling).