Loading issues
The sidebar can show you as signed in (name, avatar) while every backend call goes out as a guest. Seen by Rían in Paradaux: the switcher listed only Paradaux (the one public workspace), and the member-only links (Triage, Analytics, Archive) were missing. In the database Rían owns Paradaux, Private and Taskl.ie.
A session that can no longer prove who you are should end and drop you to the signed-out state. It shouldn't linger as a guest that looks signed in.
SessionProvider, and auth() in a server component cannot set cookies. Every render after the first 5 minutes refreshes from the login-time refresh token, and the result is thrown away. getViewer and getActorToken call auth() separately, so that's two or more Keycloak round trips per render, each of which can fail on its own.session-refresh.ts keeps the session but drops the access token. getViewer still returns the person, getActorToken returns null, and the backend sees a guest.middleware.ts (Node runtime) that runs the Auth.js session check once per request. It saves the refreshed cookie on the response and passes it on to this request's render. A rejected refresh clears the cookie, so you're properly signed out.getViewer returns null when the session has no access token, so "signed in but tokenless" can't render as signed in.
PR open: https://github.com/ParadauxIO/taskl.ie/pull/170
A Node-runtime middleware now saves refreshed sessions and forwards them into the render. A rejected refresh clears the cookie, and a tokenless session reads as signed out. Unit tests run the real middleware. A live check against the prod realm with a revoked session gave a cleared cookie and a redirect to /login. Lint, typecheck and unit tests pass.