From 25418f164f85f1a59e61dd6e5c8d874df08b6b67 Mon Sep 17 00:00:00 2001 From: ctan Date: Mon, 21 Sep 2026 12:15:16 +0200 Subject: [PATCH] docs(phase2): record the executed spike (measurements + first danger map) Measures: observation 64 KB (~16k tokens) for 7 combatants / 22 KB for a 2v2; 124 policy calls per battle, i.e. 124k calls per 1000-run sweep cell -> a per-turn LLM in a sweep is infeasible (D9 validated) and a compact view is mandatory. Danger map (default vs focus-fire monsters, 100 runs): the default policy understates danger (PC deaths 13%->24% and 0%->19%, TPK 0%->2%) and the win rate alone misleads (rises to 98% while deaths rise) -> D12/D13 validated. Notes the spike limits and the remaining P0.2-P0.5 items. --- docs/phase-2-llm-architecture.md | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/phase-2-llm-architecture.md b/docs/phase-2-llm-architecture.md index 45a20b7..a9d38f2 100644 --- a/docs/phase-2-llm-architecture.md +++ b/docs/phase-2-llm-architecture.md @@ -286,3 +286,50 @@ un coin : - Le détachement final devra fournir un **jeu de données d'exemple** et une documentation de configuration (chemins) pour que le dépôt code reste utilisable seul. + +## 16. Résultats du spike (exécuté) + +**Livré** : D1 (`LLMPolicy(Observation)` + `LegacyLLMPolicy`), `schema_version` +pinné, `objectives.py`, `run_encounter(..., collect_runs=True)`, une politique +de monstres **focus fire** (spike) et une **carte de danger** de démonstration. + +### Mesures (décision d'architecture) + +| Mesure | Valeur | +|---|---| +| Observation, 7 combattants | **64 Ko ≈ 16 000 tokens** (max 67 Ko) | +| Observation, duel 2v2 | 22 Ko ≈ 5 500 tokens | +| Appels de politique / combat | **124** (7 combattants), 12 (duel) | +| Appels par cellule de sweep (1 000 runs) | **124 000** | + +→ **Conclusion 1** : un LLM **par tour** en sweep est infaisable (~2 milliards de +tokens par cellule) — **D9 validé**, et la **vue compacte est obligatoire** +(cible ~2-4 k tokens, contre 16 k pour le snapshot brut). + +### Carte de danger (RUNS=100, seed=11) + +| Scénario | Monstres | Victoire PJ | Survivent | TPK | ≥1 mort | PV perdus | Rounds | +|---|---|---|---|---|---|---|---| +| warband 4v4 | défaut | 90,0 % | 87,0 % | 0,0 % | 13,0 % | 66,1 | 12,3 | +| warband 4v4 | focus fire | 98,0 % | 76,0 % | 0,0 % | **24,0 %** | 45,0 | 9,6 | +| liche 2v2 | défaut | 0,0 % | 100,0 % | 0,0 % | 0,0 % | 44,0 | 3,7 | +| liche 2v2 | focus fire | 0,0 % | 81,0 % | **2,0 %** | **19,0 %** | 44,0 | 5,8 | + +→ **Conclusion 2** : mesuré contre la politique par défaut, le danger est +**sous-estimé** (morts 13 %→24 % et 0 %→19 %, TPK 0 %→2 %) — **D12 validé**. +→ **Conclusion 3** : le **taux de victoire trompe** (il monte à 98 % pendant que +les morts augmentent) → les métriques de mort/PV/**queue** sont nécessaires — +**D13 validé**. + +**Limites du spike** : n=100 (bandes larges ±9 %), adversaire de niveau spike +(focus fire seulement, sans positionnement ni sorts), 2 scénarios. La +cartographie réelle (P4) demandera plus de runs, un adversaire complet +(`AdversarySpec`) et un balayage de `ScenarioSpec`. + +### État du plan + +- **P0.0 (D1)** ✅, **P0.1 (`schema_version`)** ✅, mesures ✅, `objectives.py` ✅, + `collect_runs` ✅. +- Restent : **P0.2** (vue compacte), **P0.3** (`candidates`), **P0.4** (`llm_policy` + sur le runner + `policy_factory`), **P0.5** (replay `call_seq`) → puis P1 (client + + politiques), P3 (optimiseur), P4 (cartographie complète), P5 (fournisseur + rapport).