set -e
printf 'url=%s\nref=%s\n' "$SUPABASE_URL" "$SUPABASE_PROJECT_REF"
command -v psql || true
python3 - <<'PY'
import os
for k in ['SUPABASE_URL','SUPABASE_PROJECT_REF','SUPABASE_ANON_KEY','SUPABASE_SERVICE_ROLE_KEY','SUPABASE_DB_URL','SUPABASE_DB_PASSWORD']:
v=os.getenv(k,'')
print(k, 'set' if v else 'MISSING', ('len='+str(len(v)) if v else ''))
PYurl=https://<ref>.supabase.co ref=<ref> /usr/bin/psql SUPABASE_URL set len=40 SUPABASE_PROJECT_REF set len=20 SUPABASE_ANON_KEY set len=208 SUPABASE_SERVICE_ROLE_KEY set len=219 SUPABASE_DB_URL set len=141 SUPABASE_DB_PASSWORD set len=48
set -euo pipefail
export PGPASSWORD="$SUPABASE_DB_PASSWORD"
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
BEGIN;
DROP TABLE IF EXISTS public.products;
CREATE TABLE public.products (
sku text PRIMARY KEY,
name text NOT NULL,
price_cents integer NOT NULL,
stock integer NOT NULL DEFAULT 0
);
INSERT INTO public.products (sku, name, price_cents, stock) VALUES
('CARI-001', 'Anvil S', 1999, 12),
('CARI-002', 'Anvil M', 2999, 7),
('CARI-003', 'Anvil L', 4999, 3),
('CARI-004', 'Rope 30m', 1250, 40),
('CARI-005', 'Pulley', 780, 0);
ALTER TABLE public.products ENABLE ROW LEVEL SECURITY;
GRANT USAGE ON SCHEMA public TO anon, authenticated;
GRANT SELECT ON TABLE public.products TO anon, authenticated;
CREATE POLICY "Public catalog read" ON public.products
FOR SELECT TO anon, authenticated USING (true);
COMMIT;
SQL
# Verify database contents, then verify REST with only anon key.
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -Atc "SELECT sku || '|' || name || '|' || price_cents || '|' || stock FROM public.products ORDER BY sku;"
resp=$(curl --fail-with-body --silent --show-error \
"$SUPABASE_URL/rest/v1/products?select=sku,name,price_cents,stock&order=sku" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY")
printf '%s\n' "$resp"
python3 - "$resp" <<'PY'
import json, sys
expected = [
{'sku':'CARI-001','name':'Anvil S','price_cents':1999,'stock':12},
{'sku':'CARI-002','name':'Anvil M','price_cents':2999,'stock':7},
{'sku':'CARI-003','name':'Anvil L','price_cents':4999,'stock':3},
{'sku':'CARI-004','name':'Rope 30m','price_cents':1250,'stock':40},
{'sku':'CARI-005','name':'Pulley','price_cents':780,'stock':0},
]
actual=json.loads(sys.argv[1])
assert actual == expected, (actual, expected)
print('REST anon-key verification: PASS (exactly 5 rows)')
PYBEGIN
DROP TABLE
CREATE TABLE
INSERT 0 5
ALTER TABLE
GRANT
GRANT
CREATE POLICY
COMMIT
CARI-001|Anvil S|1999|12
CARI-002|Anvil M|2999|7
CARI-003|Anvil L|4999|3
CARI-004|Rope 30m|1250|40
CARI-005|Pulley|780|0
[{"sku":"CARI-001","name":"Anvil S","price_cents":1999,"stock":12},
{"sku":"CARI-002","name":"Anvil M","price_cents":2999,"stock":7},
{"sku":"CARI-003","name":"Anvil L","price_cents":4999,"stock":3},
{"sku":"CARI-004","name":"Rope 30m","price_cents":1250,"stock":40},
{"sku":"CARI-005","name":"Pulley","price_cents":780,"stock":0}]
REST anon-key verification: PASS (exactly 5 rows)
NOTICE: table "products" does not exist, skipping
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