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

19 KiB
Raw Blame History

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 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.