38266d96f8
Phase B — FestipodDataContext lit désormais via la surface SDK `watchShape` (binding `useSyncExternalStore` dans `useShapeQuery`) + adaptateurs Fp (`shapeAdapters.ts`), au lieu de sa machinerie maison. Applique rule_app-uses-sdk-surface-only : l'app ne consomme que la surface SDK. Supprimé : `readEntities.ts`, `subscribeDocs`+`bumpRead`+`readTick`+`readDocKey`, le listing manuel (`publicDocs`/`protectedDocs`/`registerDoc` pour la lecture, `readDiscoveredEvents`), et les commentaires raisonnant sur le hang ORM. Gardé découplé : `listMyEntityDocs(owner,'public')` → `ownedEventIds` pour le seul matérialiseur propriétaire. Auto-seed : chronomètre 3 s → gate `isSuccess` (seed uniquement si synchronisé ET vide) — fix du re-seed « First time… » au 3ᵉ connect. Mode démo inchangé. Non-régression VÉRIFIÉE (broker réel, wallet frais) : inscription (1 passed), isolation « identité fraîche ne voit pas » (re-run local, 5 steps passed), compteur dérivé/Q4 (1 passed). tsc propre, build OK. Résiduel PRÉ-EXISTANT (pas causé par ce refactor, vérifié par stash sur baseline) : - reconnexion « relit ses propres données » → RE-@wip : défaut cold-read de l'index de scope PUBLIC côté lib (une page fraîche relit vide) — prochaine cible. - un @AUTH « données pas rechargées » (timing loadFire-and-forget vs step 30 s). Doctrine : rule_app-uses-sdk-surface-only « déviation résolue ». Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>