Aller au contenu

PD-32 — Manifest de décomposition

Ce document est produit par l'orchestrateur Claude à l'étape 6a. Il découpe le plan d'implémentation en tâches assignées à des agents spécialisés.

Résumé

  • Story : PD-32
  • Nombre de tâches : 5
  • Agents mobilisés : agent-developer, agent-qa-unit-integration, agent-adversarial

Tâche 1 : agent-developer — Migration et Entity

  • Agent : agent-developer
  • LLM : claude
  • Code contracts : user-migration, user-entity-extension
  • Périmètre fichiers :
  • src/migrations/*-add-user-profile-fields.ts
  • src/modules/auth/entities/user.entity.ts
  • Livrable attendu :
  • Migration TypeORM ajoutant les colonnes name, avatar_url, preferences (nullable/défaut)
  • Extension de l'entité User avec les nouvelles colonnes et @Exclude() sur champs sensibles
  • Dépendances : aucune

Tâche 2 : agent-developer — DTOs

  • Agent : agent-developer
  • LLM : claude
  • Code contract : user-profile-dtos
  • Périmètre fichiers :
  • src/modules/user/dto/update-user-profile.dto.ts
  • src/modules/user/dto/user-profile-response.dto.ts
  • src/modules/user/dto/user-preferences.dto.ts
  • Livrable attendu :
  • UpdateUserProfileDto avec validation stricte (name, avatar_url, preferences uniquement)
  • UserProfileResponseDto (name, email, avatar_url, preferences)
  • UserPreferencesDto avec schéma strict (locale, timezone, security, notifications)
  • Dépendances : Tâche 1 (pour connaître les types des colonnes)

Tâche 3 : agent-developer — Service et Controller

  • Agent : agent-developer
  • LLM : claude
  • Code contracts : user-profile-service, user-profile-controller, user-module
  • Périmètre fichiers :
  • src/modules/user/services/user-profile.service.ts
  • src/modules/user/controllers/user-profile.controller.ts
  • src/modules/user/user.module.ts
  • src/modules/user/index.ts
  • src/app.module.ts (ajout import UserModule)
  • Livrable attendu :
  • UserProfileService avec getProfile() et updateProfile() via RLS
  • UserProfileController avec GET/PUT /user/profile, guards Auth + RateLimit
  • UserModule assemblant les composants
  • Import dans AppModule
  • Dépendances : Tâches 1 et 2

Tâche 4 : agent-qa-unit-integration — Tests

  • Agent : agent-qa-unit-integration
  • LLM : claude
  • Code contract : aucun (tests hors code contracts)
  • Périmètre fichiers :
  • src/modules/user/**/*.spec.ts
  • test/user-profile.e2e-spec.ts
  • Livrable attendu :
  • Tests unitaires des DTOs (validation, whitelist, forbidNonWhitelisted)
  • Tests unitaires du service (mocking repository)
  • Tests d'intégration des endpoints (TC-NOM-, TC-ERR-, TC-INV-*)
  • Couverture des scénarios d'accès croisé (TC-ERR-03/04)
  • Dépendances : Tâches 1, 2, 3

Tâche 5 : agent-adversarial — Review sécurité

  • Agent : agent-adversarial
  • LLM : claude
  • Code contract : aucun (review transverse)
  • Périmètre fichiers : tous les fichiers produits par Tâches 1-3
  • Livrable attendu :
  • Audit des forbidden patterns
  • Tentatives de bypass des validations
  • Vérification de l'absence de fuites de champs sensibles
  • Rapport de conformité sécurité
  • Dépendances : Tâches 1, 2, 3

Ordre d'exécution

Phase 1 (séquentielle) :
  Tâche 1 → Tâche 2 → Tâche 3

Phase 2 (parallélisable après Phase 1) :
  Tâche 4 ─┬─ (en parallèle)
  Tâche 5 ─┘

Notes de l'orchestrateur

  1. Séquentialité Phase 1 : Les tâches 1→2→3 sont séquentielles car chaque module dépend du précédent (migration → entity → DTOs → service → controller).

  2. Parallélisation Phase 2 : Les tests (Tâche 4) et la review sécurité (Tâche 5) peuvent s'exécuter en parallèle une fois le code produit.

  3. Point d'attention RLS : La Tâche 4 doit inclure les tests d'accès croisé avec le mécanisme décrit dans le plan (création U1/U2, contrôle état avant/après).

  4. ExceptionFilter : Vérifier que le format ERR-32-* est bien produit. Si le filter global ne suffit pas, créer UserProfileExceptionFilter dans la Tâche 3.

  5. Synthèse (6c) : Après les tâches, l'orchestrateur assemblera les livrables et vérifiera la cohérence globale avant de marquer l'étape 6 comme terminée.