LifePlay-Revival/Docs/Migration/etat/OB/OBB/OBB-T3-IMPL.md

205 lines
20 KiB
Markdown
Raw Normal View History

Fiche OBB-T3 — Niveau N2 — Modèle prévu modèle de l'agent lp-impl | utilisé Opus 5.5 (claude-opus-5-5) — Agent lp-impl — Skills sk-protocol, ue-cpp-build, lp-build, lp-ue-compat (préchargés), sk-windows-shell (invoqué), lp-doc (gabarits.md lu)
# OBB-T3-IMPL : contrôle de paquet `Tools\CheckPackage.ps1` (B3 / G-OB-7), branché sur `BuildDebug.ps1` et `SplitModules.ps1` (2026-10-10)
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8`, HEAD `b63196a` (= tag `OBB-avant`). Départ : `git status --short -- Tools`
vide (pas d'arrêt). Rien lancé hors `CheckPackage.ps1` et l'analyse syntaxique (ni UE, ni UAT, ni UBT, ni `BuildDebug.ps1`,
ni `SplitModules.ps1`). Sorties brutes : scratchpad
`%USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-8\0b6366db-34d6-4803-8aee-2e309785cb38\scratchpad\obb-t3\`
(abrégé `SCR\`, un `.txt` par essai).
## 1. Fichiers modifiés (chemins, lignes)
- `D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1` : **neuf**, 228 lignes après la reprise (211 à la tentative 1), ASCII (0 octet non ASCII), fins de ligne LF
(comme `SplitModules.ps1`, `Build.ps1`, `Engine.ps1`). Paramètres `-Build` (obligatoire), `-Config Shipping|Development|DebugGame`
(absent : déduit de l'exe présent sous `Windows\LifePlay\Binaries\Win64`), `-ProjectRoot` (défaut : parent de `Tools`).
Contrôles :
- [1] `Windows\Manifest_NonUFSFiles_Win64.txt`, lecture par `[IO.File]::ReadLines`, motif
`(^|[\\/])Modules[\\/]\.git([\\/]|\s|$)` insensible à la casse (entrée exacte `Modules/.git` = `.git` fichier, ou
préfixe `Modules/.git/` = dossier) ; plus le disque : `Get-Item -LiteralPath <win>\LifePlay\Content\Modules\.git -Force`
(dossier ou fichier). Le compte affiché est celui du manifeste ; la présence sur disque est ajoutée en ligne fautive.
- [2] `Windows\Manifest_UFSFiles_Win64.txt` : lignes contenant `LPSandbox`.
- [3] `<ProjectRoot>\Intermediate\Build\Win64\x64\LifePlay\<Config>\<exe>.rsp` : lignes contenant `LPAnimMeasure`.
- [4] `<ProjectRoot>\Binaries\Win64\<exe sans .exe>.target` : entrées `"LPSandbox"` du seul tableau `"BuildPlugins"`.
- [3] et [4], **critère de rattachement (reprise, décision de l'orchestrateur, remplace le seuil de 2 h)** : le `.rsp` et
le `.target` ne valent pour le build contrôlé que si (a) l'exe du projet `<ProjectRoot>\Binaries\Win64\<exe>` a **la
même taille** que l'exe archivé `<Build>\Windows\LifePlay\Binaries\Win64\<exe>`, (b) **la même date** à 2 s près
(`$MaxExeGapSeconds = 2`), et (c) le fichier n'est **pas postérieur à l'exe du projet de plus de 10 min**
(`$MaxAfterExeMinutes = 10`). Sinon, ou fichier absent, ou exe absent : NON-CONCLUANT avec le motif (taille ou date
des deux exe citées). Fonction `Get-StaleReason` ; l'en-tête de sortie affiche les deux exe (chemin, date, taille).
La mise en scène garde la date de liaison (`Shipping_U8` : exe 17:56:48, dossier 18:12) ; le compte lu d'un fichier
non rattaché est affiché « non retenu ».
- Sortie : `[n] PASS|FAIL|NON-CONCLUANT <compte> <fichier>` puis 3 lignes fautives au plus (`numéro: texte`) ; ligne
finale `Resultat : … (code n)`. Codes : 0 = 4 PASS, 1 = un FAIL, 2 = NON-CONCLUANT sans FAIL, 3 = contrôle impossible.
- Noms par configuration, **lus sur le disque** (point (b) de la fiche) :
| Config | exe archivé (`Binaries\Win64`) | `.rsp` | `.target` | Lu sur |
|---|---|---|---|---|
| Shipping | `LifePlay-Win64-Shipping.exe` | `Shipping\LifePlay-Win64-Shipping.exe.rsp` | `LifePlay-Win64-Shipping.target` | `Shipping_U8`, projet 5.8 et 5.5 |
| Development | `LifePlay.exe` | `Development\LifePlay.exe.rsp` | `LifePlay.target` | `5.5_DC4`, `5.5_Development`, `5.8_STC_Development`, projet 5.8 et 5.5 |
| DebugGame | `LifePlay-Win64-DebugGame.exe` | `DebugGame\LifePlay-Win64-DebugGame.exe.rsp` | `LifePlay-Win64-DebugGame.target` | `5.5_DebugGame`, projet 5.5 (aucun DebugGame dans le projet 5.8) |
- `D:\Game\LifePlay-master 5.8\Tools\BuildDebug.ps1` : lignes 89-94 ajoutées (après `Write-Host "pdb copies=…"`, l. 88,
avant `Write-Host "archive=…"`) ; CRLF gardé (CR = LF = 96, contre 90 avant).
- `D:\Game\LifePlay-master 5.8\Tools\SplitModules.ps1` : lignes 39-45 ajoutées (après le contrôle du dossier des modules,
l. 37, avant `$assetMods`) ; LF gardé (CR = 0, LF = 167, contre 160 avant).
Diff complet (`git diff -- Tools`, 2 fichiers, 13 insertions, 0 suppression ; `CheckPackage.ps1` non suivi) :
```diff
--- a/Tools/BuildDebug.ps1
+++ b/Tools/BuildDebug.ps1
@@ -86,5 +86,11 @@ if (Test-Path $pdbSrc) {
}
}
Write-Host "pdb copies=$copied -> $bin"
+
+# Controle du paquet (B3 / G-OB-7) : .git des modules, addon LPSandbox (pak, .rsp, .target). Un build Development ou
+# DebugGame est aussi interdit d'addon depuis CHG-279 : tout code != 0 (FAIL, NON-CONCLUANT, erreur) arrete le script.
+& (Join-Path $PSScriptRoot 'CheckPackage.ps1') -Build $ArchiveDir -Config $Config -ProjectRoot $ProjectRoot
+$check = $LASTEXITCODE
+if ($check -ne 0) { exit $check }
Write-Host "archive=$ArchiveDir exe=$exe"
exit 0
--- a/Tools/SplitModules.ps1
+++ b/Tools/SplitModules.ps1
@@ -36,6 +36,13 @@ $cfg = Get-Content $Config -Raw | ConvertFrom-Json
$modules = Join-Path $Build 'Windows\LifePlay\Content\Modules'
if (-not (Test-Path $modules)) { throw "Dossier des modules introuvable : $modules" }
+# Controle du paquet (B3 / G-OB-7) avant tout deplacement : FAIL (code 1) ou controle impossible (3) = refus.
+# NON-CONCLUANT (2) : .rsp / .target du projet reecrits depuis ce build, signale sans bloquer.
+& (Join-Path $PSScriptRoot 'CheckPackage.ps1') -Build $Build
+$check = $LASTEXITCODE
+if ($check -eq 2) { Write-Warning 'CheckPackage : controle(s) NON-CONCLUANT(S) (voir ci-dessus), publication poursuivie' }
+elseif ($check -ne 0) { throw "CheckPackage en echec (code $check) : build refuse pour la publication" }
+
# Un build de distribution ne contient aucun mod d'assets installe (sa partie texte serait livree sans ses paquets) :
```
**Reprise (critère de rattachement), rejouée** (sorties `SCR\r2_*.txt`, même commande) :
| Essai | exe archivé | exe du projet | [1] | [2] | [3] / [4] | Code |
|---|---|---|---|---|---|---|
| `r2_shipping_u8` (`-Config Shipping`) | 164 823 552 o, 2026-10-09 17:56:48 | `…5.8\Binaries\Win64\LifePlay-Win64-Shipping.exe` 164 823 552 o, 20:08:50 | **FAIL 142** | **FAIL 1** | NON-CONCLUANT : « exe du projet d'une autre date : 2026-10-09 20:08:50 contre 2026-10-09 17:56:48 archive (meme taille 164823552 o) : relie depuis » ; compte lu 0, non retenu | 1 |
| `r2_dc4_p55` (`-ProjectRoot …5.5`) | 291 694 592 o, 2026-10-07 20:13:28 | `…5.5\Binaries\Win64\LifePlay.exe` 291 694 592 o, 20:13:28 | **PASS 0** | **PASS 0** | PASS 0 / PASS 0 | **0** |
| `r2_dc4` (projet 5.8 par défaut) | idem | `…5.8\…\LifePlay.exe` 330 207 744 o, 2026-10-10 09:57:34 | PASS 0 | PASS 0 | NON-CONCLUANT : « exe du projet d'une autre taille : 330207744 o (2026-10-10 09:57:34) contre 291694592 o archive : autre build » | 2 |
| `r2_stc_dev` | 330 207 744 o, 2026-10-10 09:57:34 | identique | FAIL 142 | PASS 0 | PASS 0 / PASS 0 | 1 |
| `r2_ap7_p55` (`-ProjectRoot …5.5`) | 141 238 784 o, 2026-10-07 02:26:56 | identique | PASS 0 | FAIL 2 | FAIL 1 (l. 619) / FAIL 1 (l. 3707) | 1 |
| `r2_dbg55_p55` (`-ProjectRoot …5.5`) | 291 868 672 o, 2026-10-04 12:41:24 | identique | PASS 0 | PASS 0 | PASS 0 / PASS 0 | 0 |
Relevé de l'orchestrateur confirmé (exe Shipping 5.8 et U8 : même taille, dates 20:08:50 / 17:56:48). Analyse syntaxique
après reprise : `CheckPackage.ps1 errors=0`, `BuildDebug.ps1 errors=0`, `SplitModules.ps1 errors=0`. `CheckPackage.ps1` :
CR = 0, LF = 228, 0 octet non ASCII, 0 occurrence de `MaxGapHours`. `git diff --stat -- Tools` inchangé (2 fichiers, +13).
Contrôles de la tentative 1 (seuil de 2 h, remplacé ; gardés pour trace), pwsh 7.6.6, `pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1" …` :
| Essai (`SCR\`) | Arguments | [1] | [2] | [3] | [4] | Code |
|---|---|---|---|---|---|---|
| `shipping_u8.txt` (**preuve par l'échec**) | `-Build D:\Game\LifePlay_Build_5.8_Shipping_U8 -Config Shipping` | **FAIL 142** (+ disque : dossier présent) | **FAIL 1** (`958: RemappedPlugins/LPSandbox/LPSandbox.uplugin`) | NON-CONCLUANT (écart 2,20 h : `.rsp` 2026-10-09 20:08:32, exe 17:56:48 ; compte lu 0) | NON-CONCLUANT (écart 2,20 h : `.target` 20:08:52 ; compte lu 0) | 1 |
| `dc4.txt` (**témoin**) | `-Build D:\Game\LifePlay_Build_5.5_DC4` (Development déduit) | **PASS 0** | **PASS 0** | NON-CONCLUANT (`.rsp` 5.8 du 2026-10-10 09:56:57, écart 61,72 h) | NON-CONCLUANT (écart 61,74 h) | 2 |
| `dc4_p55.txt` (témoin, projet d'origine) | `… DC4 -ProjectRoot 'D:\Game\LifePlay-master 5.5'` | PASS 0 | PASS 0 | PASS 0 | PASS 0 | 0 |
| `ap7_p55.txt` (témoin positif de [2]-[4]) | `-Build D:\Game\LifePlay_Build_5.5_Shipping_AP7 -ProjectRoot '…5.5'` | PASS 0 | FAIL 2 (`851: RemappedPlugins/LPSandbox/LPSandbox.uplugin`, `1547: LifePlay/Config/LPSandbox.ini`) | FAIL 1 (`619: …\LPAnimMeasure\Module.LPAnimMeasure.cpp.obj`) | FAIL 1 (`3707: "LPSandbox",`) | 1 |
| `stc_dev.txt` | `-Build D:\Game\LifePlay_Build_5.8_STC_Development` | FAIL 142 | PASS 0 | PASS 0 | PASS 0 | 1 |
| `dbg55_p55.txt` (noms DebugGame) | `-Build D:\Game\LifePlay_Build_5.5_DebugGame -ProjectRoot '…5.5'` | PASS 0 | PASS 0 | PASS 0 | PASS 0 | 0 |
| `absent.txt` | `-Build D:\Game\LifePlay_Build_inexistant` | — | — | — | — | 3 (« controle impossible : Impossible de trouver le chemin d'accès… ») |
- Les 0 du témoin DC4 ne sont pas un échec de méthode : chaque contrôle a rendu un FAIL ailleurs ([1] 142 sur U8 et STC ;
[2], [3], [4] sur AP7) ; le manifeste NonUFS de DC4 compte 2 053 lignes `^LifePlay/Content/Modules/` (Grep, count) et le
`.rsp` Development 5.5 cite `LPAnimCore` (1, Grep count) : fichiers lus et pertinents.
- Mécanisme des branchements (sans lancer les deux scripts) : `pwsh -NoProfile -Command '$ErrorActionPreference="Stop";
& "…\Tools\CheckPackage.ps1" -Build "…Shipping_U8" *> $null; "LASTEXITCODE=$LASTEXITCODE"; & … DC4 -ProjectRoot …5.5'`
→ `LASTEXITCODE=1 (appelant toujours vivant)` puis `LASTEXITCODE=0` : `exit n` du script appelé par `&` renseigne
`$LASTEXITCODE` sans fermer l'appelant [ét.].
- Analyse syntaxique : `[System.Management.Automation.Language.Parser]::ParseFile(<fichier>,[ref]$t,[ref]$e)` →
`CheckPackage.ps1 errors=0`, `BuildDebug.ps1 errors=0`, `SplitModules.ps1 errors=0` (versions HEAD : 0 et 0). Un premier
essai lancé depuis Git Bash avait affiché 1 pour les trois fichiers : guillemets de `$e` mangés par bash (artefact de la
commande, refait en `pwsh -Command '…'` à guillemets simples).
## 2. Écarts à la SPEC (obligatoire)
1. **Code 3** (contrôle impossible : build introuvable, configuration non déduite, erreur de lecture) ajouté aux codes
0/1/2 de la fiche, pour ne pas confondre une erreur avec un FAIL (une exception non rattrapée rendrait 1 sous `pwsh -File`).
2. **`SplitModules.ps1` : le code 3 refuse aussi (`throw`)**, pas seulement le FAIL : un contrôle qui n'a pas pu tourner ne
doit pas laisser passer une publication. NON-CONCLUANT (2) : `Write-Warning`, la publication continue (la fiche ne
demande le `throw` que pour FAIL). À trancher par l'orchestrateur (Constats 2).
3. **`BuildDebug.ps1`** : tout code ≠ 0 sort avec ce code, comme demandé ; cela inclut NON-CONCLUANT (2) et 3.
4. Repli `WindowsNoEditor` si `<Build>\Windows` manque (même repli que `BuildDebug.ps1:64-66`) ; sans effet sur les builds 5.x.
5. Compte de [1] = lignes du manifeste seulement (142 attendu) ; le `.git` sur disque est une ligne fautive en plus et
suffit à rendre FAIL. Manifeste absent et `.git` absent du disque : NON-CONCLUANT.
6. Compte `-` (au lieu d'un nombre) quand le fichier n'est pas lu ou que sa lecture n'est pas retenue (NON-CONCLUANT).
7. [2] cherche `LPSandbox` dans toute la ligne (comme la fiche) : sur AP7 il relève aussi `LifePlay/Config/LPSandbox.ini`.
Décisions de l'orchestrateur à la reprise : écarts 1 (code 3), 2 (`SplitModules` : 2 = avertissement, 1 et 3 = refus) et 4
(repli `WindowsNoEditor`) **acceptés**. Seuil de 2 h **remplacé** par le critère de rattachement du § 1 (taille et date de
l'exe du projet, `.rsp` / `.target` au plus 10 min après) : appliqué tel que demandé, sans autre écart.
## 3. Instantané (lot, manifeste)
Pris par l'orchestrateur avant l'envoi : `D:\Game\LifePlay_Backup_5.5\OBB\manifest.csv`. Concordance relevée au départ :
`md5sum Tools/BuildDebug.ps1 Tools/SplitModules.ps1` → `ffe1bc2f8007240bc841af3fc0adda25`, `1c42108efb53d3e04d20ffed0f0427b5`
(= FFE1BC2F…, 1C42108E… de la fiche). Après : `d01647ac47f1cf2bf284e84964cbedcc`, `43ae1bf6fc1cf891b41724fc0e53b4ac` ;
`CheckPackage.ps1` neuf `7173f917718c206dd6750064ac1a224f` après la reprise (`ed1f478e…` à la tentative 1). Retour arrière : `Tools\Restore.ps1 -Lot OBB` (proposé seulement)
et retrait de `Tools\CheckPackage.ps1` (déplacer vers la sauvegarde, ne pas supprimer).
## 4. Ce qui n'a pas été fait
- `BuildDebug.ps1` et `SplitModules.ps1` ne sont **pas exécutés** (interdit : UAT, déplacements) ; leur branchement n'est
prouvé que par l'analyse syntaxique, le diff et l'essai du mécanisme `&` / `$LASTEXITCODE` (§ 1).
- [3]/[4] concluants sur `Shipping_U8` : impossibles, le `.rsp` et le `.target` Shipping du projet 5.8 ont été réécrits à
20:08 le 2026-10-09 (build du correctif CHG-279, estimé d'après `OBB-T6-INV.md:110` et la date du commit `67d3e68` 20:12) ;
l'exe Shipping du projet date aussi de 20:08:50, contre 17:56:48 dans l'archive. L'attendu « (3) ≥ 1, (4) présent »
(`OBA-T5-EVAL.md:98`) n'est donc pas rejouable sur U8 ; il est rejoué sur AP7 5.5 (FAIL 1 et FAIL 1).
- Règle (c) du rattachement (`.rsp` / `.target` postérieur de plus de 10 min à l'exe du projet) : **non exercée** par un
cas réel ; aucun build existant ne la déclenche et la provoquer demanderait de toucher aux dates des fichiers du projet
(interdit). Seules (a) taille (DC4 contre projet 5.8) et (b) date (U8 contre projet 5.8) ont rendu NON-CONCLUANT.
- Aucun build DebugGame 5.8 n'existe : les noms DebugGame sont ceux de la copie 5.5 (même cible `LifePlay`, mêmes règles
de nommage d'UBT : estimé).
- Aucun skill ni doc modifié ; texte proposé pour la fiche DOC (consigne des fiches qui lancent UAT directement) en Constats 4.
## 5. Points à confirmer en VAL
- `pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1" -Build D:\Game\LifePlay_Build_5.8_Shipping_U8 -Config Shipping` → `[1] FAIL 142`, `[2] FAIL 1`, `[3]`/`[4]` NON-CONCLUANT avec le motif « exe du projet d'une autre date : 2026-10-09 20:08:50 contre 2026-10-09 17:56:48 archive (meme taille 164823552 o) », code 1.
- `pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1" -Build D:\Game\LifePlay_Build_5.5_DC4 -ProjectRoot 'D:\Game\LifePlay-master 5.5'` → 4 PASS, code 0 (sans `-ProjectRoot` : `[1]`/`[2]` PASS, `[3]`/`[4]` NON-CONCLUANT motif « autre taille : 330207744 o … contre 291694592 o », code 2).
- Règle (c) des 10 min : relue dans `Get-StaleReason` (non exercée par un cas réel, § 4).
- `pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1" -Build D:\Game\LifePlay_Build_5.5_Shipping_AP7 -ProjectRoot 'D:\Game\LifePlay-master 5.5'` → [2], [3], [4] FAIL (détection positive de chaque contrôle).
- `ParseFile` = 0 erreur pour `Tools\CheckPackage.ps1`, `Tools\BuildDebug.ps1`, `Tools\SplitModules.ps1`.
- `git diff --stat -- Tools` = 2 fichiers, 13 insertions ; `git status --short -- Tools` = ces 2 `M` + `?? Tools/CheckPackage.ps1`, rien d'autre.
- Fins de ligne : `BuildDebug.ps1` CRLF (CR = LF = 96), `SplitModules.ps1` LF (CR = 0), `CheckPackage.ps1` LF, ASCII.
- Aucune écriture dans les dossiers de build, `Intermediate`, `Binaries` : dates des fichiers lus inchangées (`.rsp` Shipping 5.8 2026-10-09 20:08:32, `LifePlay.target` 5.8 2026-10-10 09:57:35).
- Écarts 1, 2 et 4 du § 2 : acceptés par l'orchestrateur à la reprise ; vérifier que le code relu leur correspond (`exit 3` dans le `catch`, `Write-Warning` sur 2 et `throw` sur 1 / 3 dans `SplitModules.ps1`).
- Premier vrai passage par `BuildDebug.ps1` (prochain build, file du Big Boss) : 4 PASS attendus pour [2]-[4] ; [1] FAIL tant que P1 (sortie du `.git` de `Content\Modules`) n'est pas appliqué, donc **`BuildDebug.ps1` sortira en code 1 après l'archivage** jusque-là (Constats 1).
## 6. Fichiers à commiter
Dépôt du jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8` :
- `A Tools/CheckPackage.ps1`
- `M Tools/BuildDebug.ps1`
- `M Tools/SplitModules.ps1`
- `A Docs/Migration/etat/OB/OBB/OBB-T3-IMPL.md` (ce livrable)
Tours : 14 / 40 (tentative 1) ; reprise courte : 6 / 12
## Constats
1. **Conséquence immédiate à connaître** : tant que `Content\Modules\.git` existe dans la copie 5.8 (P1 de
`OBA-T23-PROJ-CART.md:133` non appliqué), tout build mis en scène le contient ([1] FAIL 142 sur `STC_Development`,
build du 2026-10-10). `BuildDebug.ps1` archivera donc le build puis sortira en code 1 (les `.bat` et PDB sont déjà
copiés, l'archive reste sur le disque). C'est le comportement voulu par la fiche ; à rappeler aux fiches BUILD qui
l'utilisent avant P1.
2. **Seuil de 2 h remplacé (reprise)**. Tentative 1 : sur `Shipping_U8`, l'écart n'était que de 2,20 h ; un seuil de 3 h
aurait lu le `.rsp` du build suivant (correctif CHG-279, compte 0) comme celui d'U8 (faux PASS), et une recompilation
faite moins de 2 h après un empaquetage aurait été prise pour le build contrôlé. Appliqué à la demande de l'orchestrateur :
l'exe du projet doit avoir la même taille et la même date (≤ 2 s) que l'exe archivé, et le `.rsp` / `.target` ne pas lui
être postérieur de plus de 10 min. Résultat : U8 reste NON-CONCLUANT pour le bon motif (même taille 164 823 552 o, exe
relié à 20:08:50, preuve qu'un relink sans changement de taille est bien vu) ; DC4 contre projet 5.5 devient concluant
(4 PASS) ; DC4 contre projet 5.8 est refusé sur la taille. Limite restante [est.] : deux liaisons du même code à moins
de 2 s d'écart et de même taille ne se distinguent pas (cas improbable : la date d'une liaison UBT est celle de l'exe
écrit, une nouvelle liaison la change) ; un `.rsp` réécrit sans relink (action annulée avant la liaison) dans les 10 min
suivant l'exe passerait aussi.
3. NON-CONCLUANT dans `SplitModules.ps1` : non bloquant ici (fiche : seul FAIL bloque). Pour une publication, [3]/[4] seront
souvent non concluants (le projet est recompilé après l'empaquetage). Décision proposée à l'orchestrateur : bloquer aussi
sur 2 en publication, ou garder le `.rsp`/`.target` dans l'archive au moment de `BuildDebug.ps1` (copie dans un sous-dossier
de l'archive, contrôlée ensuite par `CheckPackage.ps1`) ; les deux sont hors fiche.
4. **Texte prêt pour la fiche DOC** (consigne des fiches qui lancent UAT directement, skill `lp-build` § 4, non modifié ici) :
« Tout empaquetage lancé par UAT hors `Tools\BuildDebug.ps1` (cas U8) est suivi, aussitôt après l'archivage et avant
tout autre build, de `pwsh -NoProfile -File "<copie>\Tools\CheckPackage.ps1" -Build <dossier d'archive> -Config <cfg>`
(lecture seule). Code 0 = 4 PASS ; 1 = FAIL : build refusé pour la publication et pour la VAL de publication ; 2 =
NON-CONCLUANT : `.rsp` / `.target` du projet réécrits depuis ce build, relancer le contrôle avant toute recompilation ;
3 = contrôle impossible. Le compte rendu BUILD recopie les 4 lignes `[n]` et le code. »
5. [1] ne couvre que `Modules/.git` (racine du dépôt des modules), comme la fiche ; un `.git` d'un sous-module
(`Modules/<module>/.git`) ne serait pas relevé. Extension possible : motif `(^|/)\.git(/|$)` sur tout le manifeste NonUFS.
6. Fichiers hors périmètre vus dans `git status --short` en fin de session (autres sessions, non touchés) :
`M Docs/Migration/etat/ST/STE/STE-TACHES.md`, `?? Docs/Migration/etat/OB/OBB/OBB-T1-SPEC.md`, `?? …/OBB-T1a-INV.md`,
`?? Docs/Migration/etat/ST/STE/STE-D-INV.md` (absents du statut initial de la session).