# ORIGIN_ERROR_PREVENTION_GUIDE.md ## 📋 RÉSUMÉ EXÉCUTIF Ce document dĂ©finit le **systĂšme complet de prĂ©vention d'erreurs** pour le projet Veza. Il s'intĂšgre parfaitement Ă  la mĂ©thodologie ORIGIN_ existante et doit ĂȘtre appliquĂ© **AVANT** de commencer toute nouvelle tĂąche d'implĂ©mentation. Ce guide garantit qu'aucune erreur rĂ©currente ne sera introduite dans le codebase. **DerniĂšre mise Ă  jour** : 2026-03-04 **Statut** : ✅ Document de rĂ©fĂ©rence officiel **Version** : 2.0.0 --- ## 🎯 OBJECTIFS ### Objectif Principal Établir un systĂšme de prĂ©vention d'erreurs qui garantit qu'aucune erreur rĂ©currente ne sera introduite dans les futures implĂ©mentations. ### Objectifs Secondaires - RĂ©duire le temps de correction d'erreurs (< 5% du temps de dĂ©veloppement) - Maintenir la qualitĂ© du code (0 erreurs P0/P1) - Faciliter l'onboarding (checklists claires) - Standardiser les patterns de code (templates validĂ©s) --- ## 🔒 RÈGLES IMMUABLES 1. **Pre-Flight Check OBLIGATOIRE** avant toute nouvelle tĂąche 2. **Templates OBLIGATOIRES** pour crĂ©er de nouveaux fichiers 3. **Quality Gates BLOQUANTS** en CI/CD 4. **Aucune exception** sans approbation Lead Engineer 5. **Documentation OBLIGATOIRE** de tout nouveau pattern d'erreur --- ## 📖 TABLE DES MATIÈRES 1. [Pre-Flight Checklists](#1-pre-flight-checklists) 2. [Implementation Patterns](#2-implementation-patterns) 3. [Validation Gates](#3-validation-gates) 4. [Templates de Code](#4-templates-de-code) 5. [Workflow IntĂ©grĂ©](#5-workflow-intĂ©grĂ©) 6. [RĂ©fĂ©rences](#6-rĂ©fĂ©rences) --- ## 1. PRE-FLIGHT CHECKLISTS ### 1.1 Checklist Globale (Avant TOUTE TĂąche) **OBLIGATOIRE** : ExĂ©cuter cette checklist avant de commencer une nouvelle tĂąche. ```bash # ExĂ©cuter le script de pre-flight check ./scripts/pre-flight-check.sh ``` **Checklist manuelle** : - [ ] Aucune erreur P0/P1 existante (vĂ©rifier avec `./scripts/discover-errors.sh`) - [ ] Tests existants passent (`go test ./...` / `npm test`) - [ ] Linter ne produit aucune erreur (`golangci-lint run` / `npm run lint`) - [ ] Code est Ă  jour avec `main` (`git pull origin main`) - [ ] Branche créée pour la tĂąche (`git checkout -b feature/TXXXX-description`) --- ### 1.2 Checklist Backend Go **Avant de crĂ©er/modifier du code Go** : - [ ] VĂ©rifier qu'aucun import cycle ne sera créé ```bash # Visualiser le graphe de dĂ©pendances cd veza-backend-api go mod graph | grep -i "cycle" ``` - [ ] Valider la cohĂ©rence des types (string vs *string) - Consulter `ORIGIN_ERROR_PATTERNS.md` PAT-002 - DĂ©cider une stratĂ©gie cohĂ©rente avant de modifier un modĂšle - [ ] VĂ©rifier que tous les packages importĂ©s existent ```bash go build ./... # Doit rĂ©ussir sans erreur ``` - [ ] Tests unitaires du composant parent passent ```bash go test ./internal/services/... -v ``` - [ ] `go vet` ne produit aucun warning ```bash go vet ./... ``` - [ ] `golangci-lint` ne produit aucune erreur ```bash golangci-lint run ``` - [ ] VĂ©rifier la configuration JWT (issuer/audience) au dĂ©marrage ```go // Dans main.go ou init — valider dĂšs le boot if config.JWTIssuer == "" || config.JWTAudience == "" { log.Fatal("JWT_ISSUER and JWT_AUDIENCE must be set") } ``` - [ ] Propager le contexte de la requĂȘte (`c.Request.Context()`) — jamais `context.Background()` dans un handler ```bash # Linter rule (golangci-lint contextcheck) golangci-lint run --enable contextcheck ``` - [ ] Goroutines avec mĂ©canisme d'arrĂȘt (`context.Context` + `sync.WaitGroup`) - VĂ©rifier avec `goleak` dans les tests : `go.uber.org/goleak` - [ ] Pagination bornĂ©e — vĂ©rifier que `MaxPageSize` est appliquĂ© ```bash grep -rn "parsePagination\|MaxPageSize" internal/ ``` - [ ] RĂ©ponses d'erreur standardisĂ©es — aucun `gin.H{"error"` dans les handlers ```bash grep -rn 'gin.H{"error"' internal/handlers/ # Doit retourner 0 rĂ©sultat ``` **Patterns Ă  Ă©viter** : - ❌ Services qui importent handlers - ❌ Handlers qui importent services directement - ❌ Types partagĂ©s dans les packages qui les utilisent - ❌ MĂ©lange de `string` et `*string` pour champs optionnels - ❌ `context.Background()` dans les handlers HTTP - ❌ Goroutines sans mĂ©canisme d'arrĂȘt (`go func()` nu) - ❌ Pagination sans `MaxPageSize` - ❌ `gin.H{"error": ...}` au lieu de `RespondWithAppError` - ❌ JWT parsing sans validation issuer/audience **Patterns sĂ»rs** : - ✅ Interfaces dans `internal/types/` ou `internal/interfaces/` - ✅ Services dĂ©pendent uniquement d'interfaces - ✅ Handlers dĂ©pendent uniquement d'interfaces - ✅ Types cohĂ©rents (toujours `string` OU toujours `*string`) - ✅ `c.Request.Context()` propagĂ© dans toute la chaĂźne handler → service → repo - ✅ Goroutines avec `ctx.Done()` + `sync.WaitGroup` - ✅ `parsePagination()` centralisĂ© avec `MaxPageSize = 100` - ✅ `RespondWithAppError()` pour toutes les erreurs - ✅ JWT issuer/audience validĂ©s au parsing et vĂ©rifiĂ©s au boot --- ### 1.3 Checklist Frontend React/TypeScript **Avant de crĂ©er/modifier du code TypeScript/React** : - [ ] VĂ©rifier que `tsconfig.json` est correct ```bash cd apps/web npx tsc --noEmit --strict ``` - [ ] Linter ne produit aucune erreur sur fichiers modifiĂ©s ```bash npm run lint ``` - [ ] Tests existants passent avant modification ```bash npm test -- --run ``` - [ ] Types TypeScript sont stricts (pas de `any`) - VĂ©rifier avec `tsc --noEmit --strict` - Utiliser `unknown` si le type est vraiment inconnu - [ ] JSX syntax validĂ©e (Prettier) ```bash npm run format ``` - [ ] Pas de `console.log` en production - Utiliser un logger configurĂ© - ESLint devrait bloquer automatiquement **Patterns Ă  Ă©viter** : - ❌ Regex non terminĂ©es dans les tests - ❌ Tags JSX non fermĂ©s - ❌ Types `any` explicites - ❌ Variables non utilisĂ©es - ❌ `console.log` en production **Patterns sĂ»rs** : - ✅ Types explicites pour toutes les fonctions - ✅ Self-closing tags JSX (``) - ✅ Mocks configurĂ©s pour tous les tests - ✅ Logger au lieu de `console.log` --- ### 1.4 Checklist Services Rust **Avant de crĂ©er/modifier du code Rust** : - [ ] `cargo check` passe ```bash cd veza-chat-server # ou veza-stream-server cargo check ``` - [ ] `cargo clippy` ne produit aucun warning ```bash cargo clippy -- -D warnings ``` - [ ] SQLx queries validĂ©es avec schema ```bash cargo sqlx prepare --check ``` - [ ] Tests unitaires passent ```bash cargo test ``` **Patterns Ă  Ă©viter** : - ❌ `unwrap()` en production (utiliser `?` ou gestion d'erreur) - ❌ Types `i32` pour IDs (utiliser `Uuid`) - ❌ Queries SQL non validĂ©es **Patterns sĂ»rs** : - ✅ Gestion d'erreur avec `Result` - ✅ Types `Uuid` pour tous les IDs - ✅ SQLx queries validĂ©es avec `sqlx::query!` --- ## 2. IMPLEMENTATION PATTERNS ### 2.1 Backend Service Pattern **Pattern sĂ»r pour crĂ©er un nouveau service** : ```go // ✅ PATTERN SÛR - Évite import cycles // internal/services/user_service.go package services import ( "context" "veza-backend-api/internal/types" // Interfaces dans package neutre "veza-backend-api/internal/models" ) // UserService implĂ©mente l'interface dĂ©finie dans types type UserService struct { repo types.UserRepository // DĂ©pend de l'interface, pas de l'implĂ©mentation logger types.Logger } // NewUserService crĂ©e une nouvelle instance func NewUserService(repo types.UserRepository, logger types.Logger) *UserService { return &UserService{ repo: repo, logger: logger, } } // CreateUser crĂ©e un nouvel utilisateur func (s *UserService) CreateUser(ctx context.Context, req *CreateUserRequest) (*models.User, error) { // Validation if err := s.validateCreateRequest(req); err != nil { return nil, err } // Business logic user := &models.User{ Email: req.Email, Username: req.Username, } // Persistence if err := s.repo.Create(ctx, user); err != nil { return nil, fmt.Errorf("failed to create user: %w", err) } return user, nil } // validateCreateRequest valide la requĂȘte func (s *UserService) validateCreateRequest(req *CreateUserRequest) error { if req.Email == "" { return types.ErrValidation("email is required") } // ... autres validations return nil } ``` **Interfaces dans package sĂ©parĂ©** : ```go // internal/types/interfaces.go package types import ( "context" "veza-backend-api/internal/models" ) // UserRepository dĂ©finit les opĂ©rations de persistence type UserRepository interface { Create(ctx context.Context, user *models.User) error FindByID(ctx context.Context, id uuid.UUID) (*models.User, error) FindByEmail(ctx context.Context, email string) (*models.User, error) } // Logger dĂ©finit les opĂ©rations de logging type Logger interface { Info(msg string, fields ...interface{}) Error(msg string, fields ...interface{}) Debug(msg string, fields ...interface{}) } ``` --- ### 2.2 Backend Handler Pattern **Pattern sĂ»r pour crĂ©er un nouveau handler** : ```go // ✅ PATTERN SÛR - Évite import cycles // internal/handlers/user_handlers.go package handlers import ( "net/http" "github.com/gin-gonic/gin" "veza-backend-api/internal/types" // Interfaces seulement "veza-backend-api/internal/models" ) // UserHandlers gĂšre les requĂȘtes HTTP pour les utilisateurs type UserHandlers struct { userService types.UserService // Interface, pas l'implĂ©mentation } // NewUserHandlers crĂ©e une nouvelle instance func NewUserHandlers(userService types.UserService) *UserHandlers { return &UserHandlers{ userService: userService, } } // CreateUser gĂšre POST /api/v1/users func (h *UserHandlers) CreateUser(c *gin.Context) { var req CreateUserRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request"}) return } user, err := h.userService.CreateUser(c.Request.Context(), &req) if err != nil { handleError(c, err) return } c.JSON(http.StatusCreated, user) } // handleError gĂšre les erreurs de maniĂšre cohĂ©rente func handleError(c *gin.Context, err error) { // Logique de gestion d'erreur centralisĂ©e // ... } ``` --- ### 2.3 Frontend Component Pattern **Pattern sĂ»r pour crĂ©er un nouveau composant React** : ```typescript // ✅ PATTERN SÛR - Évite import hell // src/components/user/UserProfile.tsx import type { User } from '@/types'; // Types sĂ©parĂ©s import { useUserStore } from '@/stores/user'; // State management import { userService } from '@/services/user'; // API calls import { useUser } from '@/hooks/useUser'; // Custom hook interface UserProfileProps { userId: string; className?: string; } // Component NE fait PAS de logic business export const UserProfile: React.FC = ({ userId, className }) => { // Custom hook gĂšre la logique const { data: user, isLoading, error } = useUser(userId); // États de chargement et d'erreur if (isLoading) return ; if (error) return ; if (!user) return
User not found
; // Rendu simple return (

