fix: render-optimiste + timing for widget toggle handlers (#71) #73
No reviewers
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/simpl-liste#73
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-71-widget-expand-perf"
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?
Fixes #71
Resume
Le widget Android mettait plusieurs secondes a afficher les sous-taches sur tap expand. Cause confirmee/suspectee = cold start du service headless Android (irreductible cote JS) + ordre des operations dans le handler qui faisait attendre l'utilisateur sur l'ecriture AsyncStorage avant de rendre.
Changements
TOGGLE_*:renderWithState/forceWidgetRefreshest appele AVANTawait setWidgetState. L'utilisateur voit le widget mis a jour immediatement ; la persistance continue en arriere-plan (mais reste awaitee pour la coherence du headless task lifecycle).setWidgetStatedans try/catch. Si l'ecriture echoue, le prochain handler call relira l'etat anterieur depuis AsyncStorage et re-rendra a partir de la — l'UI s'auto-corrige a l'interaction suivante.timed()helper, gate__DEV__) : log chaque etape (getState, render, setState, db) + un total par handler vers logcat. Lecture :Hors scope
Test plan
npm run androidet installer sur appareil reeladb logcat -s ReactNativeJS | grep '\[widget\]'pour collecter les mesures de chaque etapeVerdict : APPROVE
Resume
Fix cible et bien execute : render-optimiste avant persistance, debounce ramene a 600ms (raisonnable), instrumentation timing gate sur
__DEV__, et persistState en best-effort avec auto-healing au prochain interaction. Code propre, commentaires expliquent les choix non-evidents (notamment pourquoiawait persistStateest garde malgre le pattern "optimiste").Points positifs
TOGGLE_*— l'utilisateur voit le changement immediatementtimed()helper bien gate sur__DEV__: zero overhead en productionpersistState()swallow les erreurs avec un commentaire clair sur la strategie d'auto-healingfix: ...)Suggestions non-bloquantes
Test de regression : la checklist
pr-reviewrecommande un test de regression pour lestype:bug. Le code headless Android est difficile a tester unit (mock AsyncStorage + requestWidgetUpdate), donc OK de skip, mais le PR body devrait idealement mentionner explicitement pourquoi pas de test (ou referencer une issue de suivi pour ajouter du tooling de test widget).Race condition theorique sur tap rapide multi-tache : si l'utilisateur tape rapidement sur TOGGLE_COMPLETE de 2 taches differentes, les 2 handlers peuvent lire l'etat initial avant qu'aucun ait persiste. Le 2e ecrit ecrasera la 1ere modification. Probablement seriallise par Android cote headless service, mais a verifier dans les mesures Phase 3 (logcat). Si confirme comme un probleme, l'option B (split state) du PR body est la bonne reponse.
Coherence du commentaire TOGGLE_SUBTASK : le commentaire dit "Run before persist for immediate visual feedback" mais en pratique
forceWidgetRefreshest awaite avantpersistState. Donc l'attente d'execution du fan-out aux 3 widgets bloque encore avant la persistance. Le "avant" est vrai dans l'ordre, mais le "immediat" depend du temps que prendrequestWidgetUpdatex 3. A re-mesurer en Phase 3 pour confirmer que ce n'est pas la le bottleneck.Le diff GitHub/Forgejo affiche
spec-simpl-liste-web.mdetpackage-lock.json: ces fichiers sont deja sur master a la merge-base (9cf5074). Le diff effectif est uniquementwidgetTaskHandler.ts(52+/13-). Pas une issue de la PR, juste une note pour le reviewer humain qui pourrait etre confus.Test plan a executer (rappel du PR body)
Merge OK quand le test plan est valide sur appareil reel.