LifePlay-Revival/Docs/Migration/etat/AG/TRACE1/TRACE1-T4b-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

14 KiB
Raw Blame History

Fiche TRACE1-T4b — Niveau N3 — Modèle prévu opus | utilisé claude-opus-5-5 (déclaré par l'environnement) — Agent lp-impl — Skills sk-protocol, sk-windows-shell, sk-change-safety (préchargés aussi : ue-cpp-build, lp-build, lp-ue-compat)

TRACE1-T4b-IMPL : Tools\Corbeille.ps1 et preuve de ses refus à blanc (2026-10-13)

Copie D:\Game\LifePlay-master 5.8, branche ue5.8. HEAD 9eaa6cc à la remise de la fiche, f32df0d pendant les essais (3 commits STE-H10 du gardien, sans rapport avec ce lot). Aucun envoi à la corbeille : le script n'a jamais été lancé avec -Envoyer, DeleteFile / DeleteDirectory n'ont jamais été appelés hors du script, aucune commande d'effacement. Corbeille : 2521 éléments avant et après chaque série d'essais (sorties ci-dessous).

1. Fichiers modifiés

Fichier Action Contenu
D:\Game\LifePlay-master 5.8\Tools\Corbeille.ps1 création (443 lignes, LF, ASCII, sans BOM) voir découpage ci-dessous
Docs\Migration\etat\AG\TRACE1\TRACE1-T4b-liste-refus.txt création liste témoin de la fiche, 5 lignes (SPEC § 7 critère 5)
…\TRACE1-T4b-cas1-absent.txt à …\TRACE1-T4b-cas6-admis.txt création une liste d'une ligne par cas (5 refus, 1 admission)
…\TRACE1-T4b-cas7-supplement.txt création garde-fous ajoutés : chemin relatif, jonction, doublon
…\TRACE1-T4b-essai.ps1 création pilote des essais à blanc, rejouable par la VAL (lecture seule, sans -Envoyer)
…\TRACE1-T4b-essai.txt, …\TRACE1-T4b-essai-supplement.txt création sorties brutes des essais (0 occurrence du nom du compte, grep -ci)
…\TRACE1-T4b-IMPL.md création ce livrable

Découpage de Tools\Corbeille.ps1 :

  • l. 1-71 : aide <# .SYNOPSIS .DESCRIPTION .PARAMETER .EXAMPLE #> sans accents (motifs de refus, codes 0 / 2).
  • l. 73-76 : param([string]$Liste, [switch]$Envoyer) ; l. 77 $ErrorActionPreference = 'Stop'.
  • l. 79-104 : racines autorisées de TRACE1-T1-INV.md § 1, commentaire « a tenir identique a Traces.ps1 » (6 copies × Saved, Docs\Migration\etat, .hyperai, Tools, Intermediate\Build ; moteurs 5.5 / 5.8 × Saved, Programs\AutomationTool\Saved, Programs\UnrealBuildTool, Programs\UnrealInsights\Saved ; D:\Game\LifePlay_Build_* ; LifePlay_Backup_5.5 ; LifePlay_Publication ; 7 dossiers du profil).
  • l. 107-110 : dépôts des modules à --git-dir hors arbre (lp-paths).
  • l. 135-149 Get-Reel : chemin réel, jonctions et liens résolus composant par composant (ResolveLinkTarget($true)).
  • l. 152-183 Get-SuiviGit : .git le plus proche du chemin réel, git ls-files --error-unmatch -- ":(literal,icase)<rel>" ; code 0 = suivi, 1 = non suivi, autre = git-erreur.
  • l. 210-228 : index des instantanés (manifest.csv de Backup_5.5, profondeur 3, et <dossier du manifest>\<Rel>).
  • l. 230-245 Get-Corbeille : Win32_Volume (lettre → GUID) puis HKCU:\…\BitBucket\Volume\{guid} MaxCapacity (Mo), NukeOnDelete.
  • l. 247-271 : lecture de la liste (variables développées, # ignoré, TSV à colonne Chemin), refus globaux.
  • l. 273-346 : contrôles ligne par ligne ; l. 348-374 doublons et capacité cumulée par volume ; l. 376-395 verdict.
  • l. 397-443 : envoi (seulement avec -Envoyer) : l. 426 DeleteDirectory($cible, 'OnlyErrorDialogs', 'SendToRecycleBin'), l. 428 DeleteFile($cible, 'OnlyErrorDialogs', 'SendToRecycleBin'), arrêt au premier échec, contrôle Test-Path puis Test-DansCorbeille (l. 401-418 : Namespace(10), GetDetailsOf(el, 1) + nom).

2. Écarts à la SPEC

La SPEC § 4 est appliquée en entier (refus listés, envoi, contrôle, ligne de compte, codes). Écarts, tous des garde-fous ou des précisions, à accepter ou refuser en VAL :

  • E1 session-non-interactive (refus global) : dans FileSystem.vb (dotnet/runtime), DeleteFile / DeleteDirectory ne passent par le shell (donc par la corbeille) que si showUI <> NoUI AndAlso Environment.UserInteractive ; sinon IO.File.Delete / IO.Directory.Delete, effacement définitif. Le script refuse donc si [Environment]::UserInteractive est faux (vrai dans cette session : UserInteractive=True, TRACE1-T4b-essai.txt l. 2).
  • E2 lecture-seule : FileSystem.vb, commentaire des drapeaux OnlyErrorDialogs (FOF_SILENT | FOF_NOCONFIRMATION) : « In exception cases (read-only file), shell still asks » → boîte de dialogue ; refus avant envoi.
  • E3 jonction, lien, lien-interne : le chemin réel est résolu avant les contrôles (piège de la fiche) ; s'il diffère du chemin écrit, la ligne est refusée (la liste doit porter des chemins réels) au lieu d'agir sur la cible ; un élément qui est lui-même un lien, ou un dossier qui en contient, est refusé. hors-racines se teste sur le chemin écrit et sur le chemin réel ; profil-claude aussi.
  • E4 dossier-non-plantage : la SPEC réserve DeleteDirectory au « dossier de plantage » ; le script refuse tout dossier dont le parent ne s'appelle pas Crashes.
  • E5 refus ajoutés : chemin-relatif, illisible, racine-autorisee (une racine autorisée entière, ex. …\Saved), depot-git (dans .git), racine-sauvegarde étendu à tout dossier qui contient un manifest.csv, manifest-illisible, git-erreur, corbeille-inconnue (pas de clé BitBucket, chemin réseau), corbeille-desactivee (NukeOnDelete=1), trop-gros-cumul (somme d'un volume > capacité : la corbeille effacerait pour de bon ses plus anciens éléments), doublon (ligne répétée ou sous un dossier de la liste).
  • E6 sortie : une ligne REFUS <motif> <chemin> par motif (un chemin peut en avoir plusieurs, ex. racine de build : 4) ; à blanc, une ligne A-BLANC <octets> <chemin> par ligne admise puis A BLANC lignes=<n> octets=<o> avant la ligne de compte finale, au format de la SPEC (envoyes=0 octets=0) ; refuses = lignes refusées + refus globaux ; le dossier du profil est affiché %USERPROFILE%.
  • E7 liste : lignes vides et #… ignorées ; un TSV dont la première ligne porte une colonne Chemin (sortie de Traces.ps1 -Sortie) est lu sur cette colonne.
  • E8 contrôle après envoi : nom comparé avec et sans extension (l'affichage de la corbeille peut masquer l'extension), 10 essais à 300 ms ; non exercé (aucun envoi), voir § 5.
  • E9 git : pathspec :(literal,icase) (insensible à la casse, sans jokers) ; dépôt = .git le plus proche du chemin réel ; modules : --git-dir D:\Game\LifePlay_ModulesGit\<5.8|5.5>.git --work-tree <copie>\Content\Modules.
  • E10 racines : LifePlay_Build_* développé à l'exécution (pas de liste figée) ; une racine du profil dont la variable manque est ignorée (sinon GetFullPath la rendrait relative au dossier courant).
  • E11 « décrite par un manifest.csv » = le manifest.csv lui-même et les copies <dossier du manifest>\<Rel> de Backup_5.5 (instantanés, Q6) ; tout fichier nommé manifest.csv sous Backup_5.5 est refusé, même au-delà de la profondeur 3 de l'index. Les originaux décrits (dans les copies) ne sont pas visés.

3. Instantané

Lot TRACE1, D:\Game\LifePlay_Backup_5.5\TRACE1\manifest.csv l. 3 : "Tools\Corbeille.ps1","False","0","","2026-10-13T08:20:14" (fait par la session principale avant la fiche). Retour arrière proposé, non lancé : .\Tools\Restore.ps1 -Lot TRACE1 (retire le fichier par déplacement, Existed=False). Les fichiers TRACE1-T4b-* de etat\ n'ont pas d'instantané : créés par la fiche, ignorés par git sauf le .md.

4. Ce qui n'a pas été fait

  • Aucun envoi réel (interdit) : l'envoi (l. 397-443), le contrôle Namespace(10) / GetDetailsOf(el, 1) après envoi et la ligne ENVOYE ne sont pas exercés ; c'est l'objet de T5 (GO séparé, accord de l'utilisateur).
  • Refus non exercés : trop-gros, trop-gros-cumul, corbeille-inconnue, corbeille-desactivee, lecture-seule, lien, lien-interne, racine-depot, depot-git, racine-copie, racine-sauvegarde, illisible, git-erreur, manifest-illisible, session-non-interactive, branche des modules (--git-dir), lecture TSV ; admission d'un dossier Crashes\<dossier> non essayée. Avoir mesuré 9 motifs ne dit rien des autres.
  • Tools\Traces.ps1 (fiche T4a, présent en ?? depuis 08:2x) ni lu ni appelé : l'identité des racines reste à comparer.
  • Ni CHG, ni doc, ni skill (T8).

5. Points à confirmer en VAL

  • Racines de Tools\Corbeille.ps1 l. 79-104 identiques à celles de Tools\Traces.ps1 (T4a), au caractère près.
  • Critère 5 rejoué : pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\AG\TRACE1\TRACE1-T4b-essai.ps1" → cas 1 à 5 REFUS <motif attendu> et code=2, cas 6 code=0, liste témoin refuses=5 code=2, ETAT IDENTIQUE=True, CORBEILLE AVANT = APRES.
  • Critère 6 : 0 ligne pour Remove-Item, rm , del , Delete( ; seuls appels l. 426 et 428, avec SendToRecycleBin ; -Force seulement sur des lectures (l. 141, 195, 214, 287, 327), aucun sur un envoi.
  • Critère 7 : 0 erreur d'analyse, -? code 0, LF seul, ASCII, sans BOM, comme Numero.ps1 et UeState.ps1.
  • Écarts E1 à E11 acceptés ou refusés (garde-fous ajoutés à la SPEC § 4).
  • E1 : la session qui lancera -Envoyer (T5, T7) donne [Environment]::UserInteractive vrai (sinon refus global, voulu).
  • E8 : en T5, le contrôle retrouve l'élément (colonne 1 = « Emplacement d'origine » sur ce poste, Windows en français).
  • Comportement de DeleteFile pour un fichier plus gros que la corbeille avec FOF_NOCONFIRMATION (question ou effacement définitif) : non vérifié ; le refus trop-gros l'évite.

6. Fichiers à commiter

Dépôt du jeu, copie 5.8, branche ue5.8 :

  • A Tools/Corbeille.ps1
  • A Docs/Migration/etat/AG/TRACE1/TRACE1-T4b-IMPL.md

Non commités (ignorés par .gitignore:75 /Docs/Migration/etat/**, contrôlé par git check-ignore -v) : les TRACE1-T4b-*.txt et TRACE1-T4b-essai.ps1. Tools/Traces.ps1 n'est pas de cette fiche.

Tours : 21 / 60

Constats

Recherche (critère c = 2)

Source Constat
https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.fileio.filesystem.deletefile DeleteFile(String, UIOption, RecycleOption) ; exceptions ArgumentException, ArgumentNullException, PathTooLongException, NotSupportedException, IOException (fichier utilisé), SecurityException, FileNotFoundException, UnauthorizedAccessException (droits ou lecture seule) ; « The showUI and recycle parameters are not supported in applications that are not user interactive, such as Windows Services. » Rien sur la capacité de la corbeille.
https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.fileio.filesystem.deletedirectory même surcharge ; DirectoryNotFoundException, IOException (fichier utilisé dans l'arbre), OperationCanceledException (« the directory cannot be deleted ») ; même remarque sur les applications non interactives.
https://raw.githubusercontent.com/dotnet/runtime/9d5a6a9aa463d6d10b0b0ba6d5982cc82f363dc3/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/FileIO/FileSystem.vb DeleteFileInternal : If (showUI <> UIOptionInternal.NoUI) AndAlso Environment.UserInteractive Then → ShellDelete, sinon IO.File.Delete (E1) ; ShellDelete ajoute FOF_ALLOWUNDO pour SendToRecycleBin ; OnlyErrorDialogs = FOF_SILENT + FOF_NOCONFIRMATION, « In exception cases (read-only file), shell still asks » (E2) ; ShellFileOperation : opération interrompue → OperationCanceledException, code non nul → exception IO.
https://learn.microsoft.com/en-us/windows/win32/shell/folder-getdetailsof colonnes dépendantes du dossier (0-4 décrites pour le système de fichiers seulement) ; rien sur la corbeille.
https://learn.microsoft.com/en-us/windows/win32/api/shldisp/ne-shldisp-shellspecialfolderconstants ssfBITBUCKET = 0xa (10) : « Virtual folder that contains the objects in the user's Recycle Bin. »
relevé local (bloc-notes de la session, lecture seule) Namespace(10).GetDetailsOf($null, i) : 0 « Nom », 1 « Emplacement d'origine », 2 « Date de suppression », 3 « Taille » ; Items().Count = 2521 ; BitBucket\Volume : D: MaxCapacity=197398 Mo, C: 50837 Mo, NukeOnDelete=0 partout ; D:\Game\DC4 et D:\Game\U58-essai existent ; .claude\skills de la copie 5.8 = jonction vers D:\Game\LifePlay-Sandbox\Tools\claude\skills.

Note TRACE (essais de la fiche)

Trace : Docs\Migration\etat\AG\TRACE1\TRACE1-T4b-essai.txt — Fiche TRACE1-T4b — 2026-10-13 08:31
Commande     : pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\AG\TRACE1\TRACE1-T4b-essai.ps1"
               (lance 7 fois pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\Corbeille.ps1" -Liste <liste>, sans -Envoyer)
Environnement: copie 5.8, ue5.8, HEAD f32df0d, pwsh 7.6.6, UserInteractive=True ; aucune commande Unreal
Attendu      : cas 1-5 REFUS <absent | suivi-git | profil-claude | racine-build | manifest>, code 2 ; cas 6 code 0 ;
               MD5 et Test-Path identiques ; corbeille avant = après
Obtenu       : cas1 REFUS absent code=2 ; cas2 REFUS suivi-git code=2 ; cas3 REFUS profil-claude + hors-racines code=2 ;
               cas4 REFUS racine-build + racine-autorisee + hors-racines + dossier-non-plantage code=2 ; cas5 REFUS manifest
               code=2 ; cas6 A-BLANC 459082 … code=0 ; liste témoin refuses=5 code=2 ; ETAT IDENTIQUE=True ;
               CORBEILLE AVANT items=2521, APRES items=2521
Lecture      : le dossier de build n'a qu'un relevé d'existence, d'enfants et de date (pas de MD5 de dossier) ;
               code 0 du pilote = pilote fini, pas verdict
Trace : Docs\Migration\etat\AG\TRACE1\TRACE1-T4b-essai-supplement.txt — Fiche TRACE1-T4b — 2026-10-13 08:32
Commande     : pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\Corbeille.ps1" -Liste "…\TRACE1-T4b-cas7-supplement.txt" (sans -Envoyer)
Environnement: idem
Attendu      : chemin-relatif ; jonction (+ hors-racines, + suivi-git dans le dépôt LifePlay-Sandbox) ; doublon ; code 2
Obtenu       : REFUS chemin-relatif, jonction, hors-racines, suivi-git, doublon ; refuses=3 ; code=2 ; ETAT IDENTIQUE=True ;
               CORBEILLE 2521 → 2521
Lecture      : suivi-git de la jonction vient du dépôt de l'addon 5.5 (git -C D:\Game\LifePlay-Sandbox ls-files rend le fichier)