# ADR-001 — Stack technique - **Statut** : acceptée (R0, 15 juillet 2026) - **Contexte** : la V2 repart de zéro (code) mais pas de nulle part : la v1 a éprouvé une stack pendant 8 sprints (~400 tests). Atlas CMMS, notre référence fonctionnelle, est en Java Spring Boot + React MUI — cloner sa stack n'a aucun intérêt pédagogique ni pratique pour une équipe TypeScript. ## Décision | Couche | Choix | Justification | | --- | --- | --- | | Monorepo | **pnpm workspaces + Turborepo** | Un dépôt, plusieurs apps, caches de tâches ; éprouvé v1 | | API | **NestJS (Node 24) + Prisma + PostgreSQL 18** | Architecture modulaire enseignable ; Prisma = modèle lisible par les étudiants | | Extensions BDD | **pgvector** (RAG, R5) + **PostGIS** (carte, R1) | Un seul moteur de données pour tout | | Cache/files | **Redis** (BullMQ pour les jobs, R2) | Génération mensuelle du préventif | | Fichiers | **MinIO** derrière l'interface `FileStorage` | S3-compatible auto-hébergé ; l'interface interdit tout couplage (règle lint) | | Contrat | **Zod → OpenAPI → clients typés** (« règle d'or ») | Le front ne peut pas dériver du back ; CI bloquante | | Web | **React 19 + Vite + TanStack Query/Table + Tailwind v4** | Éprouvé v1 | | UI kit | **shadcn/ui** thématisé par `docs/02-design/tokens.css` | Composants possédés (copiés dans le repo), accessibles (Radix), thémables par tokens — le contraire du « DaisyUI brut » de la v1. Introduit en R0 (primitives) et enrichi par release | | Mobile | **Expo (Expo Go)** — R4 | Démo par QR sans build natif ; leçons v1 consignées | | IA | **FastAPI (Python 3.13, uv)** — R5 | Écosystème IA Python ; n'écrit jamais en base métier | | Déploiement | **Docker + Dokploy** (PaaS auto-hébergé) | Choix du référent ; portable (tout est compose) | ## Conséquences - Un seul langage principal (TypeScript) du mobile à l'API — onboarding étudiant simplifié. - La v1 sert de **référence de lecture** (décisions validées : machine à états OT, matrice de permissions en base, stock dérivé des mouvements, synchro à verrou optimiste) ; tout code V2 est réécrit et re-testé. - Versions épinglées ; toute montée de version = tâche dédiée (risque n°5 du registre).