# TRAIL DPS Workspace SAS — maintenance 1.0.6-lot1

## Préparation du backend avant le LOT 2 PLACE

**Date :** 30 juillet 2026  
**Base :** 1.0.5-lot1 validée par le procès-verbal LOT 1  
**Nature :** maintenance additive sans changement d'API, de schéma MySQL ou de comportement métier

## 1. Objectifs

Cette maintenance ferme les réserves de packaging et de stockage relevées lors de la passation vers le LOT 2 :

- fournir un exemple de configuration sans secret ;
- empêcher les futurs packages de réembarquer la configuration réelle et les données d'exploitation ;
- contrôler la réserve disque minimale de 20 % ;
- détecter les fichiers privés sans référence SQL ;
- permettre une mise en quarantaine non destructive ;
- actualiser la preuve automatique de 10/10 à 11/11 tests après ajout du nouveau contrôle.

## 2. Fichiers nouveaux

- `.gitignore`
- `config/config.example.php`
- `SRC/Files/OrphanFileScanner.php`
- `scripts/scan_orphan_files.php`
- `docs/LOT_2_1_WORKSPACE_PREFLIGHT_1.0.6_2026_07_30.md`
- `docs/MANIFEST_LOT_2_1_WORKSPACE_PREFLIGHT_1.0.6_SHA256.txt`

## 3. Fichiers modifiés

- `VERSION`
- `README.md`
- `scripts/verify_installation.php`
- `tests/run.php`
- `docs/DEPLOIEMENT_RECETTE.md`
- `docs/LOT_1_WORKSPACE_SAS_V1_0_2026_07_21.md`
- `docs/PREUVES_AUTOMATIQUES_LOT_1.md`
- `docs/SECURITE_EXPLOITATION.md`
- `docs/TESTS_RECETTE_LOT_1.md`
- `MANIFEST_SHA256.txt`

## 4. Scanner de stockage privé

Commande de diagnostic :

```bash
php scripts/scan_orphan_files.php --json
```

Le rapport distingue :

- `orphans` : fichier physique sans aucune ligne `shared_files` ;
- `unexpected_purged_files` : fichier encore présent alors que la ligne SQL est purgée ou supprimée ;
- `missing_expected_files` : ligne ACTIVE/TRASHED dont le binaire attendu est absent.

Mise en quarantaine des seuls orphelins :

```bash
php scripts/scan_orphan_files.php --quarantine --json
```

Ajout des fichiers marqués purgés à la quarantaine :

```bash
php scripts/scan_orphan_files.php --quarantine --quarantine-purged --json
```

Aucune suppression définitive n'est exécutée. L'arborescence est conservée sous :

```text
storage/quarantine/orphan-files/<batch_id>/
```

Un `scan_manifest.json` est écrit dans le lot de quarantaine.

## 5. Configuration réelle à conserver hors ZIP

Le ZIP incrémentiel ne contient pas `config/config.php`. Le serveur doit conserver son fichier réel existant.

Une intervention manuelle reste nécessaire pour porter :

```php
'min_free_ratio' => 0.20,
```

Le nouveau `verify_installation.php` échoue tant que cette valeur est inférieure à 20 %.

## 6. Tests exécutés

- lint PHP sur tous les fichiers PHP du projet : **OK** ;
- `php tests/run.php` : **11/11 tests réussis** ;
- test du scanner avec fichier référencé, fichier orphelin, fichier purgé encore présent et référence active sans fichier : **OK** ;
- déplacement contrôlé d'un orphelin vers la quarantaine : **OK**.

## 7. Non-régression

Aucune modification n'est apportée :

- aux 32 routes API ;
- à la migration `001_workspace_schema.sql` ;
- aux tables et données MySQL ;
- aux règles d'authentification, de révision, de photo ou d'idempotence ;
- à PLACE, Licence, Tracking ou TrailDpsTracker dans ce ZIP Workspace.
