# M4 — Plan maître worktrees (back, Matthieu)

> **Rôle de ce fichier** : vue d'ensemble que la *conversation maître* tient à jour.
> Chaque worktree = une conversation Claude isolée + une branche + une PR vers `develop`.
> Les prompts à coller sont dans `WT*.md`.

## Principe

- 1 worktree = 1 branche partant de `origin/develop` (à jour des deps).
- 1 ticket = 1 PR atomique vers **`develop`** (jamais `main`).
- Commit autorisé sur la branche du worktree (ces prompts SONT la demande explicite) ;
  `git commit --no-verify` OK si `make test` est déjà vert (le hook relance toute la suite).
- **Chaque worktree ouvre SA PR** vers `develop` en fin de tâche (cf. bloc PR ci-dessous).

## Bloc PR standard (repris dans chaque prompt)

```bash
git push -u origin <branche>
tea pr create --base develop --head <branche> \
  --title "<type>(<scope>) : <titre>" \
  --description "Résumé + lien ticket Lesstime ERP-XXX"
```
Puis **labelliser la PR via l'API Gitea** (tea ne pose pas les labels en CLI — `gitea.malio.fr`).
Cible **`develop`**, jamais `main`. **Aucune mention de Claude/IA** dans titre ou description.

## Vagues & ordre de merge

```
VAGUE 0  (en parallèle, dès maintenant)
  WT1  1.2 upload Shared      base: origin/develop            ──┐
  WT2  1.1 RBAC + sidebar     base: origin/develop (≥ERP-150) ──┤ indépendants
                                                                 │
VAGUE 1  (critique, séquentiel)                                  │
  WT3  1.3 migration + 1.5 entités/resource/provider + i18n audit
       base: origin/develop APRÈS merge WT1  (FK uploaded_document)
       ⭐ livre le CONTRAT JSON liste+détail → débloque le front (Tristan)

VAGUE 2  (fan-out, tous en parallèle dès WT3 mergé)
  WT4  1.6 processor          base: develop ≥ WT3
  WT5  1.4 qualimat endpoint  base: develop ≥ WT2 (perm) + ERP-39   (indépendant de WT3)
  WT6  1.7 adresses           base: develop ≥ WT3
  WT7  1.8 contacts           base: develop ≥ WT3
  WT8  1.9 prix               base: develop ≥ WT3
  WT9  1.10 export XLSX        base: develop ≥ WT3

VAGUE 3  (final)
  WT10 1.11 tests + fixtures + contrat  base: develop ≥ TOUT
```

**Parallélisme réel** : 2 worktrees en V0, puis 1 goulot (WT3), puis **jusqu'à 6 en V2**, puis 1 (WT10).

## Règle anti-conflit worktree (IMPORTANT)

Pour que WT4→WT9 tournent en parallèle sans conflit de merge :

| Fichier partagé | Qui le touche | Les autres |
|---|---|---|
| `CarrierFixtures` | **WT10 uniquement** | interdit (WT3 met un fixture minimal, WT6-9 n'y touchent pas) |
| Entité `Carrier` (ApiResource) | **WT3** crée, **WT4** ajoute le Processor | WT6-9 créent des **resources/processors dédiés** par sous-entité, ne modifient pas `Carrier` |
| `ColumnCommentsCatalog` | WT1 (`uploaded_document`), WT3 (`carrier*`) | personne d'autre |
| `fr.json` (clés audit) | **WT3** (clés `audit.entity.transport_*`) | personne d'autre côté back |
| `migrations/` | WT1 puis WT3 (ordre timestamp) | aucune autre migration |

## Mode retenu : STACK séquentiel, SANS worktree (repo principal)

Matthieu empile les MR, un ticket à la fois, **directement dans `/home/matthieu/dev_malio/Starseed`** (pas de worktree).
- **Ignorer les blocs `git worktree add` des `WT*.md`** → remplacés par une branche normale :
  ```bash
  git fetch origin
  git checkout -b feat/erp-XXX-... origin/<branche-précédente>
  ```
- **WT1 hors pile** (déjà mergé). Pile M4 — chaque branche basée sur la précédente :
  `WT2 → WT3 → WT4 → WT5 → WT6 → WT7 → WT8 → WT9 → WT10`
- PR de chaque maillon : `--base <branche-précédente>` (bas de pile WT2 = `develop`). Au merge, les MR du dessus se recible auto.
- Docker tourne sur le repo principal → `make test`/`php-cs-fixer` OK sans rebind (le piège worktree-vs-mount ne s'applique plus).
- Worktrees créés pour WT1/WT2 à nettoyer : `git worktree remove ../sb-erp154-upload ../sb-erp153-rbac`.
- Garder les MR basses propres ; merger dans l'ordre.

## Suivi (tenu par la conv maître)

| WT | Ticket | ERP | État | PR | Notes |
|----|--------|-----|------|----|----|
| WT1 | 1.2 upload | 154 | ✅ MERGÉ | #108 | migration `Version20260615130000` |
| WT2 | 1.1 RBAC | 153 | ✅ PR ouverte | #111 | bas de pile (cible develop) |
| WT3 | 1.3+1.5 | 155+157 | ▶️ À LANCER | — | stack sur `feat/erp-153-rbac` ; gate contrat front |
| WT4 | 1.6 proc | 158 | ⛔ bloqué par WT3 | — | |
| WT5 | 1.4 qualimat | 156 | ⛔ bloqué par WT2+ERP-39 | — | |
| WT6 | 1.7 adresses | 159 | ⛔ bloqué par WT3 | — | |
| WT7 | 1.8 contacts | 160 | ⛔ bloqué par WT3 | — | |
| WT8 | 1.9 prix | 161 | ⛔ bloqué par WT3 | — | |
| WT9 | 1.10 export | 162 | ⛔ bloqué par WT3 | — | |
| WT10 | 1.11 tests | 163 | ⛔ bloqué par tout | — | |

## Cadre commun à tous les prompts (rappels projet)

- Carrier vit dans `src/Module/Transport/` (créé par ERP-150). **Miroir = `src/Module/Commercial/`** (Supplier).
- Tests sous `tests/Module/Transport/Api/` (miroir `tests/Module/Commercial/Api/`).
- `declare(strict_types=1);` partout ; commentaires **FR**, code EN.
- `make test` + `make php-cs-fixer-allow-risky` avant de dire « fini ».
- Ne jamais mentionner Claude/IA dans commit/PR.
