115 lines
5.7 KiB
Markdown
115 lines
5.7 KiB
Markdown
# Session Restore V2
|
||
|
||
La recette réelle du 7 octobre 2026 a réussi : logout, checkpoint V2, arrêt par
|
||
UWSM, login, chooser unique et un clic **Restaurer**. Aucune interaction après
|
||
ce clic ; arbre, focus final et identité Firefox exacte vérifiés. La validation
|
||
visuelle utilisateur est PASS. Les preuves détaillées restent dans la branche
|
||
locale de recherche ; elles ne sont pas distribuées dans ce dépôt.
|
||
|
||
## Utilisation
|
||
|
||
Le menu power conserve Verrouiller, Suspendre, Déconnexion, Redémarrer et
|
||
Éteindre. Déconnexion sauvegarde un checkpoint V2 avant `uwsm stop` ; Redémarrer
|
||
et Éteindre sauvegardent avant leur action systemd. Un échec de checkpoint
|
||
permet d’annuler ou de choisir explicitement de quitter sans sauvegarder.
|
||
|
||
Au login suivant, le chooser propose Restaurer ou Nouvelle session. Un clic
|
||
Restaurer lance la transaction jusqu’au résultat final, sans étape Firefox
|
||
manuelle ni deuxième restauration. Le chooser est acquitté durablement ; un
|
||
redémarrage QuickShell dans la même session ne le réaffiche pas.
|
||
|
||
Le gestionnaire de sessions permet sauvegarde, liste, aperçu structurel,
|
||
suppression et restauration V2. L’aperçu ne modifie aucune fenêtre. Le backend
|
||
fournit aussi `show` pour inspecter une session. Les noms sont limités à 64
|
||
caractères ASCII alphanumériques, tirets et underscores, commençant par un
|
||
caractère alphanumérique. Ne pas publier les sessions ou rapports runtime.
|
||
|
||
## Installation reproductible
|
||
|
||
Prérequis : Python 3, Sway compatible, QuickShell/Qt 6, GTK3, compilateur C17,
|
||
`pkg-config`, autotiling, Kitty, Firefox et Limusic déjà configuré par l’autostart
|
||
Sway. Le catalogue est `session_v2/applications.py`. Limusic utilise
|
||
`strategy=managed-autostart`, `managed_by=sway-autostart` et aucun argv Labfy.
|
||
|
||
Depuis la racine du dépôt :
|
||
|
||
```sh
|
||
python3 -B tools/build-session-v2.py
|
||
install -Dm755 build/session-v2/labfy-v2-anchor \
|
||
quickshell/.config/quickshell/labfy-sway/session_v2/libexec/labfy-v2-anchor
|
||
```
|
||
|
||
Le build ne déploie ni extension ni préférence. Le helper compilé et les archives
|
||
restent ignorés par Git. Déployer le package Stow `quickshell` selon le guide
|
||
habituel, puis suivre [la documentation du companion Firefox](../firefox-extension/session-v2/README.md).
|
||
L’extension signée déjà installée n’a pas besoin d’être réinstallée pour ce nettoyage.
|
||
|
||
Versions de la recette : Firefox 157.0, SwayFX 0.6, QuickShell 0.3.1,
|
||
autotiling 1.9.4, Python 3.14.7, Qt Declarative 6.11.2 et GTK3 3.24.52.
|
||
|
||
## Architecture et invariants
|
||
|
||
`sessionui/SessionV2Service.qml` est l’unique propriétaire des commandes UI.
|
||
`Bar.qml` instancie `SessionStartupPromptV2` ; `shell.qml` désigne une seule barre
|
||
hôte. `ControlCenter.qml` utilise `SessionManagerV2` et `SessionExitGate` avec
|
||
le statut de checkpoint `saved`. Aucune surface active ne dépend du moteur V1.
|
||
|
||
Le backend capture applications, slots et structure ; il reconstruit par ancres
|
||
et swaps, puis vérifie arbre, absence d’ancres et focus final. Le guard possède
|
||
la suspension/reprise des helpers et leur récupération en cas d’interruption.
|
||
Les observations runtime ne sont pas des identités persistantes. Firefox garde
|
||
la propriété de ses fenêtres/onglets ; le companion fournit l’identité exacte.
|
||
Kitty restaure uniquement la fenêtre. Les échecs sont explicites ; aucune
|
||
approximation d’identité Firefox n’est substituée silencieusement.
|
||
|
||
Les checkpoints et sessions sont privés sous
|
||
`${XDG_STATE_HOME:-$HOME/.local/state}/labfy-sway/session-v2`. Les transactions,
|
||
locks, rapports et observations du provider restent sous `$XDG_RUNTIME_DIR`.
|
||
Les anciennes données utilisateur V1 sont conservées. `analyze-v1-migration`
|
||
est une analyse en lecture seule, sans conversion automatique ni moteur V1.
|
||
Les anciens documents V1 sont des références historiques non exécutables.
|
||
|
||
## Diagnostics et validation
|
||
|
||
```sh
|
||
python3 -B "$HOME/.config/quickshell/labfy-sway/session-v2.py" restore-status
|
||
qs ipc -c labfy-sway call sessionV2 status
|
||
systemctl --user is-active quickshell-labfy-sway.service
|
||
```
|
||
|
||
Le rapport de succès doit indiquer `status=success`, les deux vérifications
|
||
finales vraies, autant d’ancres nettoyées que créées et autant de helpers repris
|
||
que suspendus. Le diagnostic QuickShell doit retourner `backend=v2`, `busy=false`.
|
||
Le rapport backend contient des identités privées : ne pas le joindre brut à
|
||
un ticket public. Ne jamais relancer un restore pour simplement lire son statut.
|
||
|
||
Tests sur compositeur headless privé, sans logout ni accès au bureau utilisateur :
|
||
|
||
```sh
|
||
python3 -B -m unittest discover -s tests/session_v2 -p 'test_*.py'
|
||
python3 -B tests/session_v2/runtime.py
|
||
python3 -B tests/session_v2/failures.py
|
||
python3 -B tests/session_v2/crashes.py
|
||
python3 -B tests/session_v2/security.py
|
||
python3 -B tests/session_v2/phase3b_runtime.py
|
||
python3 -B tests/session_v2/phase3b_ui.py
|
||
QT_QPA_PLATFORM=offscreen /usr/lib/qt6/bin/qmltestrunner \
|
||
-input tests/session_v2/qml -o -,txt
|
||
```
|
||
|
||
Les tests Python nécessitent `jsonschema` ; les scénarios UI nécessitent QuickShell
|
||
et QtTest. Les résultats synthétiques restent sous `build/session-v2-tests`,
|
||
ou dans `LABFY_SESSION_V2_EVIDENCE`. Les fixtures ne lancent que leur propre
|
||
compositeur et leurs enfants TEST_ONLY. Le build helper C17 utilise
|
||
`-Wall -Wextra -Werror`. Les métadonnées QuickShell peuvent produire des
|
||
avertissements qmllint ; le chargement réel et les scénarios Qt complètent
|
||
le contrôle syntaxique, sans prétendre à zéro avertissement.
|
||
|
||
## Limites conservées
|
||
|
||
- Contenu et processus terminal non restaurés.
|
||
- Ratios exacts non restaurés.
|
||
- Fullscreen et scratchpad non pris en charge actuellement.
|
||
- Multi-output physique non validé.
|
||
- Provider Firefox candidat actuel pour le profil supporté ; plusieurs profils
|
||
simultanés ne sont pas pris en charge.
|