# Méthode de travail TDD — libreDecision

## Principe fondamental

**Tu décris la règle métier. Claude traduit en test. Tu valides. Claude implémente.**

Jamais l'inverse. Le test est la source de vérité ; l'implémentation n'est que le moyen de le faire passer.

---

## Workflow par itération

```
1. Tu décris une règle en français naturel
   → "Si scope=personal, la décision est toujours individuelle"

2. Claude écrit le(s) test(s) — RED (le test échoue avant l'implémentation)
   → Tu valides que le test capture bien l'intention

3. Claude implémente le minimum pour que le test passe — GREEN
   → Rien de plus que ce que le test exige

4. Claude refactorise si nécessaire — REFACTOR
   → Sans casser les tests existants

5. Répétition avec la règle suivante
```

---

## Commandes de prompt

| Commande | Action |
|---|---|
| `+test` | Écrire le(s) test(s) sans implémenter |
| `+impl` | Implémenter pour faire passer les tests en attente |
| `+test+impl` | Test + implémentation d'un coup (règle simple) |
| `+règle` | Ajouter une règle au moteur existant |
| `+règle remplace` | Une nouvelle règle remplace une précédente (précise laquelle) |
| `+régression` | Vérifier qu'aucun test existant n'est cassé après un changement |
| `+résumé` | Afficher l'état des règles implémentées et en attente |

---

## Format d'une règle métier

Pour être efficace, une règle doit préciser :

```
ENTRÉES :  les variables concernées et leurs valeurs
RÉSULTAT : ce que le système doit retourner ou faire
EXCEPTIONS : cas qui brisent la règle générale (si aucune, dire "aucune")
```

**Exemple :**
```
ENTRÉES  : scope = "personal"
RÉSULTAT : decision_type = "individual", recommend_onchain = False
EXCEPTIONS : aucune — même si stakes = "critical", une décision personnelle reste individuelle
```

---

## Structure des tests dans ce projet

```
backend/app/tests/
  test_qualifier.py         ← moteur de qualification (tunnel Décider)
  test_middleware.py        ← rate limiter, CORS, headers
  test_threshold.py         ← formules WoT existantes
  test_votes.py             ← logique de vote
  test_decisions.py         ← service décisions
  ...
```

Chaque fichier de test correspond à un module ou un bloc fonctionnel.  
Les tests d'intégration (qui touchent la DB) sont marqués `@pytest.mark.integration`.

---

## Les 4 blocs algorithmiques

```
┌─────────────────────────────────────────────────────────┐
│  TUNNEL "DÉCIDER"                                        │
│                                                          │
│  1. QUALIFIER    → nature / enjeu / réversibilité        │
│        ↓                                                 │
│  2. ROUTEUR      → individual / collective / delegated   │
│        ↓                 ↓                              │
│  3. PROTOCOLE    → sélection formule WoT + paramètres   │
│        ↓                                                 │
│  4. GRAVURE      → recommandation on-chain (IPFS+remark) │
└─────────────────────────────────────────────────────────┘
```

Les blocs sont testés indépendamment puis en intégration.  
Un changement dans le bloc 1 ne doit jamais casser silencieusement le bloc 4.

---

## Invariants fondamentaux (ne jamais casser)

Ces règles doivent avoir un test dédié et rester vertes en permanence :

1. Une décision `individual` ne génère jamais de session de vote
2. Une décision `on_chain` implique toujours `recommend_onchain = True`
3. `recommend_onchain = True` requiert `reversibility = "impossible"` **ou** `stakes = "critical"`
4. Le qualificateur ne retourne jamais un type inconnu (enum strict)
5. Un protocole WoT sélectionné doit exister en base (slug valide)

---

## Règles de régression

- Après chaque implémentation : `pytest backend/app/tests/ -v --tb=short`
- Avant tout commit : zéro test rouge
- Si un test existant casse après un nouveau changement → **stop, analyser, ne pas contourner**
- `RATE_LIMIT_AUTH` en dev = 60/min minimum (pas de blocage en développement)

---

## Où sont les règles métier documentées

| Source | Contenu |
|---|---|
| `docs/dev/tdd-methode.md` | Cette méthode |
| `docs/dev/qualifier-rules.md` | Règles du moteur de qualification (créé au fil des itérations) |
| `backend/app/engine/qualifier.py` | Implémentation du qualificateur |
| `backend/app/tests/test_qualifier.py` | Tests — source de vérité exécutable |

---

## À propos de la mémoire de contexte

Entre les sessions, Claude peut perdre le contexte des règles en cours.  
Pour reprendre efficacement :

```
"Résume les règles du qualificateur implémentées jusqu'ici"
→ Claude lit test_qualifier.py et qualifier.py et synthétise
```

Les tests sont leur propre documentation. Ne pas dupliquer les règles en commentaires.
