5.7 KiB
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 :
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.
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
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 :
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.