BA Review — migration
INFRA · CLI Scripts NON-COMPLIANT
lejecos c3b33ef 2026-03-19 BA Agent lejecos/specs/migration/spec.md
4
Critères manquants
3
Partiels
0
Conformes
7
Total critères
4
Déviations HIGH
Statut : NON-COMPLIANT
4 critères manquants · 4 déviations HIGH severity · 0 critères entièrement satisfaits.
Motif : steps 1 (crawl), 3 (import Strapi), 4 (médias), 6 (vérification) non implémentés — pipeline de migration non fonctionnel.
MET
PARTIAL
MISSING
ID Critère Statut Évidence / Localisation
AC-001 articles.json contient ≥ 30 500 entrées après le crawl MISSING src/steps/1-crawl.ts — Crawler non implémenté. Retourne un tableau vide écrit dans articles.json. TODO lines 22-27. url-map.csv absent.
AC-002 100% des articles ont title, content, published_at, legacy_url PARTIAL src/shared/types.tsCrawledArticleSchema (Zod) enforce ces champs (lines 5-16). Mais crawler non implémenté → 0 articles produits à l'exécution.
AC-003 3-import-strapi.ts est idempotent (2 exécutions → même résultat) MISSING src/steps/3-import-strapi.ts — Boucle présente (lines 47-65) mais 0 appel API Strapi. Tous les articles loggés status: "error", error: "Not implemented yet". Aucune vérification d'existence par legacy_url. Idempotence non vérifiable.
AC-004 redirects.json contient une entrée pour chaque URL crawlée PARTIAL src/steps/5-generate-redirects.ts — Logic structurée (normalizeLegacyPath, buildNewPath, déduplification). Tests passent. Dépend du step 3 non implémenté. Format dévie du spec (array vs flat object). /node/NNNNN absent.
AC-005 Rapport de vérification ≥ 99% de succès sur tous les checks MISSING src/steps/6-verify.ts — 8 checks tous hardcodés à false (lines 42-51). Aucune requête Strapi, aucun sampling HTTP. Erreur explicite : "Verification not fully implemented".
AC-006 0 doublon de slug dans Strapi après l'import PARTIAL src/shared/slugify.tsslugifyUnique génère slugs uniques avec suffixe -2, -3. Testé (slugify.test.ts lines 26-52). Mais step 3 non implémenté → slugs n'atteignent jamais Strapi.
AC-007 Images accessibles via Strapi/S3 après import médias MISSING src/steps/4-import-media.ts — Scaffold TODO uniquement (lines 29-37). Dépendance sharp déclarée mais non utilisée. Aucun téléchargement, MD5, conversion WebP, ni upload implémentés.
7 critères MET: 0  ·  PARTIAL: 3  ·  MISSING: 4 Couverture réelle : 0%
Sévérité Description Référence spec
HIGH Step 1 — Crawler non implémenté. Crawlee/Playwright : stub TODO. Tableau vide écrit dans articles.json. url-map.csv absent. Step 1 — méthode, rate limiting, checkpoint, outputs
HIGH Step 3 — Import Strapi non implémenté. Tous articles : status: "error". Aucun appel API, aucun check idempotence, aucun retry. Step 3 — algorithme, idempotence, gestion erreurs
HIGH Step 4 — Import médias non implémenté. TODO complet. Aucun download, MD5, conversion WebP, ni upload Strapi. Step 4 — algorithme, contraintes images
HIGH Step 6 — Vérification non implémentée. 8 checks hardcodés à false. Aucune requête Strapi ni sampling HTTP 301. Step 6 — checks list, verification-report.json
MED Noms de scripts npm incorrects. Spec : step:1:crawl, step:2:extract… Implémentation : crawl, extract, import-strapi Exécution — npm run step:X
MED Format redirects.json déviant. Spec : objet plat {"/old": "/new"}. Implémentation : array [{source, destination, permanent}]. Step 5 — Output redirects.json format
MED Format WMaker /node/NNNNN non géré. Step 5 ne traite pas la résolution des anciennes URLs WMaker par ID. Step 5 — Règles de mapping : Format WMaker
LOW country_codes hardcodé à ["sn"]. Spec requiert détection par mots-clés dans titre/catégorie. Step 2 — country_codes depuis contenu
LOW Structure src/shared/ au lieu de src/lib/. Fichiers strapi-client.ts, url-normalizer.ts, html-cleaner.ts absents. Structure — src/lib/ directory
9 déviations HIGH: 4  ·  MEDIUM: 3  ·  LOW: 2
Base solide — scaffolding et logique partielle (9 éléments)
Scaffolding projet — TypeScript, tsx, vitest, eslint, Node ≥20
Dépendances déclarées — crawlee, playwright, sharp, slugify, undici, winston, zod
Step 2 — Extract completcleanHtml, extractExcerpt, isArchived, computeArchiveDate, mapCategory
Step 5 — Logique redirectionsnormalizeLegacyPath, buildNewPath, déduplication
slugifyUnique — locale FR, déduplication -2/-3, testé
Config Zod validée — STRAPI_URL, TOKEN, CRAWL_MAX_RPS=2, BATCH_SIZE=50, DELAY=500ms
Types Zod complets — CrawledArticle, ExtractedArticle, ImportLogEntry, RedirectEntry, VerificationReport
Seed data — 6 catégories + 4 pays définis dans types.ts
Logger Winston — console colorée + fichier par step (data/logs/)
Priorités de correction (pour l'équipe Dev)
Priorité 1 — Steps bloquants (HIGH) : Implémenter step 1 (Crawlee + extraction HTML), step 3 (POST Strapi + idempotence + retry), step 4 (download + MD5 + WebP + upload), step 6 (requêtes Strapi + sampling 301).

Priorité 2 — Conformité format (MEDIUM) : Aligner noms npm scripts sur spec (step:1:crawl etc.), corriger format redirects.json (objet plat), ajouter résolution /node/NNNNN WMaker.

Priorité 3 — Complétude (LOW) : Implémenter détection country_codes depuis contenu, ajouter src/lib/strapi-client.ts, url-normalizer.ts, html-cleaner.ts.