echo "SUPABASE_URL=$SUPABASE_URL"; echo "SUPABASE_PROJECT_REF=$SUPABASE_PROJECT_REF"; echo "SUPABASE_DB_URL=$SUPABASE_DB_URL" | sed 's/:[^:@]*@/:****@/'; echo "has ANON_KEY: ${SUPABASE_ANON_KEY:+yes}"; echo "has SERVICE_ROLE_KEY: ${SUPABASE_SERVICE_ROLE_KEY:+yes}"; echo "has DB_PASSWORD: ${SUPABASE_DB_PASSWORD:+yes}"
which psql curl jqSUPABASE_URL=https://<ref>.supabase.co SUPABASE_PROJECT_REF=<ref> SUPABASE_DB_URL=postgresql://postgres.<ref>:<redacted>@aws-0-us-east-1.pooler.supabase.com:5432/postgres has ANON_KEY: yes has SERVICE_ROLE_KEY: yes has DB_PASSWORD: yes /usr/bin/psql /usr/bin/curl /usr/bin/jq
psql "$SUPABASE_DB_URL" -c "\d public.documents" echo "---" psql "$SUPABASE_DB_URL" -c "select id, title, embedding_json from public.documents order by id;"
Table "public.documents"
Column | Type | Collation | Nullable | Default
----------------+---------+-----------+----------+---------
id | integer | | not null |
title | text | | not null |
embedding_json | jsonb | | not null |
Indexes:
"documents_pkey" PRIMARY KEY, btree (id)
---
id | title | embedding_json
----+---------+------------------
1 | alpha | [10, 0.5, 0, 0]
2 | bravo | [0.9, 0.3, 0, 0]
3 | delta | [20, 60, 0, 0]
4 | echo | [0, 1, 0, 0]
5 | foxtrot | [-5, 0.1, 0, 0]
6 | golf | [0.1, 0.1, 3, 4]
(6 rows)
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
-- 1) Set up pgvector extension
create extension if not exists vector;
-- 2) Add embedding vector(4) column, populated from embedding_json
alter table public.documents
add column if not exists embedding vector(4);
update public.documents
set embedding = (
select array_to_vector
from (select array(select jsonb_array_elements_text(embedding_json)::float4) as arr) t,
lateral (select t.arr::float4[]::vector(4) as array_to_vector) v
)
where embedding is null;
-- simpler direct cast works too; verify
select id, title, embedding_json, embedding from public.documents order by id;
SQL
CREATE EXTENSION ALTER TABLE UPDATE 6 id | title | embedding_json | embedding ----+---------+------------------+--------------- 1 | alpha | [10, 0.5, 0, 0] | [10,0.5,0,0] 2 | bravo | [0.9, 0.3, 0, 0] | [0.9,0.3,0,0] 3 | delta | [20, 60, 0, 0] | [20,60,0,0] 4 | echo | [0, 1, 0, 0] | [0,1,0,0] 5 | foxtrot | [-5, 0.1, 0, 0] | [-5,0.1,0,0] 6 | golf | [0.1, 0.1, 3, 4] | [0.1,0.1,3,4] (6 rows)
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
-- enforce not null now that it's populated
alter table public.documents
alter column embedding set not null;
-- 3) HNSW index using cosine distance
drop index if exists documents_embedding_hnsw_cosine_idx;
create index documents_embedding_hnsw_cosine_idx
on public.documents
using hnsw (embedding vector_cosine_ops);
-- 4) match_documents RPC function
create or replace function public.match_documents(
query_embedding vector(4),
match_count int
)
returns table (
id int,
title text,
distance float8
)
language sql
stable
as $$
select
d.id,
d.title,
(d.embedding <=> query_embedding)::float8 as distance
from public.documents d
order by d.embedding <=> query_embedding
limit match_count;
$$;
-- Grant execute to anon/authenticated roles so PostgREST can expose it via RPC
grant execute on function public.match_documents(vector, int) to anon, authenticated, service_role;
SQL
ALTER TABLE DROP INDEX CREATE INDEX CREATE FUNCTION GRANT
NOTICE: index "documents_embedding_hnsw_cosine_idx" does not exist, skipping
psql "$SUPABASE_DB_URL" -c "\d public.documents"
echo "---function---"
psql "$SUPABASE_DB_URL" -c "\df public.match_documents"
echo "---sanity sql test---"
psql "$SUPABASE_DB_URL" -c "select * from public.match_documents('[10,0.5,0,0]'::vector(4), 3);"
echo "---reload postgrest schema cache---"
psql "$SUPABASE_DB_URL" -c "select pg_notify('pgrst', 'reload schema');" Table "public.documents"
Column | Type | Collation | Nullable | Default
----------------+-----------+-----------+----------+---------
id | integer | | not null |
title | text | | not null |
embedding_json | jsonb | | not null |
embedding | vector(4) | | not null |
Indexes:
"documents_pkey" PRIMARY KEY, btree (id)
"documents_embedding_hnsw_cosine_idx" hnsw (embedding vector_cosine_ops)
---function---
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+-----------------+----------------------------------------------------------+---------------------------------------------+------
public | match_documents | TABLE(id integer, title text, distance double precision) | query_embedding vector, match_count integer | func
(1 row)
---sanity sql test---
id | title | distance
----+-------+--------------------
1 | alpha | 0
2 | bravo | 0.0367087035723488
3 | delta | 0.636791795933452
(3 rows)
---reload postgrest schema cache---
pg_notify
-----------
(1 row)
sleep 2
curl -s -X POST "$SUPABASE_URL/rest/v1/rpc/match_documents" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"query_embedding": [10, 0.5, 0, 0], "match_count": 3}' | jq .[
{
"id": 1,
"title": "alpha",
"distance": 0
},
{
"id": 2,
"title": "bravo",
"distance": 0.0367087035723488
},
{
"id": 3,
"title": "delta",
"distance": 0.636791795933452
}
]
echo "Query near 'golf' [0.1,0.1,3,4]:"
curl -s -X POST "$SUPABASE_URL/rest/v1/rpc/match_documents" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"query_embedding": [0.1, 0.1, 3, 4], "match_count": 6}' | jq .
echo "Query near 'echo' [0,1,0,0]:"
curl -s -X POST "$SUPABASE_URL/rest/v1/rpc/match_documents" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"query_embedding": [0, 1, 0, 0], "match_count": 4}' | jq .
echo "Query near 'foxtrot' [-5,0.1,0,0]:"
curl -s -X POST "$SUPABASE_URL/rest/v1/rpc/match_documents" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"query_embedding": [-5, 0.1, 0, 0], "match_count": 3}' | jq .
echo "Confirm index usage (query plan):"
psql "$SUPABASE_DB_URL" -c "explain select * from public.documents order by embedding <=> '[10,0.5,0,0]'::vector(4) limit 3;"Query near 'golf' [0.1,0.1,3,4]:
[
{
"id": 6,
"title": "golf",
"distance": 0
},
{
"id": 3,
"title": "delta",
"distance": 0.974711892170972
},
{
"id": 2,
"title": "bravo",
"distance": 0.974711892401252
},
{
"id": 1,
"title": "alpha",
"distance": 0.979034586516748
},
{
"id": 4,
"title": "echo",
"distance": 0.98000799508818
},
{
"id": 5,
"title": "foxtrot",
"distance": 1.01958824755548
}
]
Query near 'echo' [0,1,0,0]:
[
{
"id": 4,
"title": "echo",
"distance": 0
},
{
"id": 3,
"title": "delta",
"distance": 0.0513167019494862
},
{
"id": 2,
"title": "bravo",
"distance": 0.683772217228812
},
{
"id": 1,
"title": "alpha",
"distance": 0.950062383056108
}
]
Query near 'foxtrot' [-5,0.1,0,0]:
[
{
"id": 5,
"title": "foxtrot",
"distance": 0
},
{
"id": 4,
"title": "echo",
"distance": 0.980003998593934
},
{
"id": 6,
"title": "golf",
"distance": 1.01958824755548
}
]
Confirm index usage (query plan):
QUERY PLAN
-----------------------------------------------------------------------
Limit (cost=1.15..1.16 rows=3 width=108)
-> Sort (cost=1.15..1.17 rows=6 width=108)
Sort Key: ((embedding <=> '[10,0.5,0,0]'::vector(4)))
-> Seq Scan on documents (cost=0.00..1.07 rows=6 width=108)
(4 rows)
7 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