{user.name}

{user.email}

); }; ``` **Custom Hook Pattern** : ```typescript // ✅ PATTERN SÛR - Logique rĂ©utilisable // src/hooks/useUser.ts import { useQuery } from '@tanstack/react-query'; import { userService } from '@/services/user'; export function useUser(userId: string) { return useQuery({ queryKey: ['user', userId], queryFn: () => userService.getUser(userId), enabled: !!userId, }); } ``` --- ### 2.4 Frontend Service Pattern **Pattern sĂ»r pour crĂ©er un nouveau service API** : ```typescript // ✅ PATTERN SÛR - Types explicites // src/services/user.ts import type { User, CreateUserRequest } from '@/types'; import { apiClient } from './apiClient'; export const userService = { async getUser(userId: string): Promise { const response = await apiClient.get(`/api/v1/users/${userId}`); return response.data; }, async createUser(request: CreateUserRequest): Promise { const response = await apiClient.post('/api/v1/users', request); return response.data; }, async updateUser(userId: string, request: Partial): Promise { const response = await apiClient.put(`/api/v1/users/${userId}`, request); return response.data; }, }; ``` --- ### 2.5 Test Pattern (Frontend) **Pattern sĂ»r pour Ă©crire des tests** : ```typescript // ✅ PATTERN SÛR - Mocks configurĂ©s // src/components/user/UserProfile.test.tsx import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen } from '@testing-library/react'; import { UserProfile } from './UserProfile'; import { useUser } from '@/hooks/useUser'; // Mock le hook vi.mock('@/hooks/useUser'); describe('UserProfile', () => { beforeEach(() => { vi.clearAllMocks(); }); it('should render user profile', () => { // Arrange const mockUser = { id: '123', name: 'John Doe', email: 'john@example.com', }; vi.mocked(useUser).mockReturnValue({ data: mockUser, isLoading: false, error: null, } as any); // Act render(); // Assert expect(screen.getByText('John Doe')).toBeInTheDocument(); expect(screen.getByText('john@example.com')).toBeInTheDocument(); }); it('should show loading state', () => { // Arrange vi.mocked(useUser).mockReturnValue({ data: null, isLoading: true, error: null, } as any); // Act render(); // Assert expect(screen.getByRole('status')).toBeInTheDocument(); // Spinner }); }); ``` --- ### 2.6 Audit Prevention Patterns (2026-03-04) Les patterns suivants ont Ă©tĂ© identifiĂ©s lors de l'audit du 2026-03-04. Chaque pattern a un mĂ©canisme de prĂ©vention automatisĂ©. #### JWT Configuration Validation at Startup ```go // ✅ PATTERN SÛR - Valider la configuration JWT au dĂ©marrage // internal/auth/config.go func ValidateJWTConfig(cfg *config.Config) error { if cfg.JWTSecret == "" { return fmt.Errorf("JWT_SECRET is required") } if cfg.JWTIssuer == "" { return fmt.Errorf("JWT_ISSUER is required") } if cfg.JWTAudience == "" { return fmt.Errorf("JWT_AUDIENCE is required") } if cfg.JWTExpiration <= 0 { return fmt.Errorf("JWT_EXPIRATION must be positive") } return nil } // main.go — appeler au boot, fail-fast si invalide func main() { cfg := config.Load() if err := auth.ValidateJWTConfig(cfg); err != nil { log.Fatalf("JWT configuration error: %v", err) } } ``` #### Context Propagation Enforcement ```yaml # ✅ PATTERN SÛR - golangci-lint config (.golangci.yml) linters: enable: - contextcheck linters-settings: contextcheck: # DĂ©tecte context.Background() et context.TODO() dans les fonctions # qui reçoivent dĂ©jĂ  un context en paramĂštre ``` ```go // ✅ PATTERN SÛR - Toujours propager le contexte func (h *Handler) GetResource(c *gin.Context) { ctx := c.Request.Context() result, err := h.service.Get(ctx, id) // ctx propagĂ© } func (s *Service) Get(ctx context.Context, id string) (*Resource, error) { return s.repo.FindByID(ctx, id) // ctx propagĂ© } ``` #### Goroutine Lifecycle Management ```go // ✅ PATTERN SÛR - Goroutine avec lifecycle complet type BackgroundWorker struct { ctx context.Context cancel context.CancelFunc wg sync.WaitGroup } func NewBackgroundWorker(parentCtx context.Context) *BackgroundWorker { ctx, cancel := context.WithCancel(parentCtx) return &BackgroundWorker{ctx: ctx, cancel: cancel} } func (w *BackgroundWorker) Start(task func(ctx context.Context)) { w.wg.Add(1) go func() { defer w.wg.Done() task(w.ctx) }() } func (w *BackgroundWorker) Stop() { w.cancel() w.wg.Wait() } ``` #### Pagination Limit Enforcement ```go // ✅ PATTERN SÛR - Pagination centralisĂ©e avec limites // internal/api/pagination.go const ( DefaultPageSize = 20 MaxPageSize = 100 ) type PaginationParams struct { Limit int Offset int } func ParsePagination(c *gin.Context) PaginationParams { limit, _ := strconv.Atoi(c.DefaultQuery("limit", strconv.Itoa(DefaultPageSize))) offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0")) if limit <= 0 { limit = DefaultPageSize } if limit > MaxPageSize { limit = MaxPageSize } if offset < 0 { offset = 0 } return PaginationParams{Limit: limit, Offset: offset} } ``` #### Error Response Standardization ```go // ✅ PATTERN SÛR - RĂ©ponse d'erreur standardisĂ©e unique // internal/api/errors.go // RespondWithAppError gĂšre TOUTES les rĂ©ponses d'erreur func RespondWithAppError(c *gin.Context, err error) { var appErr *apperrors.AppError if errors.As(err, &appErr) { c.JSON(appErr.HTTPStatus(), appErr.ToResponse()) return } c.JSON(http.StatusInternalServerError, apperrors.InternalError().ToResponse()) } // INTERDIT : c.JSON(400, gin.H{"error": "..."}) // OBLIGATOIRE : RespondWithAppError(c, apperrors.NewValidationError("...", err)) ``` --- ## 3. VALIDATION GATES ### 3.1 Pre-Commit Gates (Husky) **Configuration automatique** : Les hooks Husky sont configurĂ©s dans `.husky/pre-commit`. **Gates activĂ©s** : - ✅ Formatage automatique (Prettier, gofmt) - ✅ Linter (ESLint, golangci-lint) - ✅ Tests unitaires rapides (`go test -short`, `npm test -- --run`) - ✅ Type checking (TypeScript) **Si un gate Ă©choue** : - ❌ Le commit est bloquĂ© - ✅ Corriger les erreurs - ✅ RĂ©essayer le commit --- ### 3.2 Pre-Merge Gates (GitHub Actions) **Configuration** : `.github/workflows/error-prevention.yml` **Gates activĂ©s** : 1. **Architecture Validation** - VĂ©rification des import cycles (Go) - VĂ©rification de la structure des packages 2. **Type Safety** - TypeScript strict mode - Go type checking 3. **Test Coverage** - Coverage ≄ 80% pour nouveau code - Tous les tests passent 4. **Linter** - Zero linter errors - Zero linter warnings (ou < 5) 5. **Build** - Backend compile sans erreur - Frontend build rĂ©ussit **Si un gate Ă©choue** : - ❌ La PR ne peut pas ĂȘtre mergĂ©e - ✅ Corriger les erreurs - ✅ Push les corrections - ✅ Les gates se relancent automatiquement --- ### 3.3 Pre-Deployment Gates **Gates activĂ©s** : - ✅ Tous les tests passent (unit, integration, E2E) - ✅ Coverage ≄ 80% (global) - ✅ Performance tests passent - ✅ Security scan pass - ✅ Smoke tests passent en staging --- ## 4. TEMPLATES DE CODE ### 4.1 Utilisation des Templates **Avant de crĂ©er un nouveau fichier** : 1. Consulter la liste des templates disponibles dans `/dev-environment/templates/` 2. Copier le template appropriĂ© 3. Remplacer les placeholders (`{{PLACEHOLDER}}`) 4. Adapter selon les besoins spĂ©cifiques **Exemple** : ```bash # CrĂ©er un nouveau service Go cp dev-environment/templates/backend-service.template.go \ veza-backend-api/internal/services/my_service.go # Éditer et remplacer les placeholders # {{SERVICE_NAME}} → MyService # {{PACKAGE_NAME}} → myservice ``` --- ### 4.2 Templates Disponibles **Backend Go** : - `backend-service.template.go` - Service avec interface - `backend-handler.template.go` - Handler HTTP - `backend-repository.template.go` - Repository pattern **Frontend React/TypeScript** : - `frontend-component.template.tsx` - Composant React - `frontend-hook.template.ts` - Custom hook - `frontend-service.template.ts` - Service API **Rust** : - `rust-service.template.rs` - Service Rust **Voir** : `/dev-environment/templates/` pour les templates complets. --- ## 5. WORKFLOW INTÉGRÉ ### 5.1 Workflow Complet ```mermaid graph TD A[Nouvelle TĂąche TXXXX] --> B[Pre-Flight Check] B -->|FAIL| C[Corriger Erreurs Existantes] C --> B B -->|PASS| D[Choisir Template] D --> E[ImplĂ©menter avec Pattern SĂ»r] E --> F[Tests Unitaires TDD] F --> G{Coverage ≄ 80%?} G -->|Non| F G -->|Oui| H[Lint Check] H --> I{Zero Errors?} I -->|Non| E I -->|Oui| J[Pre-Commit Hook] J --> K{Hook Pass?} K -->|Non| E K -->|Oui| L[Commit] L --> M[Push & Create PR] M --> N[CI/CD Gates] N --> O{All Gates Pass?} O -->|Non| E O -->|Oui| P[Code Review] P --> Q{Approved?} Q -->|Non| E Q -->|Oui| R[Merge] ``` --- ### 5.2 Checklist par Étape #### Étape 1: Pre-Flight Check - [ ] ExĂ©cuter `./scripts/pre-flight-check.sh` - [ ] VĂ©rifier qu'aucune erreur P0/P1 existe - [ ] Tests existants passent - [ ] Linter clean #### Étape 2: ImplĂ©mentation - [ ] Utiliser template appropriĂ© - [ ] Suivre pattern sĂ»r (voir section 2) - [ ] Éviter les anti-patterns (voir `ORIGIN_ERROR_PATTERNS.md`) - [ ] Tests en TDD (Red-Green-Refactor) #### Étape 3: Validation Locale - [ ] Tests unitaires passent - [ ] Coverage ≄ 80% - [ ] Linter zero errors - [ ] Type check passe - [ ] Build rĂ©ussit #### Étape 4: Commit - [ ] Pre-commit hook passe - [ ] Message de commit suit format: `TXXXX: type: description` - [ ] Commit atomique (une fonctionnalitĂ© par commit) #### Étape 5: PR & Review - [ ] CI/CD gates passent - [ ] Code review approuvĂ© (2 reviewers) - [ ] Documentation mise Ă  jour si nĂ©cessaire --- ## 6. RÉFÉRENCES ### Documents ORIGIN - **ORIGIN_ERROR_PATTERNS.md** - Catalogue des patterns d'erreurs - **ORIGIN_CODE_STANDARDS.md** - Standards de code - **ORIGIN_MASTER_ARCHITECTURE.md** - Architecture du projet - **ORIGIN_TESTING_STRATEGY.md** - StratĂ©gie de tests - **ORIGIN_IMPLEMENTATION_TASKS.md** - TĂąches d'implĂ©mentation ### Scripts Utilitaires - `./scripts/pre-flight-check.sh` - Validation prĂ©-tĂąche - `./scripts/discover-errors.sh` - DĂ©couverte d'erreurs - `./scripts/generate-error-summary.sh` - Rapport d'erreurs ### Outils - **Go** : `go vet`, `golangci-lint`, `go test` - **TypeScript** : `tsc`, `eslint`, `prettier` - **Rust** : `cargo check`, `cargo clippy`, `cargo test` --- ## ✅ CHECKLIST DE VALIDATION ### Avant de Commencer une TĂąche - [ ] Pre-flight check exĂ©cutĂ© et passĂ© - [ ] Template choisi et copiĂ© - [ ] Pattern sĂ»r identifiĂ© - [ ] Checklist spĂ©cifique (Backend/Frontend/Rust) complĂ©tĂ©e ### Pendant l'ImplĂ©mentation - [ ] Pattern sĂ»r suivi - [ ] Anti-patterns Ă©vitĂ©s - [ ] Tests Ă©crits en TDD - [ ] Linter activĂ© en temps rĂ©el ### Avant le Commit - [ ] Tests passent - [ ] Coverage ≄ 80% - [ ] Linter zero errors - [ ] Type check passe - [ ] Build rĂ©ussit ### Avant le Merge - [ ] CI/CD gates passent - [ ] Code review approuvĂ© - [ ] Documentation mise Ă  jour --- ## 🔄 MAINTENANCE ### Mise Ă  Jour du Guide - **FrĂ©quence** : Mensuelle ou aprĂšs dĂ©couverte d'un nouveau pattern - **Responsable** : Lead Engineers - **Processus** : 1. Identifier nouveau pattern d'erreur 2. Documenter dans `ORIGIN_ERROR_PATTERNS.md` 3. Mettre Ă  jour ce guide si nĂ©cessaire 4. Communiquer Ă  l'Ă©quipe ### AmĂ©lioration Continue - Analyser les erreurs qui passent malgrĂ© les gates - AmĂ©liorer les templates si nĂ©cessaire - Ajuster les checklists selon les retours --- **DerniĂšre mise Ă  jour** : 2026-03-04 **Version** : 2.0.0 **Statut** : ✅ **APPROUVÉ ET VERROUILLÉ** **"Prevention is better than cure."**