diff --git a/docs/phase-2-llm-architecture.md b/docs/phase-2-llm-architecture.md index a9d38f2..9c198dd 100644 --- a/docs/phase-2-llm-architecture.md +++ b/docs/phase-2-llm-architecture.md @@ -326,10 +326,41 @@ les morts augmentent) → les métriques de mort/PV/**queue** sont nécessaires cartographie réelle (P4) demandera plus de runs, un adversaire complet (`AdversarySpec`) et un balayage de `ScenarioSpec`. +### Vue compacte (P0.2, mesures réelles — commit 9da9537) + +`llm_view.py` : `ObservationView` (structuré, déterministe) + `build_view()` ++ `render()` vers texte pour prompt. Règles : **grilles sparsifiées** (terrain +et élévation = cellules non défaut ; `threatened`/`ranged_threatened` = liste +de cellules, omis si vide), **clés décisionnelles seules** par combattant et +par paire, `schema_version` inclus, ordre déterministe trié. Mesure sur +l'affrontement représentatif (oni/misty/nairda vs lich/thrune_agent/orc/goblin, +seed 1) : + +| Vue | Octets | Tokens | % du raw | +|---|---|---|---| +| brute `to_dict()` | 64 204 | ~16 051 | 100 % | +| **compacte `render()`** | **15 691** | **~3 922** | **24,4 %** | + +Ratio 24,4 % = **cible ~2-4k tokens atteinte**. Grilles : terrain 78 cellules +sparses, élévation 0, menacées 15, menacées à distance 116 (au lieu de matrices +pleines). Contrats de test : réduction < 25 % et < 16 000 octets, grilles +sparses, clés supprimées (condition_definitions, etc. — voir le test), ids/ +render déterministes. Test : `tests/test_phase2_view.py`. + +### Candidats d'action (P0.3 — commit 8b50430) + +`candidates.py` : `candidates(observation) -> tuple[Action, ...]` — actions +**plausibles** dérivées des `pairs` et des données par combattant (attack/ +full_attack si `weapon_for`, charge si `can_charge`, pas de 5 ft + attaque si +`can_step5_to_attack`, mouvement vers une cible, sort connu avec slot, canal/ +hex/deed si ressource présente, défense totale, ready/delay) ; `swift`/`free`/ +`full_round` exclus ; liste bornée et triée. **Pas de second moteur de +légalité** : le moteur reste l'arbitre. Test : `tests/test_phase2_candidates.py`. + ### É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). + `collect_runs` ✅, **P0.2** (vue compacte) ✅, **P0.3** (`candidates`) ✅. +- Restent : **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).