echo "URL: $SUPABASE_URL" && echo "REF: $SUPABASE_PROJECT_REF" && echo "DB URL: ${SUPABASE_DB_URL:0:50}..."URL: https://<ref>.supabase.co REF: <ref> DB URL: postgresql://postgres.<ref>:792118c...
curl -s "$SUPABASE_URL/rest/v1/notes?apikey=$SUPABASE_ANON_KEY" | head -50
[{"id":1,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"Groceries","body":"milk, eggs, coffee"},
{"id":2,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"Call plumber","body":"kitchen sink leaks"},
{"id":3,"user_id":"53aba67f-b49b-4f8f-99cf-4fc6b30a6905","title":"Gym plan","body":"push pull legs"},
{"id":4,"user_id":"53aba67f-b49b-4f8f-99cf-4fc6b30a6905","title":"Trip ideas","body":"mountains in october"}]export PGPASSWORD="$SUPABASE_DB_PASSWORD" && psql "$SUPABASE_DB_URL" -c "\d public.notes"
Table "public.notes"
Column | Type | Collation | Nullable | Default
---------+--------+-----------+----------+----------------------------------
id | bigint | | not null | generated by default as identity
user_id | uuid | | not null |
title | text | | not null |
body | text | | not null | ''::text
Indexes:
"notes_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"notes_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE
export PGPASSWORD="$SUPABASE_DB_PASSWORD" && psql "$SUPABASE_DB_URL" -c "SELECT tablename, rowsecurity FROM pg_tables WHERE schemaname='public' AND tablename='notes';"
tablename | rowsecurity -----------+------------- notes | f (1 row)
export PGPASSWORD="$SUPABASE_DB_PASSWORD" && psql "$SUPABASE_DB_URL" -c "SELECT policyname, permissive, roles, cmd, qual, with_check FROM pg_policies WHERE schemaname='public' AND tablename='notes';"
policyname | permissive | roles | cmd | qual | with_check ------------+------------+-------+-----+------+------------ (0 rows)
export PGPASSWORD="$SUPABASE_DB_PASSWORD" && psql "$SUPABASE_DB_URL" -c "SELECT id, email FROM auth.users WHERE email IN ('alice@cari.dev', 'bob@cari.dev');"id | email --------------------------------------+---------------- a1c48b81-7169-4183-969c-c16c36b07f61 | alice@cari.dev 53aba67f-b49b-4f8f-99cf-4fc6b30a6905 | bob@cari.dev (2 rows)
export PGPASSWORD="$SUPABASE_DB_PASSWORD" && psql "$SUPABASE_DB_URL" <<'SQL' -- Enable RLS on the notes table ALTER TABLE public.notes ENABLE ROW LEVEL SECURITY; -- Drop any existing policies (clean slate) DROP POLICY IF EXISTS "notes_select_own" ON public.notes; DROP POLICY IF EXISTS "notes_insert_own" ON public.notes; DROP POLICY IF EXISTS "notes_update_own" ON public.notes; DROP POLICY IF EXISTS "notes_delete_own" ON public.notes; -- SELECT: authenticated users can read only their own rows CREATE POLICY "notes_select_own" ON public.notes FOR SELECT TO authenticated USING (user_id = auth.uid()); -- INSERT: authenticated users can insert only with their own user_id CREATE POLICY "notes_insert_own" ON public.notes FOR INSERT TO authenticated WITH CHECK (user_id = auth.uid()); -- UPDATE: authenticated users can update only their own rows CREATE POLICY "notes_update_own" ON public.notes FOR UPDATE TO authenticated USING (user_id = auth.uid()) WITH CHECK (user_id = auth.uid()); -- DELETE: authenticated users can delete only their own rows CREATE POLICY "notes_delete_own" ON public.notes FOR DELETE TO authenticated USING (user_id = auth.uid()); -- Verify SELECT tablename, rowsecurity FROM pg_tables WHERE schemaname='public' AND tablename='notes'; SELECT policyname, permissive, roles, cmd, qual, with_check FROM pg_policies WHERE schemaname='public' AND tablename='notes'; SQL
ALTER TABLE
DROP POLICY
DROP POLICY
DROP POLICY
DROP POLICY
CREATE POLICY
CREATE POLICY
CREATE POLICY
CREATE POLICY
tablename | rowsecurity
-----------+-------------
notes | t
(1 row)
policyname | permissive | roles | cmd | qual | with_check
------------------+------------+-----------------+--------+------------------------+------------------------
notes_select_own | PERMISSIVE | {authenticated} | SELECT | (user_id = auth.uid()) |
notes_insert_own | PERMISSIVE | {authenticated} | INSERT | | (user_id = auth.uid())
notes_update_own | PERMISSIVE | {authenticated} | UPDATE | (user_id = auth.uid()) | (user_id = auth.uid())
notes_delete_own | PERMISSIVE | {authenticated} | DELETE | (user_id = auth.uid()) |
(4 rows)
NOTICE: policy "notes_select_own" for relation "public.notes" does not exist, skipping NOTICE: policy "notes_insert_own" for relation "public.notes" does not exist, skipping NOTICE: policy "notes_update_own" for relation "public.notes" does not exist, skipping NOTICE: policy "notes_delete_own" for relation "public.notes" does not exist, skipping
# Test 1: Anonymous access — should see nothing
echo "=== TEST 1: Anonymous select (should get empty array) ==="
curl -s "$SUPABASE_URL/rest/v1/notes?apikey=$SUPABASE_ANON_KEY"
echo
echo "=== TEST 2: Anonymous insert attempt (should fail) ==="
curl -s -X POST "$SUPABASE_URL/rest/v1/notes" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"anon test","body":"should fail"}'
echo=== TEST 1: Anonymous select (should get empty array) ===
[]
=== TEST 2: Anonymous insert attempt (should fail) ===
{"code":"42501","details":null,"hint":null,"message":"new row violates row-level security policy for table \"notes\""}
# Get Alice's token
echo "=== Getting Alice's token ==="
ALICE_RESP=$(curl -s -X POST "$SUPABASE_URL/auth/v1/token?grant_type=password" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"alice@cari.dev","password":"Passw0rd-alice-42"}')
ALICE_TOKEN=$(echo "$ALICE_RESP" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4)
echo "Alice token: ${ALICE_TOKEN:0:20}..."
# Get Bob's token
echo "=== Getting Bob's token ==="
BOB_RESP=$(curl -s -X POST "$SUPABASE_URL/auth/v1/token?grant_type=password" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"bob@cari.dev","password":"Passw0rd-bob-58"}')
BOB_TOKEN=$(echo "$BOB_RESP" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4)
echo "Bob token: ${BOB_TOKEN:0:20}..."
# Save tokens for later use
echo "$ALICE_TOKEN" > /tmp/alice_token
echo "$BOB_TOKEN" > /tmp/bob_token=== Getting Alice's token === Alice token: eyJhbGciOiJFUzI1NiIs... === Getting Bob's token === Bob token: eyJhbGciOiJFUzI1NiIs...
ALICE_TOKEN=$(cat /tmp/alice_token) BOB_TOKEN=$(cat /tmp/bob_token) echo "=== TEST 3: Alice sees her own notes ===" curl -s "$SUPABASE_URL/rest/v1/notes" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $ALICE_TOKEN" \ | python3 -m json.tool echo
=== TEST 3: Alice sees her own notes ===
[
{
"id": 1,
"user_id": "a1c48b81-7169-4183-969c-c16c36b07f61",
"title": "Groceries",
"body": "milk, eggs, coffee"
},
{
"id": 2,
"user_id": "a1c48b81-7169-4183-969c-c16c36b07f61",
"title": "Call plumber",
"body": "kitchen sink leaks"
}
]
ALICE_TOKEN=$(cat /tmp/alice_token)
BOB_TOKEN=$(cat /tmp/bob_token)
echo "=== TEST 4: Bob sees his own notes ==="
curl -s "$SUPABASE_URL/rest/v1/notes" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $BOB_TOKEN" \
| python3 -m json.tool
echo
echo "=== TEST 5: Alice tries to INSERT with Bob's user_id (should fail) ==="
curl -s -X POST "$SUPABASE_URL/rest/v1/notes" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $ALICE_TOKEN" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"user_id":"53aba67f-b49b-4f8f-99cf-4fc6b30a6905","title":"hack","body":"should fail"}'
echo=== TEST 4: Bob sees his own notes ===
[
{
"id": 3,
"user_id": "53aba67f-b49b-4f8f-99cf-4fc6b30a6905",
"title": "Gym plan",
"body": "push pull legs"
},
{
"id": 4,
"user_id": "53aba67f-b49b-4f8f-99cf-4fc6b30a6905",
"title": "Trip ideas",
"body": "mountains in october"
}
]
=== TEST 5: Alice tries to INSERT with Bob's user_id (should fail) ===
{"code":"42501","details":null,"hint":null,"message":"new row violates row-level security policy for table \"notes\""}
ALICE_TOKEN=$(cat /tmp/alice_token)
BOB_TOKEN=$(cat /tmp/bob_token)
echo "=== TEST 6: Alice INSERTs a legit note with her own user_id ==="
curl -s -X POST "$SUPABASE_URL/rest/v1/notes" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $ALICE_TOKEN" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"New note","body":"this is mine"}'
echo
echo "=== TEST 7: Alice UPDATES her own note ==="
curl -s -X PATCH "$SUPABASE_URL/rest/v1/notes?id=eq.1" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $ALICE_TOKEN" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"title":"Groceries updated"}'
echo
echo "=== TEST 8: Alice tries to UPDATE Bob's note (should fail) ==="
curl -s -X PATCH "$SUPABASE_URL/rest/v1/notes?id=eq.3" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $ALICE_TOKEN" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"title":"Hacked"}'
echo
echo "=== TEST 9: Alice tries to DELETE Bob's note (should fail) ==="
curl -s -X DELETE "$SUPABASE_URL/rest/v1/notes?id=eq.3" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $ALICE_TOKEN" \
-H "Prefer: return=representation"
echo=== TEST 6: Alice INSERTs a legit note with her own user_id ===
[{"id":7,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"New note","body":"this is mine"}]
=== TEST 7: Alice UPDATES her own note ===
[{"id":1,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"Groceries updated","body":"milk, eggs, coffee"}]
=== TEST 8: Alice tries to UPDATE Bob's note (should fail) ===
[]
=== TEST 9: Alice tries to DELETE Bob's note (should fail) ===
[]
ALICE_TOKEN=$(cat /tmp/alice_token) BOB_TOKEN=$(cat /tmp/bob_token) echo "=== TEST 10: Alice DELETEs her own newly created note (id=7) ===" curl -s -X DELETE "$SUPABASE_URL/rest/v1/notes?id=eq.7" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $ALICE_TOKEN" \ -H "Prefer: return=representation" echo echo "=== TEST 11: Bob DELETEs his own note (id=4) ===" curl -s -X DELETE "$SUPABASE_URL/rest/v1/notes?id=eq.4" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $BOB_TOKEN" \ -H "Prefer: return=representation" echo echo "=== TEST 12: Bob sees his notes after delete ===" curl -s "$SUPABASE_URL/rest/v1/notes" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $BOB_TOKEN" echo echo "=== TEST 13: Alice sees her notes after all operations ===" curl -s "$SUPABASE_URL/rest/v1/notes" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $ALICE_TOKEN" echo
=== TEST 10: Alice DELETEs her own newly created note (id=7) ===
[{"id":7,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"New note","body":"this is mine"}]
=== TEST 11: Bob DELETEs his own note (id=4) ===
[{"id":4,"user_id":"53aba67f-b49b-4f8f-99cf-4fc6b30a6905","title":"Trip ideas","body":"mountains in october"}]
=== TEST 12: Bob sees his notes after delete ===
[{"id":3,"user_id":"53aba67f-b49b-4f8f-99cf-4fc6b30a6905","title":"Gym plan","body":"push pull legs"}]
=== TEST 13: Alice sees her notes after all operations ===
[{"id":2,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"Call plumber","body":"kitchen sink leaks"},
{"id":1,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"Groceries updated","body":"milk, eggs, coffee"}]
ALICE_TOKEN=$(cat /tmp/alice_token)
BOB_TOKEN=$(cat /tmp/bob_token)
echo "=== Restoring Alice's note 1 title back to 'Groceries' ==="
curl -s -X PATCH "$SUPABASE_URL/rest/v1/notes?id=eq.1" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $ALICE_TOKEN" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"title":"Groceries"}'
echo
echo "=== Restoring Bob's note 4 (Trip ideas) ==="
curl -s -X POST "$SUPABASE_URL/rest/v1/notes" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $BOB_TOKEN" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"user_id":"53aba67f-b49b-4f8f-99cf-4fc6b30a6905","title":"Trip ideas","body":"mountains in october"}'
echo=== Restoring Alice's note 1 title back to 'Groceries' ===
[{"id":1,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"Groceries","body":"milk, eggs, coffee"}]
=== Restoring Bob's note 4 (Trip ideas) ===
[{"id":8,"user_id":"53aba67f-b49b-4f8f-99cf-4fc6b30a6905","title":"Trip ideas","body":"mountains in october"}]
ALICE_TOKEN=$(cat /tmp/alice_token) BOB_TOKEN=$(cat /tmp/bob_token) echo "=== Final state: Alice's notes ===" curl -s "$SUPABASE_URL/rest/v1/notes" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $ALICE_TOKEN" \ | python3 -m json.tool echo echo "=== Final state: Bob's notes ===" curl -s "$SUPABASE_URL/rest/v1/notes" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $BOB_TOKEN" \ | python3 -m json.tool echo echo "=== Final state: Anonymous ===" curl -s "$SUPABASE_URL/rest/v1/notes?apikey=$SUPABASE_ANON_KEY" echo
=== Final state: Alice's notes ===
[
{
"id": 2,
"user_id": "a1c48b81-7169-4183-969c-c16c36b07f61",
"title": "Call plumber",
"body": "kitchen sink leaks"
},
{
"id": 1,
"user_id": "a1c48b81-7169-4183-969c-c16c36b07f61",
"title": "Groceries",
"body": "milk, eggs, coffee"
}
]
=== Final state: Bob's notes ===
[
{
"id": 3,
"user_id": "53aba67f-b49b-4f8f-99cf-4fc6b30a6905",
"title": "Gym plan",
"body": "push pull legs"
},
{
"id": 8,
"user_id": "53aba67f-b49b-4f8f-99cf-4fc6b30a6905",
"title": "Trip ideas",
"body": "mountains in october"
}
]
=== Final state: Anonymous ===
[]
ALICE_TOKEN=$(cat /tmp/alice_token)
echo "=== Edge: Alice INSERTs without user_id (should fail or use default) ==="
curl -s -X POST "$SUPABASE_URL/rest/v1/notes" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $ALICE_TOKEN" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"title":"no user_id","body":"test"}'
echo
echo "=== Edge: Alice INSERTs with user_id omitted but via select= trick ==="
curl -s -X POST "$SUPABASE_URL/rest/v1/notes?select=id,user_id,title" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $ALICE_TOKEN" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"title":"another try","body":"test2","user_id":"a1c48b81-7169-4183-969c-c16c36b07f61"}'
echo=== Edge: Alice INSERTs without user_id (should fail or use default) ===
{"code":"42501","details":null,"hint":null,"message":"new row violates row-level security policy for table \"notes\""}
=== Edge: Alice INSERTs with user_id omitted but via select= trick ===
[{"id":10,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"another try"}]
ALICE_TOKEN=$(cat /tmp/alice_token) echo "=== Cleanup: Delete test note id=10 ===" curl -s -X DELETE "$SUPABASE_URL/rest/v1/notes?id=eq.10" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $ALICE_TOKEN" \ -H "Prefer: return=representation" echo echo echo "=== Final verification: All 4 original notes present and correct ===" curl -s "$SUPABASE_URL/rest/v1/notes" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $ALICE_TOKEN" echo curl -s "$SUPABASE_URL/rest/v1/notes" \ -H "apikey: $SUPABASE_ANON_KEY" \ -H "Authorization: Bearer $BOB_TOKEN" echo
=== Cleanup: Delete test note id=10 ===
[{"id":10,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"another try","body":"test2"}]
=== Final verification: All 4 original notes present and correct ===
[{"id":2,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"Call plumber","body":"kitchen sink leaks"},
{"id":1,"user_id":"a1c48b81-7169-4183-969c-c16c36b07f61","title":"Groceries","body":"milk, eggs, coffee"}]
{"code":"PGRST301","details":null,"hint":null,"message":"Empty JWT is sent in Authorization header"}
# Get fresh token for Bob
BOB_RESP=$(curl -s -X POST "$SUPABASE_URL/auth/v1/token?grant_type=password" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"bob@cari.dev","password":"Passw0rd-bob-58"}')
BOB_TOKEN=$(echo "$BOB_RESP" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4)
echo "=== Bob's notes ==="
curl -s "$SUPABASE_URL/rest/v1/notes" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $BOB_TOKEN" \
| python3 -m json.tool=== Bob's notes ===
[
{
"id": 3,
"user_id": "53aba67f-b49b-4f8f-99cf-4fc6b30a6905",
"title": "Gym plan",
"body": "push pull legs"
},
{
"id": 8,
"user_id": "53aba67f-b49b-4f8f-99cf-4fc6b30a6905",
"title": "Trip ideas",
"body": "mountains in october"
}
]
# Get fresh token for Bob
BOB_RESP=$(curl -s -X POST "$SUPABASE_URL/auth/v1/token?grant_type=password" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"bob@cari.dev","password":"Passw0rd-bob-58"}')
BOB_TOKEN=$(echo "$BOB_RESP" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4)
# Fix: delete the id=8 row and re-insert with id=4 via direct SQL
export PGPASSWORD="$SUPABASE_DB_PASSWORD"
psql "$SUPABASE_DB_URL" <<'SQL'
-- Delete the recreated row and re-insert with original id=4
DELETE FROM public.notes WHERE id = 8;
INSERT INTO public.notes (id, user_id, title, body) VALUES (4, '53aba67f-b49b-4f8f-99cf-4fc6b30a6905', 'Trip ideas', 'mountains in october');
-- Fix the sequence
SELECT setval('public.notes_id_seq', (SELECT max(id) FROM public.notes));
SQL
echo "=== Verify Bob's notes ==="
curl -s "$SUPABASE_URL/rest/v1/notes" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $BOB_TOKEN" \
| python3 -m json.toolDELETE 1
INSERT 0 1
setval
--------
4
(1 row)
=== Verify Bob's notes ===
[
{
"id": 3,
"user_id": "53aba67f-b49b-4f8f-99cf-4fc6b30a6905",
"title": "Gym plan",
"body": "push pull legs"
},
{
"id": 4,
"user_id": "53aba67f-b49b-4f8f-99cf-4fc6b30a6905",
"title": "Trip ideas",
"body": "mountains in october"
}
]
# Final full verification export PGPASSWORD="$SUPABASE_DB_PASSWORD" psql "$SUPABASE_DB_URL" -c "SELECT * FROM public.notes ORDER BY id;" echo echo "=== RLS Policies ===" psql "$SUPABASE_DB_URL" -c "SELECT policyname, permissive, roles, cmd, qual, with_check FROM pg_policies WHERE schemaname='public' AND tablename='notes' ORDER BY cmd;" echo echo "=== RLS Enabled ===" psql "$SUPABASE_DB_URL" -c "SELECT tablename, rowsecurity FROM pg_tables WHERE schemaname='public' AND tablename='notes';"
id | user_id | title | body
----+--------------------------------------+--------------+----------------------
1 | a1c48b81-7169-4183-969c-c16c36b07f61 | Groceries | milk, eggs, coffee
2 | a1c48b81-7169-4183-969c-c16c36b07f61 | Call plumber | kitchen sink leaks
3 | 53aba67f-b49b-4f8f-99cf-4fc6b30a6905 | Gym plan | push pull legs
4 | 53aba67f-b49b-4f8f-99cf-4fc6b30a6905 | Trip ideas | mountains in october
(4 rows)
=== RLS Policies ===
policyname | permissive | roles | cmd | qual | with_check
------------------+------------+-----------------+--------+------------------------+------------------------
notes_delete_own | PERMISSIVE | {authenticated} | DELETE | (user_id = auth.uid()) |
notes_insert_own | PERMISSIVE | {authenticated} | INSERT | | (user_id = auth.uid())
notes_select_own | PERMISSIVE | {authenticated} | SELECT | (user_id = auth.uid()) |
notes_update_own | PERMISSIVE | {authenticated} | UPDATE | (user_id = auth.uid()) | (user_id = auth.uid())
(4 rows)
=== RLS Enabled ===
tablename | rowsecurity
-----------+-------------
notes | t
(1 row)
2 earlier narration turn(s) are in the raw transcript.
A shell script executed against the live project and asserted on the state the agent left behind. No model judged another model.
Raw transcript · Task definition and verifier · Every attempt