From 657f48474c3f339090775298a92848b991df110c Mon Sep 17 00:00:00 2001 From: ctan Date: Sat, 19 Sep 2026 17:21:54 +0200 Subject: [PATCH] docs(rules): conformance journal round 7 - spell registry closed (108/108) and subsystem fixes Records the 12 fixes of the final pass (engine Lows, LOS area templates, runner/metrics/observation/CLI): dying creatures occupy their square, blinded cannot charge/run/withdraw, cone/line aim and caster footprint, square_size_ft validation, channel-heal no longer counted as damage dealt, summon aggregation no longer KeyErrors, non-attack damage counted, README examples refreshed, ACTION_RESULT_REASONS completed, zone-letter validation. The remaining 35 spells were field-verified against the KB with zero outcome divergences, closing the spell coverage gap. --- docs/conformance-srd.md | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/docs/conformance-srd.md b/docs/conformance-srd.md index 19cec79..bb93c77 100644 --- a/docs/conformance-srd.md +++ b/docs/conformance-srd.md @@ -26,7 +26,7 @@ résiduel**. | Contrôle | Résultat | |---|---| -| `uv run pytest -q` | 1596 tests verts | +| `uv run pytest -q` | 1634 tests verts | | `uv run ruff check src tests` (`select=ALL`) | conforme | | `uv run basedpyright src` (strict) | 0 erreur | | Transcript doré depuis la passe 1 | inchangé | @@ -126,6 +126,25 @@ résiduel**. | `5e478bf` | Charge et course appliquent la **règle des coins** | | `9086038` | Charge : terrain difficile testé sur **tout le footprint** (« on ne se déplace qu'à la vitesse du terrain le plus difficile occupé ») | +### Correctifs de la passe 6 (suite) et de la passe 7 + +| Commit | Objet | +|---|---| +| `792cec1` | Les créatures **mourantes mais vivantes** occupent leur case (couvert mou + gabarits de zone) | +| `778d6a8` | Un **aveugle** ne peut ni charger, ni courir, ni retraiter | +| `2e468ba` | Cône/ligne pointé : plus d'exigence de ligne d'effet vers le point visé (bursts seulement) | +| `1e2de7f` | Cône/ligne : **tout le footprint** du lanceur est exclu de son propre gabarit | +| `24e208e` | `square_size_ft ≠ 5` rejeté au chargement (géométrie figée à 5 ft) | +| `2e2873f` | **Canal de soin** : le soin n'est plus compté comme `damage_dealt` | +| `7fefce4` | `run_encounter` ne **plante plus** quand une invocation apparaît (accumulateurs à la demande) | +| `0ad627c` | Saignement, dégâts récurrents et soin-sur-morts-vivants comptés dans `damage_taken` | +| `9459ade` | `downgraded:immediate_swift` ajouté au vocabulaire `ACTION_RESULT_REASONS` | +| `2ee19d3` | Formulation « snapshot figé » corrigée (les dicts internes sont des copies mutables) | +| `ba5eb4c` | Déploiement : deux camps sur la **même lettre de zone** rejetés | +| `9a087a4` | Exemples du README **rafraîchis** contre le moteur réel (Quick start 96,2 % ; exemple vérifié 33,0 %) | + +> **Registre des sorts clos** : les 35 derniers sorts ont été vérifiés champ par champ contre le KB — **0 divergence** (niveaux, sauvegardes, RM, portées, zones, formules conformes). Seuls 2 sorts sont absents du KB (`create_alcool`, `hidden_diplomacy`) et 1 nit de description subsiste (`detect_poison` mentionne « acid »). + ### Passe 1 — sorts de buff, mouvement/grille, morts-vivants, armes naturelles | # | Constat | Sév. | Correctif (commit) | @@ -275,9 +294,11 @@ ne pas être confondues avec des bogues. | **Effets de sorts différés (passe 4)** | `mirror_image` (1d4+1 images, ~67-78 % d'échec au lieu du flou 20 %), `spiritual_weapon` (attaque flottante persistante), buffs utilitaires sans mécanique cible (`guidance`, `resistance`, `virtue`, `stabilize`, `owls_wisdom`, `saving_finale`), `acid_arrow` (cap 7 rounds), `ice_slick` (+1/niveau), `charm_person` (condition *charmed*), `bleed` (seuil ≤ −1 pv), `bane` (pénalité −1), `bears_endurance` (+2 pv/DV), `aid` (pv temporaires), `tears_to_wine` (portée 10 ft) | Écart connu, non corrigé dans cette passe (correctifs à effet de bord potentiel sur le choix de sort de `default_policy`) | | **20 écarts de dons/raciales (passe 4)** | Effets faux : *Exalted of the Society*, *Fortified Drinker* (Med, ce dernier ne s'applique **jamais** — condition « alcohol » non supportée) ; *Born Damned*, *Half-Forgotten Secrets*, *Axe to Grind*, *Thoroughbred*, *Extremely Fashionable*, *Lonely*/*Bitter* (drawbacks inversés en bonus), *Larger Than Life*, *Friendly Face*, *Breeze-Kissed* ; effets manquants : *Ambitious*, *Focused Study*, *Scaled Skin* ; valeur fausse : *Maw or Claw* (1d4 vs 1d6) ; noms inventés : *Whispering Wind*, *Like the Wind*, *Fey-touched*, *Pingre* | La parité feuille ↔ JSON est parfaite dans les deux sens (aucun don manquant ou en trop, aucun no-op silencieux), mais le résolveur mappe mal ces noms ou accepte des noms non-SRD — non corrigé | | **Morts-vivants / objets / alignement** | Le moteur n'a ni alignement (Shard of Chaos, Spear of Purity, Protection from Evil), ni piste d'objets (Steal, Sunder), ni sous-système de compétences (Perception opposée, Acrobaties) | Hors périmètre : mécaniques absentes du modèle | -| **Zones d'effet / ligne d'effet — résiduels (passe 6)** | Vitesse de `move` sous terrain difficile mixte pour multi-cases (le *footprint* n'est testé que pour la charge — relâcher le *descent* réécrirait les chemins Dijkstra) ; origin mesuré centre-à-centre plutôt qu'intersection-à-intersection ; caster multi-cases inclus dans son propre cône/ligne ; `square_size_ft` chargé mais non consommé (géométrie figée à 5 ft) ; créatures inertes non traitées comme couvert mou ni par les gabarits ; un aveugle peut charger/courir/retraiter ; incantation par point d'un cône/ligne derrière un mur rejetée | Écart connu / approximation conservatrice assumée | +| **Zones d'effet / ligne d'effet — résiduels** | Vitesse de `move` sous terrain difficile mixte pour multi-cases (le *footprint* n'est testé que pour la charge — relâcher le *descent* réécrirait les chemins Dijkstra) ; origin mesuré centre-à-centre plutôt qu'intersection-à-intersection ; un caster multi-cases dont une case est « effleurée » consomme un slot de longueur | Résiduel assumé (approximations conservatrices) | +| **Statistiques** | Deux invocations de la même créature partagent un même emplacement de stats (ids non désambiguïsés) ; `healing_done` n'est pas exposé séparément | Limitation documentée | +| **Non vérifiable (KB)** | `create_alcool`, `hidden_diplomacy` (absents du KB) ; ligne de description « acid » de `detect_poison` | Indéterminé / nit | | **Sorts différés restants (passe 5)** | `spiritual_weapon` (attaque flottante persistante), `saving_finale` (reroll immédiat), `guidance`/`resistance`/`virtue`/`stabilize` (buffs utilitaires sans mécanique cible — dégradation du choix de sort envisagée) | Documentés (SRD vérifié, raison moteur consignée) | -| **Couverture d'audit** | Audit « cas limites moteur » initialement bloqué par épuisement de quota du modèle oracle (replis mal configurés) ; relancé via un agent fiable. ~60 sorts restent non vérifiés champ par champ (hors ceux couverts en passe 4) ; sous-systèmes non audités : invocation avancée, observation, runner/métriques, CLI | Lacune de couverture à reprendre | +| **Couverture d'audit** | Registre des sorts **clos** (108/108 couverts ; 35 vérifiés en passe 7, 0 divergence). Audit « cas limites moteur » initialement bloqué par épuisement de quota de l'oracle (replis mal configurés) — relancé via un agent fiable. Restent non audités : observation, runner/métriques désormais couverts (passe 7) ; subsistent des sous-systèmes annexes (rendu du transcript, formats de données avancés) | Couverture largement complète | --- @@ -310,7 +331,8 @@ Constats explicitement contrôlés et **confirmés conformes** : | 4 | Sorts restants (champ par champ), dons des 8 PJ vs feuilles Foundry | `bg_29c36b1a` | 1 High, 1 Med, ~30 Low (dont 20 dons) | 11 correctifs (`79d9ff0`..`0c3f5fd`) ; 20 écarts de dons + effets de sorts différés documentés | | 5 | Sous-système des sorts (invocation, emplacements, métamagie, concentration, livraison) ; cas limites moteur (LoS/LoE, couvert, élévation, terrain, gabarits de zone) | `bg_938bceca`, `bg_27334a51` | 0 High, ~6 Med, ~15 Low | 15 correctifs (`81a09c8`..`9086038`) + documents ; 8 Low moteur résiduels | | 6 | Résiduels de dons (24) et d'effets de sorts (~13) | `bg_303e14a0`, `bg_151d5a57`, `bg_918e49cf` | 0 High, ~4 Med, ~30 Low | 16 correctifs (`d0db208`..`b95533d`) ; effets non exprimables documentés | -| 7+ | ~60 sorts non vérifiés champ par champ ; sous-systèmes non audités (observation, runner/métriques, CLI) | — | — | À reprendre (audit oracle bloqué par quota, contourné via agent fiable) | +| 7 | Registre des sorts (35 restants, champ par champ) ; moteur : Low documentés ; sous-systèmes runner/métriques/observation/CLI | `bg_0a3e3844`, `bg_2c4d185a`, `bg_cc8f0788` | 2 High, 2 Med, ~8 Low | 12 correctifs (`792cec1`..`9a087a4`) ; **registre des sorts clos (108/108)** | +| 8+ | Sous-systèmes annexes (rendu du transcript, formats avancés) | — | — | À reprendre si besoin | ---