docs(phase2): record the compact view measurements (P0.2) and candidates (P0.3)

Compact render is 15,691 bytes (~3.9k tokens) = 24.4% of the raw 64,204-byte
to_dict() snapshot on the representative 7-combatant encounter, hitting the
~2-4k token target; grids are sparse and determinism is pinned in tests.
candidates() derives plausible actions from the pairs with no second legality
engine (swift/free/full_round excluded).
This commit is contained in:
2026-09-21 14:36:24 +02:00
parent 8b5043072a
commit ac7fe20054
+35 -4
View File
@@ -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 cartographie réelle (P4) demandera plus de runs, un adversaire complet
(`AdversarySpec`) et un balayage de `ScenarioSpec`. (`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 ### État du plan
- **P0.0 (D1)** ✅, **P0.1 (`schema_version`)** ✅, mesures ✅, `objectives.py` ✅, - **P0.0 (D1)** ✅, **P0.1 (`schema_version`)** ✅, mesures ✅, `objectives.py` ✅,
`collect_runs` ✅. `collect_runs` ✅, **P0.2** (vue compacte) ✅, **P0.3** (`candidates`) ✅.
- Restent : **P0.2** (vue compacte), **P0.3** (`candidates`), **P0.4** (`llm_policy` - Restent : **P0.4** (`llm_policy` sur le runner + `policy_factory`), **P0.5**
sur le runner + `policy_factory`), **P0.5** (replay `call_seq`) → puis P1 (client (replay `call_seq`) → puis P1 (client + politiques), P3 (optimiseur), P4
+ politiques), P3 (optimiseur), P4 (cartographie complète), P5 (fournisseur + rapport). (cartographie complète), P5 (fournisseur + rapport).