14 KiB
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-dirhors 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:.gitle 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.csvdeBackup_5.5, profondeur 3, et<dossier du manifest>\<Rel>). - l. 230-245
Get-Corbeille:Win32_Volume(lettre → GUID) puisHKCU:\…\BitBucket\Volume\{guid}MaxCapacity(Mo),NukeOnDelete. - l. 247-271 : lecture de la liste (variables développées,
#ignoré, TSV à colonneChemin), 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. 426DeleteDirectory($cible, 'OnlyErrorDialogs', 'SendToRecycleBin'), l. 428DeleteFile($cible, 'OnlyErrorDialogs', 'SendToRecycleBin'), arrêt au premier échec, contrôleTest-PathpuisTest-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) : dansFileSystem.vb(dotnet/runtime),DeleteFile/DeleteDirectoryne passent par le shell (donc par la corbeille) que sishowUI <> NoUI AndAlso Environment.UserInteractive; sinonIO.File.Delete/IO.Directory.Delete, effacement définitif. Le script refuse donc si[Environment]::UserInteractiveest faux (vrai dans cette session :UserInteractive=True,TRACE1-T4b-essai.txtl. 2). - E2
lecture-seule:FileSystem.vb, commentaire des drapeauxOnlyErrorDialogs(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-racinesse teste sur le chemin écrit et sur le chemin réel ;profil-claudeaussi. - E4
dossier-non-plantage: la SPEC réserveDeleteDirectoryau « dossier de plantage » ; le script refuse tout dossier dont le parent ne s'appelle pasCrashes. - 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 unmanifest.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 ligneA-BLANC <octets> <chemin>par ligne admise puisA 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 colonneChemin(sortie deTraces.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 =.gitle 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 (sinonGetFullPathla rendrait relative au dossier courant). - E11 « décrite par un manifest.csv » = le
manifest.csvlui-même et les copies<dossier du manifest>\<Rel>deBackup_5.5(instantanés, Q6) ; tout fichier nommémanifest.csvsousBackup_5.5est 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 ligneENVOYEne 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 dossierCrashes\<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.ps1l. 79-104 identiques à celles deTools\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 à 5REFUS <motif attendu>etcode=2, cas 6code=0, liste témoinrefuses=5code=2,ETAT IDENTIQUE=True,CORBEILLE AVANT=APRES. - Critère 6 : 0 ligne pour
Remove-Item,rm,del,Delete(; seuls appels l. 426 et 428, avecSendToRecycleBin;-Forceseulement 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, commeNumero.ps1etUeState.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]::UserInteractivevrai (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
DeleteFilepour un fichier plus gros que la corbeille avecFOF_NOCONFIRMATION(question ou effacement définitif) : non vérifié ; le refustrop-grosl'é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)