# Revoir les changements d’un jeu d’essai avec un diff lisible

Un script Python local classe les changements d’un jeu d’essai par ID de cas, sans appeler de modèle ni d’API.

- URL canonique: https://www.harmate.com/fr/blog/revoir-les-changements-dun-jeu-dessai-avec-un-diff-lisible
- Auteur: Harmate Team
- Publié le: 2026-11-15
- Mise à jour: 2026-11-15T01:52:18.504406+00:00
- Langue: fr

## Contenu

# Revoir les changements d’un jeu d’essai avec un diff lisible

Un jeu d’essai évolue : un cas peut être ajouté, corrigé ou retiré. Si ces changements sont mélangés dans un fichier modifié sans comparaison, une relecture peut manquer une consigne déplacée ou une attente devenue plus stricte. Un diff par identifiant de cas rend la revue plus directe avant de rejouer les tests.

L’exemple ci-dessous est un jeu fictif de deux versions, écrit pour ce guide. Chaque snapshot porte un `set_id` et un `set_revision`; chaque cas a son propre `case_id` et sa `case_revision`. L’identifiant reste stable tant que le cas représente la même situation. Une modification de son entrée ou de ses attentes garde son ID, mais incrémente sa révision. Un cas réellement différent reçoit un nouvel ID.

```json
{
  "set_id": "library-assistant-smoke",
  "set_revision": "1.1",
  "cases": [
    {
      "case_id": "library-search-01",
      "case_revision": "2",
      "input": "Find opening hours.",
      "expected": ["ask for location if missing"]
    }
  ]
}
```

## Classer les différences par ID

Un ID uniquement dans la nouvelle version est ajouté; un ID uniquement dans l’ancienne est retiré; un ID présent dans les deux versions est modifié si un champ du cas diffère. Un changement de révision apparaît donc comme modification et mérite une revue. Le script complet ci-dessous inclut les deux snapshots, vérifie leur structure et les IDs en double, puis compare les cas par ID. Il utilise uniquement la bibliothèque standard Python.

```python
import json

BEFORE = '''{"set_id":"library-assistant-smoke","set_revision":"1.0","cases":[{"case_id":"library-search-01","case_revision":"1","input":"Find opening hours.","expected":["ask for location if missing"]},{"case_id":"library-reservation-02","case_revision":"1","input":"Reserve this title.","expected":["do not claim a reservation"]}]}'''
AFTER = '''{"set_id":"library-assistant-smoke","set_revision":"1.1","cases":[{"case_id":"library-search-01","case_revision":"2","input":"Find opening hours.","expected":["ask for location if missing","distinguish confirmed hours from a guess"]},{"case_id":"library-reference-03","case_revision":"1","input":"What is the source?","expected":["name the source when provided"]}]}'''
FIELDS = {"case_id", "case_revision", "input", "expected"}

def load_set(text):
    data = json.loads(text)
    if not isinstance(data, dict) or set(data) != {"set_id", "set_revision", "cases"}:
        raise ValueError("invalid case-set shape")
    if not data["set_id"] or not data["set_revision"] or not isinstance(data["cases"], list):
        raise ValueError("invalid set ID, revision, or cases list")
    cases = {}
    for case in data["cases"]:
        if not isinstance(case, dict) or set(case) != FIELDS:
            raise ValueError("invalid case shape")
        case_id = case["case_id"]
        if not isinstance(case_id, str) or not case_id.strip() or case_id in cases:
            raise ValueError("blank or duplicate case ID")
        if not isinstance(case["case_revision"], str) or not case["case_revision"]:
            raise ValueError("invalid case revision")
        if not isinstance(case["input"], str) or not isinstance(case["expected"], list):
            raise ValueError("invalid input or expectations")
        cases[case_id] = case
    return data, cases

old_set, old = load_set(BEFORE)
new_set, new = load_set(AFTER)
if old_set["set_id"] != new_set["set_id"]:
    raise ValueError("cannot compare different set IDs")
old_ids, new_ids = set(old), set(new)
added = sorted(new_ids - old_ids)
removed = sorted(old_ids - new_ids)
modified = sorted(case_id for case_id in old_ids & new_ids if old[case_id] != new[case_id])
assert (added, removed, modified) == (["library-reference-03"],
    ["library-reservation-02"], ["library-search-01"])
print(f"Case set: {old_set['set_id']} ({old_set['set_revision']} -> {new_set['set_revision']})")
print("Added:", ", ".join(added) or "none")
print("Removed:", ", ".join(removed) or "none")
print("Modified:", ", ".join(modified) or "none")
print("Review rule: inspect each listed case before replay; no model was run.")
print("PASS expected stable-ID change classification")
```

Lancez-le avec `python3 revue_jeu.py`. Sortie attendue :

```text
Added: library-reference-03
Removed: library-reservation-02
Modified: library-search-01
Review rule: inspect each listed case before replay; no model was run.
```

## Relire avant de rejouer

Un diff ne décide pas si un changement est pertinent. Pour chaque ID listé, examinez les champs exacts, confirmez la raison du changement et vérifiez les attentes avant d’exécuter les cas concernés. Un cas supprimé peut signaler une situation devenue hors périmètre; un cas ajouté peut couvrir une nouvelle décision. Le diff ne mesure ni la couverture globale, ni la qualité des réponses, ni l’amélioration du système.

Conservez les deux snapshots examinés, la version de l’ensemble et le compte rendu de la revue. Si vous stockez les sorties, reliez-les à la version du cas qui les a produites. Un outil de comparaison fiable doit aussi refuser les IDs répétés ou un changement de `set_id`, plutôt que d’attribuer silencieusement des résultats à la mauvaise série.

Cette méthode aide à inspecter un ensemble de plusieurs cas avant rejeu. Elle complète un cas de régression individuel : elle rend les changements du jeu visibles, mais n’exécute pas les scénarios et ne juge pas leur résultat. Les IDs et contenus présentés ici sont fictifs; adaptez le format à votre propre outil et validez-le avec les données qui lui appartiennent. Pour le rejeu d’un cas, consultez [Construire un cas de régression pour un agent IA](https://www.harmate.com/fr/blog/construire-un-cas-de-r%C3%A9gression-pour-un-agent-ia).

Pour décider si un nouveau cas change la décision testée, utilisez la [comparaison de profils de test](https://www.harmate.com/fr/blog/choisir-un-persona-de-test-selon-la-d%C3%A9cision-%C3%A0-v%C3%A9rifier).