Kontext

Backend ověřil Supabase token a pak tu identitu na hranici procesu zahodil. Každá RLS policy čte auth.uid(), kterou na téhle cestě nikdo nenastavoval, takže jedinou hranicí mezi uživateli bylo where user_id v kódu repozitářů. Dnes se to zavřelo.

Co udělala továrna

  • Dostala přihlášeného uživatele až na databázové spojení. Caller scope otevře transakci, nastaví v ní JWT claims a roli authenticated, a interceptor odmítne otevřít spojení, ke kterému nikdo scope neotevřel.
  • Vystavila obrazovky časových kategorií a endpointy notifikačních zařízení přes autentizované HTTP.
  • Nechala Na tento den držet jen ad hoc položky a nabídla zbývající rezervace dne přímo v mezerách osy.
  • Dala design systému posuvník s dvouvrstvou dráhou a textový stupeň pro obě dráhy, s kontrastem počítaným v testu.
  • Udělala z navigace celek — NavigationBar nad položkou — a hlavičku obrazovky vzala jako vstup shellu.
  • Nechala odmítnutou editaci na obrazovce tam, kde ji formulář dřív zahazoval.
  • Vyhodila z rolling vrstev stav, který stejně nikdy nikdo nezapsal.
  • Založila task ze schváleného kandidáta: component index publikuje camelCase jména tokenů špatně.

Co jsem udělal já

  • Zrecenzoval caller scope proti živé databázi, ne proti tomu, co o sobě PR tvrdí: 26 tabulek vlastní postgres a force RLS je vypnuté, všech 91 policies je psaných to authenticated, CI hlásí Skipped: 0. Jedna vada zůstává — request.jwt.claim.sub vyhrává v coalesce, a přitom ji nikdo nenastavuje.
  • Smazal z aplikace experimentální CRUD.
  • Dal na board nedosažitelnou půlku backendu a propustil P1 drafty, kterým už nic nebránilo.
  • Zapsal do glosáře rozhodnutí o rolling vrstvách a návycích.
  • Opravil start odpojeného bota tak, aby opustil session job object — aktualizace desktopu ho teď nezabije s sebou.
  • Dal deníku vlastní skill.
  • Zmapoval migraci Smart Diary do projektu Lifalign. Cílová topologie je hotová, otevřená zůstává otázka, do které databáze půjdou testovací zápisy.

Poznámky

  • Dvanáct z osmnácti mergnutých pull requestů přišlo z boardu beze mě.
  • V migraci je past na pořadí: každý merge do main nasadí dev backend proti databázi, ve které za chvíli bude skutečná historie, takže dev databáze musí existovat dřív než první běh migrace.