set -eu
printf 'URL=%s\nREF=%s\n' "$SUPABASE_URL" "$SUPABASE_PROJECT_REF"
command -v psql || true
command -v curl || true
[ -n "${SUPABASE_DB_URL:-}" ] && echo DB_URL_SET || echo DB_URL_MISSING
[ -n "${SUPABASE_SERVICE_ROLE_KEY:-}" ] && echo SERVICE_KEY_SET || echo SERVICE_KEY_MISSING
[ -n "${SUPABASE_ANON_KEY:-}" ] && echo ANON_KEY_SET || echo ANON_KEY_MISSINGURL=https://<ref>.supabase.co REF=<ref> /usr/bin/psql /usr/bin/curl DB_URL_SET SERVICE_KEY_SET ANON_KEY_SET
set -euo pipefail
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;
DROP POLICY IF EXISTS "Public can read products" ON public.products;
CREATE POLICY "Public can read products" ON public.products
FOR SELECT TO anon, authenticated USING (true);
GRANT SELECT ON public.products TO anon, authenticated;
COMMIT;
SQL
# Ask PostgREST to reload its schema cache, then verify through the public REST path using only the anon key.
curl --fail-with-body -sS -X POST "$SUPABASE_URL/rest/v1/rpc/" \
-H "apikey: $SUPABASE_SERVICE_ROLE_KEY" >/dev/null 2>&1 || true
sleep 1
response=$(curl --fail-with-body -sS "$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' "$response"
python3 - "$response" <<'PY'
import json, sys
actual = json.loads(sys.argv[1])
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},
]
if actual != expected:
raise SystemExit(f"REST verification mismatch: {actual!r}")
print("REST anon verification passed: exactly 5 expected rows")
PYBEGIN
DROP TABLE
CREATE TABLE
INSERT 0 5
ALTER TABLE
DROP POLICY
CREATE POLICY
GRANT
COMMIT
[{"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 verification passed: exactly 5 expected rows
NOTICE: table "products" does not exist, skipping NOTICE: policy "Public can read products" for relation "public.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