Quickshell : chantier de sécurité, fiabilité, sobriété mémoire et lisibilité issu de la revue #11
Labels
No labels
Agent/Autonomous OK
Agent/Demeter
Agent/Hermes
Agent/Human
Agent/Needs Review
Area/API
Area/Auth
Area/CLI
Area/Data
Area/Docs
Area/Infra
Area/UI
CI/Failing
CI/Flaky
CI/Green
CI/Needs Runner
CI/Needs Workflow
Compat/Backward Compatible
Compat/Breaking
Compat/Migration
Deploy/Ansible
Deploy/Blocked
Deploy/Homelab
Deploy/Needs Config
Deploy/Needs Secret
Deploy/Ready
Deploy/Rollback
Kind/Bug
Kind/Chore
Kind/Design
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Refactor
Kind/Security
Kind/Spike
Kind/Testing
Ops/Backup
Ops/Incident
Ops/Maintenance
Ops/Monitoring
Ops/Upgrade
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Priority
Someday
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Risk
Critical
Risk
High
Risk
Low
Risk
Medium
Security/Auth
Security/Disclosure
Security/Hardening
Security/Secret
Size
L
Size
M
Size
S
Size
XL
Size
XS
Stack/Ansible
Stack/Docker
Stack/Forgejo
Stack/Hermes
Stack/Node
Stack/Postgres
Stack/Python
Stack/Systemd
Status
Abandoned
Status
Blocked
Status
In Progress
Status
In Review
Status
Need More Info
Status
Ready
chantier-racine
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
mathieu/dotfiles#11
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Objectif et périmètre
Suivre les corrections et améliorations issues de la revue de
quickshell/au commit5e350a8, avec Quickshell 0.3.2 : sécurité, bornes de ressources, robustesse, efficacité et lisibilité.Au démarrage de la revue, les 18 suites existantes passaient. Des reproductions supplémentaires isolées ont confirmé les limites de rétention native, l’amplification des libellés d’actions, les incohérences de remplacement, une erreur de structure HA, un faux succès de bascule et un défaut d’arguments. Le changement de destinataire et les courses de partage/collage sont établis par le code avec leurs préconditions explicites ; aucun transfert indu personnel n’a été provoqué. Aucune fuite mémoire n’est démontrée.
Ce chantier ne demande ni nouveau framework, ni réécriture générale, ni changement des profils/services personnels. Les vérifications utilisent faux services, bus privés et données de démonstration ; toute validation réelle sensible doit rester explicitement autorisée.
Organisation
Les tickets enfants, leur ordre proposé et le filtre de chantier sont ajoutés ci-dessous après création. Les corrections prioritaires ne doivent pas attendre les refactorings esthétiques. Les optimisations exigent un avant/après mesuré, pas une promesse de gain.
Critères de clôture
chantier-racineet les liens historiques.Suivi et ordre de traitement proposé
Chantier terminé — racine #11. Le label dédié
chantier:quickshell-revue, rétabli pendant la reprise de validation, a été retiré après acceptation complète des treize tickets. Son ancien filtre actif n’est plus utilisé ;chantier-racine, le tableau et tous les liens historiques sont conservés. #6/#7/#8 restent des contextes externes.Dépendances et justification
Cet ordre priorise risque et fiabilité avant les gains à mesurer, puis la maintenance. Il ne constitue ni une autorisation de contrôle d’appareil/service réel ni un lancement automatique de l’implémentation.
Bilan final après validation du panneau complet
Les treize tickets #12 à #24 sont clos après corrections, tests, revues et validation complémentaire du panneau complet. Code intégré sur
main90f0cd8. Les 26 suites isolées passent au commit final ; chaque objet/fichier de l’arbre Quickshell distant correspond au checkout signé contrôlé. Aucun retour externe non traité n’a été trouvé.Décisions et limites : cache de partage privé/quota/nettoyage opportuniste24h et collage ciblé meilleure-effort approuvés par Mathieu (#18/#19). #21 supprime le polling de commandes mais ajoute17–19MioPSS résidente dans la fixture. #22 réduit le coût froid, avec coût chaud variable et~0,14s de première consultation128contrôles ; aucune fuite ni baisse globale de RAM n’est revendiquée. Après accord explicite de Mathieu, le vrai SystemPanel/PanelWindow/LayerShell et ses quatre pages inchangés ont été testés sur les deux sorties réelles du compositeur existant, avec services/données factices :18étapes de déplacement, focus/navigation, fermeture/réouverture et données absentes passent. Le test de5,48s est fermé, sorties/surfaces/focus restaurés, aucune action métier ; la configuration habituelle reste non rechargée. La précédente preuve HomePage/QtQuick seule avait été rejetée et n’a pas été considérée suffisante. #24 documente les diagnostics restants, dont3risques de layout inchangés, sans masquer les règles.
La session réelle et son checkout
5e350a8ne sont pas avancés/rechargés. Aucun vrai partage/collage/appareil HA, action de session ni release n’a été exécuté. Les rapports reproductibles et détails par ticket restent liés dans les commentaires ; les worktrees/branches intégrés sont retirés sans force après vérification de préservation.Démarrage de l’implémentation sous mandat explicite de Mathieu. Base distante vérifiée :
5e350a8. Baseline dans le worktree d’intégration : 18 suites passent, HOME/bus/audio isolés.Première vague — frontières d’écriture
Le chantier est multi-composants ; chaque lane ci-dessous possède un contrat indépendamment testable et son worktree. Pas de plusieurs écrivains dans un même checkout.
~/Projets/worktrees/dotfiles/pi/quickshell-notification-signals/quickshell-notification-signalsNotificationService.qmlet tests natifs cibléspi/quickshell-share-recipient/quickshell-share-recipientDesktopPage.qml, test QML/launcher dédié ; destinataire, pas encore staging de fichierpi/quickshell-ha-validation/quickshell-ha-validation.mjset ses tests, structures/erreurs de messagespi/quickshell-review/quickshell-review-integrationLe parent garde décisions, acceptation, intégration et publication. Aucun enfant ne pousse ni ne modifie le tracker. Les changements ne touchent pas le checkout actif lié à
~/.config/quickshellpendant le développement. La publication du code et son activation dans la session seront distinguées ; pas de vrai partage/collage, commande HA, verrouillage ou redémarrage de service sensible pour valider sans accord.Les étapes #13/#15 suivront le contrat notifications stabilisé ; les autres travaux indépendants continueront pendant les revues. Les refactorings généraux restent en fin de chaîne.
Première vague publiée et vérifiée : #12, #14, #16, #17 et #20 clos au commit e8ec9ad. 20 suites d’intégration passent ; revues indépendantes propres après correction du test temporel #12.
Les faux rejets de fin de run (« staged files » sur la seule ligne
## branche) ont été traités par reprise du même protocole avec vérification parent explicite de l’index/porcelain, signatures, tests et revue ; aucune modification du harness.Le checkout lié à la session n’a pas été avancé/rechargé. La suite porte sur #13/#15 ; l’investigation #18 s’appuie sur le code KDE Connect du tag installé
v26.08.2fourni par le parent, le rôle de recherche n’ayant pas ses outils web disponibles. Les durcissements et optimisations non encore validés restent ouverts.Deuxième vague (base publiée
e8ec9ad) :quickshell-notification-admission/pi/quickshell-notification-admissionquickshell-session-events/pi/quickshell-session-eventsquickshell-clipboard-contract/pi/quickshell-clipboard-contractLe partage #18 attend une décision de conservation temporaire ; le contexte source et les alternatives sont dans son ticket. Le parent garde intégration, publication et acceptation. Les worktrees #12/#14/#16 intégrés ont été retirés sans force après vérification des index, fichiers non suivis et commits préservés sur origin/main. Le checkout actif n’a pas changé.
#13 intégré et vérifié sur main
166c763: 6/13 tickets corrigés,21 suites passantes. Les détails de bornes, mesures et limites amont sont dans #13. Les revues #13 sont propres.Suite : même propriétaire du composant notifications pour #15, au worktree
quickshell-notification-admissionremis à la base publiée ; #22 reprend son propriétaire de tests au worktreequickshell-panel-lazy, baseline actualisée avec #13, pour optimisation minimale HomePage/LightControl/LightRow. Préparation #22 :9tests dont4 échecs attendus (instanciation inactive/repliée, pièce non choisie, focus caché),5 comportements normaux passent ; autorisation de production seulement maintenant après #13.#21 : le schéma v1 est accepté, la revue producteur demande un filtrage exact des chemins quand l’unité est absente. Correction séparée dans la lane producteur. Le parent possède le consommateur QML au worktree
quickshell-session-consumer, sans édition Python du producteur ; aucune intégration finale avant deux gates/revues. Le fil JSON est ASCII échappé (sous-ensemble UTF-8) pour permettre un cadrage QML borné sans buffer natif de ligne illimité. Les arbitrages #18/#19 restent en attente de Mathieu.#21 publié et vérifié sur
maina1e4e1d: 8/13 tickets clos, gate combiné23/23 suites privées, revues producteur/consommateur propres. Gain CPU/processus synthétique fort, mais +17–19Mio de PSS résidente : compromis explicite, pas optimisation mémoire. Détails reproductibles et limites dans #21. Les worktrees producteur/consommateur intégrés ont été retirés sans force après contrôle des fichiers/index/commits préservés.Mathieu a donné son accord réel pour #18 (cache privé, quota, nettoyage opportuniste24h) et #19 (collage ciblé meilleure-effort, sans atomicité). Le statut d’objectif est de nouveau running ; les checkpoints automatiques n’ont pas servi d’accord. Implémentations parallèles :
quickshell-share-staging/pi/quickshell-share-stagingpour le staging+bridge/tests ;quickshell-clipboard-contract/pi/quickshell-clipboard-contractpour l’invalidation passive+messages/tests, sans extraction#23 encore. Frontières de code distinctes ; le parent garde publication et acceptation.#22 n’est pas publié : essais60cycles confirment le gain froid mais une enveloppe chaude/pics plus hauts que l’ancien code malgré des objets libérés et un plateau observé. Nouvelle itération isolée
quickshell-panel-resident-room/pi/quickshell-panel-resident-room, basée sur la version revue conservéeaba35bd: comparer une conservation déclarative bornée à la dernière pièce consultée pour éviter les cycles de destruction/recréation. Pas de GC forcé ni cache de toutes les pièces. L’ancienne candidate reste préservée ; les tests structurels évolueront explicitement si cette stratégie gagne, pas pour masquer une régression.La session active reste sur son checkout initial, sans reload/activation ni essai réel d’appareil/presse-papiers.
10/13 tickets clos et intégrés, main
42bdfdd, gate parent25/25 suites privées, contenu distant/signatures vérifiés. #18 inclut le correctif d’ancêtres renommables trouvé en revue ; BLOCK retiré au head5ce5479. #19 inclut le contrôle positif de l’assertion anti-getter, revu sans constat restant. Les décisions de Mathieu et limites exactes sont inscrites dans ces deux tickets ; worktrees/branches intégrés retirés sans force après vérification. La session active n’a pas été avancée.#23 : extraction mécanique5886639 terminée,21 tests natifs +24 suites au head de branche, revue indépendante propre. Gate parent combiné restant avant publication ; différé pendant les mesures#22 pour ne pas contaminer leurs conditions.
#22 : A(destruction totale) etB(dernière pièce seule) restent non publiées. Comparaison équitable deB/ancien sur2×128lampes : gain froid~63Mio RSS, mais +32,46Mio RSS après60changements de pièce. Ce n’est pas acceptable comme gain mémoire général. EssaiC ciblé : chargement à première consultation, puis conservation des corps consultés avec flags d’identifiants prunés par l’inventaire (au plus l’inventaire eager original), dépendances live/activité coupées si masqués.13 tests fonctionnels privés passent ; mesures appariées sur une pièce et changements entre deux pièces sont en cours, sans tests concurrents/GC forcé. Acceptation/revue non acquises.
#24 attend la stabilisation22/23 : renommages QML et tri documenté des diagnostics seulement, pas de réécriture. Aucun nouveau choix produit, release, vrai partage/collage/appareil ni activation n’est entrepris.
12/13 tickets enfants intégrés et clos, main
d5f3472, gate parent26/26 suites privées. #22 final6f52da2 revu, scénarios de métadonnées/préselection corrigés, mesures finales publiées avec leurs coûts : gain à froid25–64MioRSS, empreinte chaude mixte/surcoût résiduel, première consultation128contrôles142ms contre13ms déjà préchargés. Décision technique documentée : optimisation à froid seulement, pas fuite corrigée ni RAM globalement plus basse.Deux vrais QScreen virtuels natifs et même QQuickWindow A/B/A, fermeture/réouverture hors-ligne, inventaire absent/restauré et focus vérifiés sans commande ; limites physiques/compositeur/LayerShell/SystemPanel explicitement non revendiquées. Source primaire active inchangée5e350a8. Worktrees A/C intégrés retirés sans force après contrôle de préservation des commits ; données/scripts avant-après conservés hors dépôt. Un ancien processus orphelin d’une fixture privée de notification a aussi été identifié par HOME/XDG/offscreen/cwd exacts et arrêté via pidfd/SIGTERM, sans toucher l’instance réelle.
#24 seul restant : phaseA statique relue, phaseB en cours dans
quickshell-clarity, basée exactement sur le code fonctionnel intégré. Renommages de membres/IDs ambigus, expressions locales et diagnostics catégorisés ; aucun changement de traduction/protocole/erreurs/activité voulu. Géométrie éventuelle soumise à preuve comparative séparée, pas de chmod ou suppression globale. Revue finale, gate parent et nettoyage du label dédiés encore à faire.Clôture corrigée après rejet de l’audit final : le test à deux vrais QScreen virtuels déplaçait une fenêtre QtQuick contenant HomePage, sans SystemPanel/PanelWindow/LayerShell. Il ne couvre donc pas le critère explicite « deux écrans, déplacement du panneau ». Le code final90f0cd8, les26suites, les mesures mémoire/latence et revues restent valides, mais l’acceptation est incomplète. #22 et #11 sont rouverts ; le suivi de chantier a été rétabli sur leurs véritables descendants. Prochaine étape : panneau complet dans un compositeur privé headless à deux sorties, services/données factices, aucune connexion/commande à la session hôte. Si impossible sans action sensible, demander à Mathieu une validation ou modification explicite du critère ; aucune acceptation n’est inférée.
Validation complémentaire terminée après l’autorisation explicite « oui, ok » de Mathieu : vraiSystemPanel/PanelWindow/LayerShell avec ses4pages de production90f0cd8, données/services factices, déplacé sur les2sorties existantes A→B→A puis bord droit/haut, fermé surB et rouvert surA. Ce n’est plus le simple QQuickWindow de la preuve initiale.18instantanés passent ; le compositeur identifie lePID du test sur chaque sortie et les protocoles Wayland confirment surfaces layer-shell, output-enter, configuration, entrée clavier et focus-grab. Rotation/logicalité/barre réservée prises en compte. Les contrôles/membres/états/focus et navigation sont conservés, données hors-ligne/absentes/restaurées couvertes ; le faux oracle de mauvaise sortie échoue comme attendu.
Le panneau a été visible 5,48secondes, puis fermé ; son client/watchdog sont sortis, état des sorties et surfaces hôtes identique, focus d’origine revenu automatiquement sans dispatch de restauration. Aucune commande de backend/appareil/session/presse-papiers, aucun receive de contenu ni capture d’écran. HOME/XDG/bus/audio privés, seule la connexion d’affichage autorisée au compositeur réel.39dépendancesQML/JS et90blobs de source inchangés ; checkout/instance habituels non avancés/rechargés.
Revue indépendante des preuves606a0f9a puis09dba92e/b4449195 : objection initiale couverte, notesP2 de classification des warnings et recette de reproduction corrigées/clarifiées, aucun constat restant. Le premier essai n’avait pas affiché de surface : nom synthétiqueIPCshow réservé, erreurCLI109 ; cause démontrée, puis tentative fraîche explicitement autorisée avec fixtureopenPanel etfauxchampmetrics.error corrigés. Aucun correctifQt/compositeur/panneau de production ou changement de runner.
**Pas de prétention warning-free :**4messages précis d’indisponibilité attendue des backends privés et21warningsQtWaylandtextinputdisableSurface sont conservés ; l’allowlist exacte rejette tout autreWARN/ERROR/FATAL/CRITICAL, zéro erreur QMLtype/référence/binding/assignment. La navigation/focus native est vérifiée malgré ces transitoires ; aucune correction universelle de textinput revendiquée.
Preuves privées :
/tmp/authorized-full-panel-retry.oJzxXYh7/(18snapshots natifs/états, sources/hashes, logs protocolaires FILTRÉS) ; vérification parent etallowlist dans/tmp/pi-quickshell-tickets.7b0ahn/. Ne pas publier les logs Wayland bruts (descriptions matériel). La recette de relecture est l’inspection des fichiers retenus et le nouveau classificateur à sortie séparée ; ne pas relancer le driver live ni l’ancienverify-evidence (queries/proc/écritures) sans nouvelle autorisation/revue. Ce dernier reste historique.Le critère « deux écrans, déplacement du panneau, fermeture/réouverture et données absentes » est maintenant accepté sur cette preuve complète. Le code et le gate26/26 au90f0cd8 restent inchangés ; aucune nouvelle mesure de ressources n’a été substituée.