jsonb shared_with bug: .contains() was serializing the wrong format
Two call sites in the backend were passing a plain JS array to PostgREST's `.contains()` on a `jsonb` column. PostgreSQL rejected every request that hit the shared-with code path with a 500 error.
PostgrestFilterBuilder.contains(column, value) serializes a JS array as a PostgreSQL array literal ({a,b}). That's correct for text[] columns. For jsonb, PostgreSQL needs a JSON array string - ["user@example.com"]. The mismatch meant every GET /projects call that hit the shared-with branch returned 500: invalid input syntax for type json.
The fix is JSON.stringify([userEmail]) at both call sites: backend/src/lib/access.ts:138 and backend/src/routes/projects.ts:34. A third call site in tabular.ts:107 was already doing this correctly - the pattern existed, these two locations just weren't following it.
Commit 653d055. One-line change in each file, no behavioral side effects beyond making the broken path return 200.
Spotted something wrong? Or know the PR text has fresher detail than the writeup above?