env | grep -i supabase | sed 's/\(KEY=.\{12\}\).*/\1.../' | sed 's/\(PASSWORD=.\{4\}\).*/\1.../'SUPABASE_DB_PASSWORD=na3b... SUPABASE_DB_URL=<redacted:SUPABASE_DB_URL> SUPABASE_URL=https://<ref>.supabase.co SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJI... SUPABASE_PROJECT_REF=<ref> SUPABASE_ANON_KEY=eyJhbGciOiJI...
which pg_dump psql; pg_dump --version; psql --version
/usr/bin/pg_dump /usr/bin/psql pg_dump (PostgreSQL) 18.4 (Debian 18.4-1.pgdg12+1) psql (PostgreSQL) 18.4 (Debian 18.4-1.pgdg12+1)
cd /tmp && psql "$SUPABASE_DB_URL" -c "select version();" -c "select current_user, current_database();" 2>&1 | head -30
version ------------------------------------------------------------------------------ PostgreSQL 17.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 15.2.0, 64-bit (1 row) current_user | current_database --------------+------------------ postgres | postgres (1 row)
cd /tmp && psql "$SUPABASE_DB_URL" -c "\d public.payments" -c "select count(*) from public.payments;" 2>&1 | head -60
Table "public.payments"
Column | Type | Collation | Nullable | Default
--------------+--------------------------+-----------+----------+---------
id | integer | | not null |
ref_code | text | | not null |
payer | text | | not null |
amount_cents | integer | | not null |
paid_at | timestamp with time zone | | not null |
Indexes:
"payments_pkey" PRIMARY KEY, btree (id)
count
-------
80
(1 row)
cd /tmp && psql "$SUPABASE_DB_URL" -c "select prosrc from pg_proc where proname='run_incident';" 2>&1 | head -80
prosrc
---------------------------------------------------------------------------------------------
+
begin +
update public.payments set amount_cents = 0, payer = 'CORRUPTED'; +
delete from public.payments where id % 3 = 0; +
insert into public.incident_log(details) values ('payments corrupted by incident drill');+
return 'incident executed'; +
end +
(1 row)
cd /tmp && psql "$SUPABASE_DB_URL" -c "\d public.incident_log" -c "select * from public.incident_log;" 2>&1 | head -40
Table "public.incident_log"
Column | Type | Collation | Nullable | Default
---------+--------------------------+-----------+----------+----------------------------------
id | bigint | | not null | generated by default as identity
ran_at | timestamp with time zone | | not null | now()
details | text | | not null |
Indexes:
"incident_log_pkey" PRIMARY KEY, btree (id)
id | ran_at | details
----+--------+---------
(0 rows)
cd /tmp && psql "$SUPABASE_DB_URL" -c " select conname, conrelid::regclass as tbl, confrelid::regclass as reftbl, pg_get_constraintdef(oid) from pg_constraint where confrelid='public.payments'::regclass or conrelid='public.payments'::regclass;" -c " select tgname, tgisinternal from pg_trigger where tgrelid='public.payments'::regclass;" 2>&1 | head -40
conname | tbl | reftbl | pg_get_constraintdef ---------------+----------+--------+---------------------- payments_pkey | payments | - | PRIMARY KEY (id) (1 row) tgname | tgisinternal --------+-------------- (0 rows)
cd /tmp && psql "$SUPABASE_DB_URL" -c "select relrowsecurity, relreplident from pg_class where oid='public.payments'::regclass;" -c "select tablename from pg_tables where schemaname='public';" -c "select pg_get_serial_sequence('public.payments','id');" 2>&1 | head -40relrowsecurity | relreplident ----------------+-------------- f | d (1 row) tablename -------------- payments incident_log (2 rows) pg_get_serial_sequence ------------------------ (1 row)
mkdir -p /tmp/drill && cd /tmp/drill && pg_dump "$SUPABASE_DB_URL" --table=public.payments --format=plain --no-owner --no-privileges --file=payments_backup.sql 2>&1; echo "exit=$?"; ls -l
exit=0 total 8 -rw-r--r-- 1 root root 6370 Jul 25 05:56 payments_backup.sql
cd /tmp/drill && psql "$SUPABASE_DB_URL" -c "\copy (select * from public.payments order by id) to 'payments_backup.csv' with (format csv, header true)" 2>&1; wc -l payments_backup.csv
COPY 80 81 payments_backup.csv
cd /tmp/drill && grep -c '^' payments_backup.sql; echo "--- COPY data lines in dump:"; awk '/^COPY public.payments/,/^\\\.$/' payments_backup.sql | grep -vc -e '^COPY' -e '^\\\.$'
140 --- COPY data lines in dump: 80
cd /tmp/drill && psql "$SUPABASE_DB_URL" -t -A -c " select md5(string_agg(row_data, E'\n' order by row_data)) from ( select id||'|'||ref_code||'|'||payer||'|'||amount_cents||'|'||extract(epoch from paid_at) as row_data from public.payments) s;" | tee pre_incident_checksum.txt
ac0da0b8332a7e7722fecef268f329eb
cd /tmp/drill && psql "$SUPABASE_DB_URL" -c "select count(*) n, sum(amount_cents) total, min(id) mn, max(id) mx, count(distinct payer) payers from public.payments;" | tee pre_incident_stats.txt
n | total | mn | mx | payers ----+----------+----+----+-------- 80 | 20804707 | 1 | 80 | 80 (1 row)
cd /tmp/drill && head -40 payments_backup.sql
--
-- PostgreSQL database dump
--
\restrict Ke2yZQD7c7UY6IPeR8yY7AegUbwnuzwDUeN3ugBL6gpo6kpwX4c5I6ElDCt2sIU
-- Dumped from database version 17.6
-- Dumped by pg_dump version 18.4 (Debian 18.4-1.pgdg12+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET transaction_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: payments; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.payments (
id integer NOT NULL,
ref_code text NOT NULL,
payer text NOT NULL,
amount_cents integer NOT NULL,
paid_at timestamp with time zone NOT NULL
);
--
-- Data for Name: payments; Type: TABLE DATA; Schema: public; Owner: -
cd /tmp/drill && sed 's/^\\restrict.*$//; s/^\\unrestrict.*$//' payments_backup.sql > payments_backup_clean.sql && sed "s/public\.payments/drill_verify.payments/g; s|set_config('search_path', ''|set_config('search_path', 'drill_verify'|" payments_backup_clean.sql > verify_restore.sql && grep -n "drill_verify" verify_restore.sql | head16:SELECT pg_catalog.set_config('search_path', 'drill_verify', false);
30:CREATE TABLE drill_verify.payments (
43:COPY drill_verify.payments (id, ref_code, payer, amount_cents, paid_at) FROM stdin;
131:ALTER TABLE ONLY drill_verify.payments
cd /tmp/drill && psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -c "create schema if not exists drill_verify;" -f verify_restore.sql 2>&1 | tail -20; echo "exit=$?"
SET SET SET SET SET SET set_config -------------- drill_verify (1 row) SET SET SET SET SET SET CREATE TABLE COPY 80 ALTER TABLE exit=0
cd /tmp/drill && psql "$SUPABASE_DB_URL" -t -A -c " select md5(string_agg(row_data, E'\n' order by row_data)) from ( select id||'|'||ref_code||'|'||payer||'|'||amount_cents||'|'||extract(epoch from paid_at) as row_data from drill_verify.payments) s;"
ac0da0b8332a7e7722fecef268f329eb
cd /tmp/drill && cp payments_backup.sql payments_backup.sql.bak2 && cp payments_backup.csv payments_backup.csv.bak2 && md5sum payments_backup.sql payments_backup.csv *.bak2 && ls -l
f334b408f0c517d5e8bb13e0f9dd817a payments_backup.sql 1b7c54585c13ade74b92b80f9be55319 payments_backup.csv 1b7c54585c13ade74b92b80f9be55319 payments_backup.csv.bak2 f334b408f0c517d5e8bb13e0f9dd817a payments_backup.sql.bak2 total 56 -rw-r--r-- 1 root root 5054 Jul 25 05:56 payments_backup.csv -rw-r--r-- 1 root root 5054 Jul 25 05:57 payments_backup.csv.bak2 -rw-r--r-- 1 root root 6370 Jul 25 05:56 payments_backup.sql -rw-r--r-- 1 root root 6370 Jul 25 05:57 payments_backup.sql.bak2 -rw-r--r-- 1 root root 6222 Jul 25 05:57 payments_backup_clean.sql -rw-r--r-- 1 root root 33 Jul 25 05:56 pre_incident_checksum.txt -rw-r--r-- 1 root root 113 Jul 25 05:56 pre_incident_stats.txt -rw-r--r-- 1 root root 6252 Jul 25 05:57 verify_restore.sql
cd /tmp/drill && psql "$SUPABASE_DB_URL" -c "SELECT public.run_incident();" 2>&1
run_incident ------------------- incident executed (1 row)
cd /tmp/drill && psql "$SUPABASE_DB_URL" -c "select count(*) n, sum(amount_cents) total, count(distinct payer) payers from public.payments;" -c "select * from public.incident_log;" 2>&1
n | total | payers ----+-------+-------- 54 | 0 | 1 (1 row) id | ran_at | details ----+-------------------------------+-------------------------------------- 1 | 2026-07-25 05:57:24.969046+00 | payments corrupted by incident drill (1 row)
cd /tmp/drill && cat > restore.sql <<'EOF' \set ON_ERROR_STOP on BEGIN; -- Scope: public.payments ONLY. incident_log is deliberately untouched. TRUNCATE TABLE public.payments; \copy public.payments (id, ref_code, payer, amount_cents, paid_at) from 'payments_backup.csv' with (format csv, header true) COMMIT; EOF psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -f restore.sql 2>&1
BEGIN TRUNCATE TABLE COPY 80 COMMIT
cd /tmp/drill && RESTORED=$(psql "$SUPABASE_DB_URL" -t -A -c " select md5(string_agg(row_data, E'\n' order by row_data)) from ( select id||'|'||ref_code||'|'||payer||'|'||amount_cents||'|'||extract(epoch from paid_at) as row_data from public.payments) s;"); PRE=$(cat pre_incident_checksum.txt); echo "pre-incident: $PRE"; echo "restored : $RESTORED"; [ "$PRE" = "$RESTORED" ] && echo "MATCH - zero loss" || echo "MISMATCH"
pre-incident: ac0da0b8332a7e7722fecef268f329eb restored : ac0da0b8332a7e7722fecef268f329eb MATCH - zero loss
cd /tmp/drill && psql "$SUPABASE_DB_URL" -c "select count(*) n, sum(amount_cents) total, min(id) mn, max(id) mx, count(distinct payer) payers from public.payments;" -c "select count(*) as corrupted_rows_remaining from public.payments where payer='CORRUPTED' or amount_cents=0;" 2>&1; echo "=== pre-incident stats for comparison ==="; cat pre_incident_stats.txt
n | total | mn | mx | payers
----+----------+----+----+--------
80 | 20804707 | 1 | 80 | 80
(1 row)
corrupted_rows_remaining
--------------------------
0
(1 row)
=== pre-incident stats for comparison ===
n | total | mn | mx | payers
----+----------+----+----+--------
80 | 20804707 | 1 | 80 | 80
(1 row)
cd /tmp/drill && psql "$SUPABASE_DB_URL" -c "select * from public.incident_log;" -c "select count(*) as incident_log_rows from public.incident_log;" 2>&1
id | ran_at | details
----+-------------------------------+--------------------------------------
1 | 2026-07-25 05:57:24.969046+00 | payments corrupted by incident drill
(1 row)
incident_log_rows
-------------------
1
(1 row)
cd /tmp/drill && psql "$SUPABASE_DB_URL" -c " select 'in_backup_not_in_live' as diff, * from drill_verify.payments except all select 'in_backup_not_in_live', * from public.payments;" -c " select 'in_live_not_in_backup' as diff, * from public.payments except all select 'in_live_not_in_backup', * from drill_verify.payments;" 2>&1
diff | id | ref_code | payer | amount_cents | paid_at ------+----+----------+-------+--------------+--------- (0 rows) diff | id | ref_code | payer | amount_cents | paid_at ------+----+----------+-------+--------------+--------- (0 rows)
14 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