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 -ua 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_configpartagés). - Brancher depuis
origin/mainaprès fetch (lemainlocal 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).