LifePlay-Revival/Docs/Migration/etat/EVAL2/AMEL1/AMEL1-R10-R13-IMPL.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

160 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Fiche AMEL1-R10-R13-b — Niveau N3 — Modèle prévu sonnet | utilisé claude-sonnet-5-5 — Agent lp-impl — Skills sk-protocol, ue-cpp-build, lp-build, lp-ue-compat
# AMEL1-R10-R13-IMPL : contrôle d'instantané du lot dans CopieEtat.ps1 (R10, I10b) et niveau N3 / identifiants de fiche dans FicheStats.py (R13, I13) (2026-10-14, reprise b)
Plan : `Docs\Migration\etat\EVAL2\AMEL1\AMEL1-INDICATEURS.md` (§ 2 lignes R10 et R13, § 3). Première passe puis reprise b (décisions de l'orchestrateur sur le § 5 de la première passe : filtre sur la date d'écriture, ligne INFO, élargissement de `FICHE_RE`). Aucune compilation (outils PowerShell et Python).
## 1. Fichiers modifiés
| Fichier | Lignes (état final) | Changement |
|---|---|---|
| `Tools\CopieEtat.ps1` | 23-33 (aide, contrôle 5), 61-64 (`.PARAMETER Depuis`), 86 (exemple), 99 (`[string]$Depuis`), 137-142 (`Get-LPMtime`), 254-258 (lecture et validation de `-Depuis`), 435-475 (section 5 « Instantané du lot »), 521-531 (bloc JSON `instantane_lot`), 543 (ligne `INFO`) | Paramètre `-Depuis "AAAA-MM-JJ HH:MM"` ; avec lui, alerte `INSTANTANE` si aucun dossier `<BackupRoot>\<Lot>*` n'a été créé ou modifié depuis cette heure **et** que des fichiers suivis par git, modifiés hors `Docs/Migration/etat/`, ont une date d'écriture ≥ `-Depuis`. Les fichiers suivis modifiés plus anciens sont ignorés et comptés à part. Sans `-Depuis` : ligne `INFO : controle d'instantane non fait (parametre -Depuis absent)` en dernière ligne, mode texte seulement. Codes de sortie 0/1/2 inchangés. |
| `Tools\FicheStats.py` | 20-24 (`FICHE_RE`), 25-27 (`AGENTS_N3`) | `AGENTS_N3` : ajout de `lp-mcp-bp`, `lp-diag`, `lp-cart-max`. `FICHE_RE` : nouvelle alternative `[A-Za-z]\d+[A-Za-z0-9]*(?:-[A-Za-z0-9]+)*(?![A-Za-z0-9])` (identifiants `<LOT>-<lettre><n>[-suffixe]`, ex. `STE-H10-GI1`, `CAM-B2p-F`, `STG-B1`), sans accolades (le motif passe par `str.format`). `level_of` inchangée : le « Niveau Nx » déclaré reste prioritaire. |
Détail R10 (`CopieEtat.ps1`) :
- Dossiers d'instantané = `Get-ChildItem -Directory -Filter "<Lot>*"` sous `-BackupRoot` (défaut `D:\Game\LifePlay_Backup_5.5`) ; date retenue par dossier = la plus récente parmi : création du dossier, dernière écriture du dossier, dernière écriture de `manifest.csv`, colonne `Date` du manifeste (format `Get-Date -Format s`, `Snapshot.ps1:55,58`). Manifeste = `<BackupRoot>\<Lot>\manifest.csv`, colonnes `Rel,Existed,Size,MD5,Date` (`Snapshot.ps1:27,55,58,62`).
- Fichiers suivis modifiés = entrées de `git status` dont le code XY n'est pas `??` : jeu (hors `^Docs/Migration/etat(/|$)`), addon (périmètre déjà lu par le script), Modules. Date d'écriture = `LastWriteTime` du fichier ; fichier supprimé (` D`) : celle du dossier existant le plus proche (`Get-LPMtime`) ; date introuvable : le fichier compte.
- Message : « aucun instantane du lot depuis AAAA-MM-JJ HH:MM : lancer Snapshot.ps1 -Lot <Lot> avant d'ecrire (n fichier(s) suivi(s) modifie(s) depuis cette heure hors Docs/Migration/etat/ ; m plus ancien(s) ignore(s) ; dernier instantane : <heure | aucun dossier …>) ».
- JSON : clé `instantane_lot` (`controle`, `depuis`, `dernier`, `dossiers`, `suivis_modifies`, `suivis_anciens`, `suivis_exemples` ≤ 5). Sans `-Depuis`, la section 5 ne scanne rien.
- Fichiers de test (non versionnés, `Saved\` ignoré par git) : `Saved\AMEL1-R10\essai_r10.ps1`, `essai_r13_niveau.py`, `essai_r13b.py`, `bk\ZZR10A-snap\manifest.csv`, `old\Tools\{CopieEtat,UeState}.ps1` (état d'avant), `ref.json`.
## 2. Écarts à la SPEC (fiche)
1. **« Heure du dernier GO » non lue automatiquement.** Le GO est un message (`boss.md:17`), pas un fichier ; `BOSS-JOURNAL.md` ne porte l'heure que sur une partie des lignes (plan § I11a : 18,6 %). Seule la borne explicite `-Depuis` est implémentée. Un repli sur l'`horodatage` de `-Reference` a été écrit puis retiré (alerte à chaque BUILD-FIN, comportement changé pour tous les appels avec `-Reference`). La fiche d'un lot doit passer `-Depuis`.
2. **Message sans accents** (« instantane », « ecrire »), y compris la ligne `INFO` : `CopieEtat.ps1` est en ASCII pur, sans BOM (Grep `[^\x00-\x7F]` = 0 occurrence) ; un accent serait mal lu par Windows PowerShell 5.1.
3. **Pas de `Write-Warning`** (décision orchestrateur de la reprise b) : sous `pwsh -File`, il part sur stdout et cassait `-Json` (première version, essai E6). Le cas « contrôle non fait » s'affiche par la ligne `INFO` (mode texte) ; en `-Json`, `instantane_lot.controle = false` et rien d'autre sur stdout (essai E6 : `contient INFO : False`).
4. **Filtre sur la date d'écriture** (décision orchestrateur de la reprise b, plus étroit que la fiche d'origine) : seuls comptent les fichiers suivis modifiés écrits à partir de `-Depuis` ; les autres sont dits « ignorés » dans le message. Choix propre à l'implémentation, à confirmer : un fichier supprimé prend la date de son dossier existant le plus proche.
5. **Périmètre** : l'addon et Modules sont comptés en plus du jeu (le dossier `Docs/Migration/etat/` n'existe que dans le jeu).
6. **`FICHE_RE` élargie** (décision orchestrateur de la reprise b, hors fiche d'origine) : voir Constats (b2).
7. **Scripts d'essai sous `Saved\AMEL1-R10\`** (hors « deux fichiers + livrable » de la fiche) : la fiche demandait des scripts de test par Write ; rangés selon `sk-protocol` § 7, non versionnés.
8. **Snapshot en deux appels** (un `-Path` chacun, `pwsh -File`) : sous `-File`, une liste `a,b` arrive en une seule chaîne (`lp-build` § 8) ; avec `Snapshot.ps1`, elle aurait été consignée `Existed=False` (estimé, non essayé).
## 3. Instantané
Lot `AMEL1-R10` : `pwsh -NoProfile -File Tools/Snapshot.ps1 -Lot AMEL1-R10 -Path Tools/CopieEtat.ps1` puis `… -Path Tools/FicheStats.py`. Manifeste : `D:\Game\LifePlay_Backup_5.5\AMEL1-R10\manifest.csv`. Reprise b : pas de nouvel instantané (décision de l'orchestrateur, celui-ci couvre l'état d'avant des deux fichiers).
```
sauvegarde : Tools/CopieEtat.ps1 (5E441FA06F05B1F1D91B91DCAC5B023F)
sauvegarde : Tools/FicheStats.py (536575EFCAD437CA9BB89A25E654670E)
```
Dossier créé à 2026-10-14 20:14:45. État final (reprise b) : voir la ligne « Contrôles de clôture » dans Constats (MD5 et PubCheck).
## 4. Ce qui n'a pas été fait
- Pas de compilation (sans objet), pas de Restore.
- « Outils nommés dans le gabarit de fiche » (autre moitié de R10, `lp-lot`) : hors de cette fiche.
- Pas d'essai sous Windows PowerShell 5.1 (seul `pwsh` 7).
- Cas non essayés : plusieurs dossiers `<Lot>*` pour un même lot ; manifeste illisible ; `-BackupRoot` inexistant avec `-Depuis` ; entrées Modules modifiées (0 entrée Modules dans les essais) ; `-Depuis` aux formats `…:SS` et `…THH:MM` (acceptés par le code, non rejoués) ; fichier supprimé dont le dossier parent a disparu (la remontée s'arrête à la racine du dépôt, non essayé).
- Identifiants sans chiffre (`STG-WALKA`, `STG-FACADE`) : toujours non reconnus par `FICHE_RE` (la décision demandait `<lettre><n>`).
## 5. Points à confirmer en VAL
1. Sans `-Depuis`, la sortie texte de `CopieEtat.ps1` est celle de l'ancien script plus la dernière ligne `INFO : controle d'instantane non fait (parametre -Depuis absent)`, code inchangé (comparer `Saved\AMEL1-R10\old\Tools\CopieEtat.ps1` à `Tools\CopieEtat.ps1`, mêmes arguments : essais A0 / E4).
2. Les essais (a) se rejouent par `pwsh -NoProfile -File Saved\AMEL1-R10\essai_r10.ps1` (≈ 2 min) : codes 0 (E1, E2c, E4, E7), 1 (E2, E2b), 2 (E3a, E3b, E3c).
3. Filtre sur la date d'écriture : dans E2, 3 fichiers comptés (les deux outils de ce lot et la suppression de `Tools/claude/hooks/ecriture-gardien.py`, datée par son dossier) et 13 ignorés (addon d'un autre lot) ; vérifier que la date d'un fichier modifié par `git checkout` ou par un `git stash pop` (date = moment de l'opération) ne produit pas d'alerte à tort ou manquante.
4. Fichier supprimé : date du dossier existant le plus proche (modifiée par toute création ou suppression dans ce dossier) : trop large ou acceptable ?
5. Limite de `Snapshot.ps1` : si tous les fichiers sont « déjà sauvegardés », le manifeste n'est pas modifié (`Snapshot.ps1:46,62`) et l'alerte persiste après un nouveau GO ; parade : un `-Depuis` postérieur au dernier instantané utile.
6. Glob `<Lot>*` : `-Lot CAM` retient aussi `CAM-B1…` et tout dossier commençant par `CAM` (règle de la fiche) ; `-Lot AMEL1` retient `AMEL1-M1`, `AMEL1-R3`, `AMEL1-R10`.
7. `FICHE_RE` : l'alternative nouvelle reconnaît aussi des identifiants cités à titre de référence dans les 400 premiers caractères d'un prompt non déclaré (même risque que pour `Tn` avant) ; non-régression mesurée sur 8 lots (Constats b2), aucune ligne perdue ni renommée.
8. Les lignes de tableau de `FicheStats.py --lot <L>` augmentent pour les lots de la période P3 (STE de 2 à 31, STG de 0 à 17, CAM de 0 à 43 lignes, tous agents confondus) : les comptes de fiches par lot des relevés EVAL2 faits avant ne sont plus comparables tels quels.
9. Fins de ligne : les deux outils et le livrable restent LF (0 CR).
10. `lp-cart` (N2+) est conservé dans `AGENTS_N3` comme avant (non demandé).
## 6. Fichiers à commiter
Dépôt jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`) :
- M `Tools/CopieEtat.ps1`
- M `Tools/FicheStats.py`
- A `Docs/Migration/etat/EVAL2/AMEL1/AMEL1-R10-R13-IMPL.md`
Ne pas commiter : `Saved/AMEL1-R10/` (ignoré). Autres entrées du `git status` (`Tools/EssaiJournal.*`, `Tools/Indicateurs.py`, `D Tools/claude/hooks/ecriture-gardien.py`, `Docs/32_…`, addon) : pas de ce lot.
Tours : 25 / 50 (première passe) ; reprise b : 9 / 30
## Constats
Trace : `Saved\AMEL1-R10\essai_r10.ps1`, `essai_r13_niveau.py`, `essai_r13b.py` — Fiche AMEL1-R10-R13-b — 2026-10-14 20:28-20:29 (série CopieEtat), 20:2x (série FicheStats)
Commande : `pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Saved\AMEL1-R10\essai_r10.ps1"` puis `… -Serie ancien -Ce "D:\Game\LifePlay-master 5.8\Saved\AMEL1-R10\old\Tools\CopieEtat.ps1"` ; `python -I -X utf8 Saved\AMEL1-R10\essai_r13b.py "D:/Game/LifePlay_Backup_5.5/AMEL1-R10/Tools/FicheStats.py" "D:/Game/LifePlay-master 5.8/Tools/FicheStats.py"` ; `python -I -X utf8 Saved\AMEL1-R10\essai_r13_niveau.py "D:/Game/LifePlay-master 5.8/Tools/FicheStats.py" lp-mcp-bp`
Environnement: copie 5.8, branche `ue5.8`, HEAD jeu `89e19ca`, addon `082fb00`, Modules `c8661cd` ; machine non calme (cpu 4-31 %), copie partagée avec d'autres lots (addon modifié, 13 `[ M]` et 4 `[??]` d'un autre lot).
Attendu : E1, E2c, E4, E7 → 0 ; E2, E2b → 1 avec le message (fichiers récents et anciens comptés) ; E3 → 2 ; E4 = A0 plus la ligne INFO ; `FICHE_RE` : plus de fiches reconnues sans ligne perdue ni identifiant changé.
Obtenu : ci-dessous.
Lecture : les alertes `GIT` préexistantes de l'addon font rendre 1 à tout appel sans `-Reference` : les essais E1 à E7 utilisent `-Reference ref.json` (écrit par R0, même état git) pour les neutraliser, sinon le 0 viendrait d'une autre cause que celle testée. Le nombre de transcriptions « reconnues » en (b2) est un minorant (clé de dédoublonnage = début + tours).
### (a) CopieEtat.ps1 : essais à blanc (lots fictifs ZZR10A avec dossier d'instantané de test écrit à 20:17, ZZR10B sans dossier ; `-BackupRoot` de test)
Essai 1, lot avec instantané récent (`-Depuis` = 19:28) → **0** :
```
COPIE OK lot=ZZR10A copie=LifePlay-master 5.8 proc=0 assets=0 absents=0 modifies=0 git=0/17/0 hors_declares=0 parasites=0 jeu_hors_docs=6 jeu_docs=84 head=89e19ca/082fb00/c8661cd verrou=165:libre cpu=20% alertes=aucune
code=0
```
Essai 2, lot sans instantané, fichiers suivis écrits depuis `-Depuis` (20:26) → **1** avec le message :
```
COPIE ALERTE lot=ZZR10B … alertes=INSTANTANE
ALERTE INSTANTANE : aucun instantane du lot depuis 2026-10-14 20:26 : lancer Snapshot.ps1 -Lot ZZR10B avant d'ecrire (3 fichier(s) suivi(s) modifie(s) depuis cette heure hors Docs/Migration/etat/ ; 13 plus ancien(s) ignore(s) ; dernier instantane : aucun dossier D:\Game\LifePlay-master 5.8\Saved\AMEL1-R10\bk\ZZR10B*)
code=1
```
Essai 2b, instantané (20:17) antérieur à `-Depuis` (20:26) → **1** : `ALERTE INSTANTANE : aucun instantane du lot depuis 2026-10-14 20:26 : … (3 fichier(s) … ; 13 plus ancien(s) ignore(s) ; dernier instantane : 2026-10-14 20:17)`, `code=1`.
Essai 2c, faux positif écarté (lot sans dossier, mais aucun fichier suivi écrit depuis `-Depuis` = 21:28) → **0** : `COPIE OK lot=ZZR10B … alertes=aucune`, `code=0`.
Essai 3, paramètres invalides → **2** :
```
COPIE ERREUR lot=ZZR10A : -Depuis 'hier matin' invalide (attendu : AAAA-MM-JJ HH:MM, heure locale) code=2
COPIE ERREUR lot=ZZR10A : -Depuis '2026-13-45 99:99' invalide (attendu : AAAA-MM-JJ HH:MM, heure locale) code=2
COPIE ERREUR lot=ZZ R10 : lot 'ZZ R10' invalide (lettres, chiffres, . _ - seulement) code=2
```
Sans `-Depuis`, avec `-Reference` : ancien script (A0) et nouveau (E4) :
```
A0: COPIE OK lot=ZZR10B … hors_declares=0 parasites=0 … alertes=aucune code=0
E4: COPIE OK lot=ZZR10B … hors_declares=0 parasites=0 … alertes=aucune
INFO : controle d'instantane non fait (parametre -Depuis absent) code=0
R0 (sans -Reference ni -Depuis) : … alertes=GIT puis 17 lignes ALERTE GIT, puis la ligne INFO en dernier, code=1 (comme avant)
```
`-Json` sans `-Depuis`, stdout seul (E6) : `contient INFO : False`, `ConvertFrom-Json : OK ; instantane_lot.controle = False`. Lot réel `AMEL1-R10` (E7, `-Depuis` 17:28) : `COPIE OK … alertes=aucune`, `code=0` ; JSON : `dernier = 2026-10-14T20:14:45`, `dossiers = [AMEL1-R10]`, `suivis_modifies = 3`, `suivis_anciens = 13`.
### (b) FicheStats.py : avant / après sur 3 fiches `lp-mcp-bp` de P3 sans « Niveau Nx » (R13)
Commande : `python -I -X utf8 Tools/FicheStats.py --lot GEL1` puis `--lot ORG4`, avec `--since "2026-10-11 05:30:00" --until "2026-10-14 18:25:41"` (lignes `lp-mcp-bp`).
```
AVANT | GEL1-SPEC | N1? | lp-mcp-bp | … | 41 | … | hors budget (tours) |
AVANT | ORG4-SPEC | N1? | lp-mcp-bp | … | 18 | … | dans le budget |
AVANT | ORG4-SPEC | N1? | lp-mcp-bp | … | 35 | … | dans le budget |
APRÈS | GEL1-SPEC | N3? | lp-mcp-bp | … | 41 | … | dans le budget |
APRÈS | ORG4-SPEC | N3? | lp-mcp-bp | … | 18 | … | dans le budget |
APRÈS | ORG4-SPEC | N3? | lp-mcp-bp | … | 35 | … | dans le budget |
```
Niveau déduit N1 → N3 (« ? » = déduit de l'agent), budget 40 → 60 tours ; `GEL1-SPEC` (41 tours) passe de « hors budget (tours) » à « dans le budget ». Les 27 transcriptions `lp-mcp-bp` de P3 sans « Niveau Nx » (`essai_r13_niveau.py`, mêmes 27 que les lignes de `subagents.csv`) : avant `{'N1 (agent)': 27}` / `{40: 27}`, après `{'N3 (agent)': 27}` / `{60: 27}`. `AGENTS_N3` après = `['fable-top', 'lp-cart', 'lp-cart-max', 'lp-diag', 'lp-impl', 'lp-impl-max', 'lp-mcp-bp', 'opus-max', 'opus-xhigh']`. Sources des niveaux (en-têtes, ligne 3) : `lp-mcp-bp.md` « N3 », `lp-cart-max.md` « N3 », `lp-diag.md` « N3− » ; les autres `lp-*` sont N0 (`lp-builder`) ou N1, `lp-impl` N3, `lp-impl-max` N4 et `lp-cart` N2+ déjà présents.
### (b2) FICHE_RE élargie : combien de fiches `lp-mcp-bp` de P3 reconnues par la CLI
Commande : `python -I -X utf8 Saved\AMEL1-R10\essai_r13b.py <FicheStats.py de l'instantané AMEL1-R10> <Tools\FicheStats.py>` (lance `main()` des deux versions avec `--lot <L>` + fenêtre P3).
```
Transcriptions lp-mcp-bp de P3 sans 'Niveau Nx' en premiere ligne : 27
lot STE ancien : 0 ; nouveau : 5 ['STE-H10-GI1', 'STE-H10-GI1', 'STE-H10-GI2', 'STE-H3d-I', 'STE-H3g-I']
lot STG ancien : 0 ; nouveau : 3 ['STG-B1', 'STG-B2P', 'STG-B7a']
lot CAM ancien : 0 ; nouveau : 10 ['CAM-B2f', 'CAM-B2g', 'CAM-B2i', 'CAM-B2k', 'CAM-B2m', 'CAM-B2n', 'CAM-B2p-G-PC', 'CAM-B2p-J-PC-FICHE', 'CAM-B2p-R', 'CAM-B2s']
lot GEL1 ancien : 1 ; nouveau : 1 ['GEL1-SPEC'] lot ORG4 ancien : 2 ; nouveau : 2 ['ORG4-SPEC', 'ORG4-SPEC'] lot B2p : 0 ; 0
TOTAL distinct (debut, tours) : ancien = 3 / 27 ; nouveau = 21 / 27 ; reconnues avant et perdues apres : 0
```
Avant : 3 fiches reconnues sur 27 ; après : 21 sur 27 (minorant). Les ≤ 6 restantes sont estimées sans identifiant `<lettre><n>` dans le début du prompt (`STG-WALKA`, `STG-FACADE`, fiches « (aucun) » de `subagents.csv`), non vérifié fiche par fiche.
Non-régression (lignes `(agent, début, tours)` de l'ancienne version retrouvées avec le même identifiant dans la nouvelle) :
```
lot GEL1 : ancien 3, nouveau 4 ; perdues 0 ; id change 0 ; nouvelles 1 (GEL1-D1, lp-builder)
lot ORG4 : ancien 5, nouveau 6 ; perdues 0 ; id change 0 ; nouvelles 1 (ORG4-P0, lp-builder)
lot STE : ancien 2, nouveau 31 ; perdues 0 ; id change 0 ; nouvelles 29
lot STG : ancien 0, nouveau 17 ; perdues 0 ; id change 0 ; nouvelles 17
lot CAM : ancien 0, nouveau 43 ; perdues 0 ; id change 0 ; nouvelles 43
lot B2p : ancien 1, nouveau 1 ; perdues 0 ; id change 0 ; nouvelles 0
lot U8 : ancien 24, nouveau 24 ; perdues 0 ; id change 0 ; nouvelles 0 (sans fenêtre : tout l'historique)
lot STA : ancien 10, nouveau 10 ; perdues 0 ; id change 0 ; nouvelles 0 (sans fenêtre)
identifiants déjà reconnus et inchangés (échantillon) : GEL1-SPEC, ORG4-SPEC, … ; U8 (24 lignes) et STA (10 lignes) identiques
```
### (c) `git diff --stat` des deux fichiers
```
Tools/CopieEtat.ps1 | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++
Tools/FicheStats.py | 6 +++-
2 files changed, 89 insertions(+), 1 deletion(-)
```
`git ls-files --eol` : `i/lf w/lf attr/-text` pour les deux fichiers ; 0 CR (`tr -cd '\r' | wc -c` = 0 pour les deux).
Contrôles de clôture (reprise b) : `pwsh -NoProfile -File Tools\PubCheck.ps1 -Fichiers Tools/CopieEtat.ps1 Tools/FicheStats.py "Docs/Migration/etat/EVAL2/AMEL1/AMEL1-R10-R13-IMPL.md"` → `PubCheck : 0 constat(s)`, code 0 (lancé avant l'ajout de cette ligne). MD5 finaux : `Tools/CopieEtat.ps1` `a5298113f1cefb6a41d0d00f07b6052c`, `Tools/FicheStats.py` `25938733222fd298aa6740603584e841`. Après la dernière modification de `CopieEtat.ps1` (commentaire de la ligne 436), les codes E1 = 0, E2 = 1, E2b = 1, E2c = 0, E3a/b/c = 2 ont été rejoués.
À verser : `lp-build` § 8 — sous `pwsh -File`, `Write-Warning` part sur la sortie standard et casse un `-Json` lu par `ConvertFrom-Json` (établi, essai E6 de la première passe) ; `lp-lot` (Snapshot) — `-Path a,b` sous `pwsh -File` est une seule chaîne, un appel par chemin (estimé d'après `lp-build` § 8, non rejoué avec `Snapshot.ps1`) ; `lp-doc` (gabarit TACHES) — `FicheStats.py` ne reconnaissait pas les fiches `<LOT>-<lettre><n>[-suffixe]` (24 des 27 `lp-mcp-bp` de P3 hors CLI avant la reprise b, 6 après) : relire les `<LOT>-TACHES` mesurés avant cette date.