## Project Memory

> Refonte complète du 2026-11-01 (branche `refonte-site-2026-11`, ancien site au tag `avant-refonte-2026-11`).
> Documentation complète dans `.memory/`.

- **Stack** : Laravel 13 autonome + Vite 8 + Tailwind CSS 4 + JavaScript sans framework
- **Fichiers source** : 70
- **Couverture** : 100% (70/70)

### Architecture
- Site de la société Rootsud (www.rootsud.fr), éditeur de logiciels pour l'immobilier : présentation de la société
  et de ses logiciels. Infoparcelle est le seul produit ; CaptImmo est arrêté et n'apparaît plus.
- **Aucun paquet `rootsud/*`** (ni core ni core-city) : pas de compte, de connexion, d'inscription, de paiement,
  d'API ni de Swagger. Les anciennes adresses sont redirigées par le module /redirection de l'administration.
- Registre des produits `config/products.php` + `App\Support\Products` : un deuxième logiciel s'ajoute par une
  entrée, un logo et des captures (navigation, menus, plan du site et JSON-LD suivent seuls).
- Identité de la société, coordonnées, hébergeur et réseaux : `config/rootsud.php` (valeurs vérifiées, sources en tête du fichier).
- Middlewares globaux : `ApplyRedirections` (avant le routage), `SecurityHeaders` (CSP `'self'`), `FrenchTypography`.
- Pages d'information sans session ; seule `/contact` pose un cookie (`rootsud_site_session`). Aucune mesure d'audience.
- 37 tests (`php artisan test`) : pages, cookies, redirections, contact, plan du site, en-têtes.

### Points d'attention
- **Ne jamais lancer `php artisan migrate`** : aucune migration, la connexion par défaut (`core`) vise le schéma core
  et ne sert qu'à lire les 3 tables de redirection (et leur compteur).
- Production : **site 7, projet 64** (dev : 22 et 69), PHP 8.3.36. Mode d'emploi complet et testé :
  `.insights/refonte-2026-11/MISE-EN-PRODUCTION.md` (`nettoyer-public.sh`, `preparer-env.sh`, `check-redirects.sh`).
- 🟥 **`rootsud.fr` n'a aucun MX** (mesuré le 2026-11-01) : `contact@rootsud.fr` ne reçoit rien. Adresse affichée et
  destinataire du formulaire = **`contact@infoparcelle.fr`** (décision du 2026-11-01, `ROOTSUD_CONTACT_EMAIL` /
  `CONTACT_TO`) ; un test refuse toute page qui afficherait `contact@rootsud.fr`.
- DMARC de `rootsud.fr` strict (`p=reject; adkim=s; aspf=s`) : l'expéditeur (`MAIL_FROM_ADDRESS`) doit être
  `@mail.rootsud.fr`, domaine Mailgun (région UE, `MAILGUN_ENDPOINT=api.eu.mailgun.net`).
- Vhost de production : la règle du bloc `*:443` (`RewriteRule ^(.*)$ https://www.rootsud.fr/$1`) produit
  `https://www.rootsud.fr//...` ; correction dans le mode d'emploi. HSTS du site aligné sur celui d'Apache.
- Redirections : `.insights/refonte-2026-11/creer-redirections.php --site=ID` (lancé en www-data, démarre l'administration
  pour son modèle `Redirection`, idempotent, ne touche que les redirections du site Rootsud), contrôle
  `.insights/refonte-2026-11/check-redirects.sh`.
- Laravel 13 : CSRF du groupe web = `PreventRequestForgery` (remplacé par `PreventRequestForgeryWithoutCookie`).
- Vite 8 : `app.js` exporte le résultat de `import.meta.glob`, sinon les images manquent au manifeste.
- Composer et npm en uid 1000 (`docker exec -u 1000:1000 -e HOME=/tmp/u1000`, npm avec le PATH de nvm) ;
  `storage/` et `bootstrap/cache/` en 777.
- Contenu : jamais de tiret cadratin, aucune affirmation non sourcée (liste des interdits dans `marketing.md`),
  aucun attribut `style` (CSP), aucune ressource tierce.
- Mise en production : sauvegarder puis vider les anciens dossiers de `public/` (non suivis par git), `npm run build`,
  `config:cache` / `route:cache` / `view:cache` désormais possibles.

### Fichiers memory détaillés
- [architecture.md](.memory/architecture.md)
- [controllers.md](.memory/controllers.md)
- [routes.md](.memory/routes.md)
- [views.md](.memory/views.md)
- [frontend.md](.memory/frontend.md)
- [marketing.md](.memory/marketing.md)
