19 KiB
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éfautD:\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 demanifest.csv, colonneDatedu manifeste (formatGet-Date -Format s,Snapshot.ps1:55,58). Manifeste =<BackupRoot>\<Lot>\manifest.csv, colonnesRel,Existed,Size,MD5,Date(Snapshot.ps1:27,55,58,62). - Fichiers suivis modifiés = entrées de
git statusdont 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 =LastWriteTimedu 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)
- « Heure du dernier GO » non lue automatiquement. Le GO est un message (
boss.md:17), pas un fichier ;BOSS-JOURNAL.mdne porte l'heure que sur une partie des lignes (plan § I11a : 18,6 %). Seule la borne explicite-Depuisest implémentée. Un repli sur l'horodatagede-Referencea été écrit puis retiré (alerte à chaque BUILD-FIN, comportement changé pour tous les appels avec-Reference). La fiche d'un lot doit passer-Depuis. - Message sans accents (« instantane », « ecrire »), y compris la ligne
INFO:CopieEtat.ps1est en ASCII pur, sans BOM (Grep[^\x00-\x7F]= 0 occurrence) ; un accent serait mal lu par Windows PowerShell 5.1. - Pas de
Write-Warning(décision orchestrateur de la reprise b) : souspwsh -File, il part sur stdout et cassait-Json(première version, essai E6). Le cas « contrôle non fait » s'affiche par la ligneINFO(mode texte) ; en-Json,instantane_lot.controle = falseet rien d'autre sur stdout (essai E6 :contient INFO : False). - 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. - 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). FICHE_REélargie (décision orchestrateur de la reprise b, hors fiche d'origine) : voir Constats (b2).- 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 selonsk-protocol§ 7, non versionnés. - Snapshot en deux appels (un
-Pathchacun,pwsh -File) : sous-File, une listea,barrive en une seule chaîne (lp-build§ 8) ; avecSnapshot.ps1, elle aurait été consignéeExisted=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
pwsh7). - Cas non essayés : plusieurs dossiers
<Lot>*pour un même lot ; manifeste illisible ;-BackupRootinexistant avec-Depuis; entrées Modules modifiées (0 entrée Modules dans les essais) ;-Depuisaux formats…:SSet…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 parFICHE_RE(la décision demandait<lettre><n>).
5. Points à confirmer en VAL
- Sans
-Depuis, la sortie texte deCopieEtat.ps1est celle de l'ancien script plus la dernière ligneINFO : controle d'instantane non fait (parametre -Depuis absent), code inchangé (comparerSaved\AMEL1-R10\old\Tools\CopieEtat.ps1àTools\CopieEtat.ps1, mêmes arguments : essais A0 / E4). - 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). - 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é pargit checkoutou par ungit stash pop(date = moment de l'opération) ne produit pas d'alerte à tort ou manquante. - Fichier supprimé : date du dossier existant le plus proche (modifiée par toute création ou suppression dans ce dossier) : trop large ou acceptable ?
- 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-Depuispostérieur au dernier instantané utile. - Glob
<Lot>*:-Lot CAMretient aussiCAM-B1…et tout dossier commençant parCAM(règle de la fiche) ;-Lot AMEL1retientAMEL1-M1,AMEL1-R3,AMEL1-R10. 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 pourTnavant) ; non-régression mesurée sur 8 lots (Constats b2), aucune ligne perdue ni renommée.- 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. - Fins de ligne : les deux outils et le livrable restent LF (0 CR).
lp-cart(N2+) est conservé dansAGENTS_N3comme 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.