- 21 docs/*.md: audits, design notes, deployment plans, checklists, memos - Coordination: ROLES, runbooks (DGX reboot, Lea live), patches, registre, syntheses, systemd, QG template - Handoffs: 6 Codex handoff documents + README + template
3.3 KiB
3.3 KiB
Plan de migration — persistance workflows (JSON → SQLAlchemy)
Date: 2026-06-09Auteur: Claude (proposition, validation Dom requise)Statut: PLANIFIÉ — post-POC, aucun refactor engagéRéf dette: DETTE-015 (docs/DETTE_TECHNIQUE.md)Priorité: P2 (fragilité réelle, contournée proprement pour le POC par symlink)
Constat
Trois stockages de workflows coexistent, sans source de vérité unique :
| Store | Emplacement | Utilisé par | État |
|---|---|---|---|
| Fichiers JSON | visual_workflow_builder/backend/data/workflows/*.json |
route API VWB /api/workflows/ (api/workflows.py:53, relatif au cwd) |
source réelle (42 fichiers) |
| DB SQLAlchemy | …/backend/instance/workflows.db, table workflows + Alembic |
composants SQLAlchemy (db.models) |
propre mais pas lue par la route (23 lignes) |
| JSON legacy | data/training/workflows/ |
dashboard web_dashboard (app.py:187-189) |
vide partout |
Problèmes
- Pas de source unique → divergences (les 42 JSON ≠ 23 lignes DB).
- Résolution par cwd → le bug P0-1 du 2026-06-09 (dev cwd=backend OK ; DGX cwd=racine = 0 workflows).
- Pas d'écriture atomique ni de validation de schéma côté JSON.
- Confusion : 3 emplacements, dont un legacy mort.
Cible
Unifier sur la DB SQLAlchemy déjà présente (infra à moitié en place : table + Alembic). La route API lit/écrit la DB ; le store fichier JSON et le legacy sont retirés. Bénéfices : source unique, transactions, intégrité, requêtes, fin de la dépendance au cwd.
Note : un store fichier n'est pas disqualifiant en soi ; c'est la coexistence non synchronisée + la dépendance au cwd qui posent problème. On choisit SQLAlchemy car l'infra existe déjà (vs fiabiliser le JSON, qui laisserait le double store).
Plan (TDD, post-POC, validation Dom entre étapes)
- Audit d'usage : recenser tous les appels à
WorkflowDatabase(lecture et écriture) — API, moteur d'exécution, agent, frontend VWB. Cartographier le contrat (méthodeslist/load/save/delete). - Repository SQLAlchemy : implémenter un
WorkflowRepositoryexposant le même contrat queWorkflowDatabase, adossé à la tableworkflows(réutiliserdb.models). Tests unitaires CRUD. - Script de migration : importer les 42 JSON → table
workflows(idempotent, backup DB avant). Vérifier parité (42 JSON ↔ N lignes, diff de contenu). - Bascule de la route derrière un flag (
RPA_WORKFLOWS_BACKEND=sqlalchemy|json, défautjson) → tests d'équivalence API (mêmes réponses qu'avant). - Bascule par défaut sur SQLAlchemy une fois la parité prouvée ; retrait du symlink (DETTE-015).
- Nettoyage : retirer le store legacy
data/training/workflows(dashboard) ou le rebrancher sur le repository ; supprimerWorkflowDatabasequand plus aucun appelant.
Préconditions / risques
- Ne pas engager avant la fin du POC (refactor de persistance = risque pour la démo).
- Touche frontend VWB + agent + moteur d'exécution → bascule progressive sous flag obligatoire.
- Le symlink (DETTE-015) reste le contournement stable jusqu'à la migration.
Effort estimé
~1,5–2,5 j en TDD (audit + repository + migration + tests d'équivalence + bascule).